programing

C를 호출하는 기능은 x86 어셈블리 언어에서 나옵니다.

cafebook 2023. 10. 25. 23:43
반응형

C를 호출하는 기능은 x86 어셈블리 언어에서 나옵니다.

조립 언어 프로그램에서 호출할 수 있도록 GCC를 사용하여 C 기능에서 조립 언어 기능을 생성할 수 있습니까?저는 gcc가 C를 기계 코드(어셈블리 언어로 쉽게 분해할 수 있는)로 컴파일한다는 것을 알고 있고, C에서 인라인 어셈블리 언어 기능이 가능하다는 것은 이미 알고 있지만, 어셈블리 언어 프로그램에서 C 기능을 호출하는 방법은 아직 찾지 못했는데, 이는 기본적으로 이와 반대입니다.

여기서는 x86 조립 프로그램에서 C 함수를 인라인화하려고 합니다.인라인이 불가능하다면 어셈블리어 프로그램에서 C 함수를 호출할 수 있는 다른 방법이 있습니까?

.686p
.model flat,stdcall
.stack 2048

.data

.code
start:

invoke  ExitProcess, 0

printSomething PROC ;now I'm attempting to inline a C function here
    void printSomething(thingToPrint){
        printf("This is a C function that I want to invoke from an assembly language program.");
        printf("There must be some way to do this - is it possible somehow?");
    }
printSomething ENDP

end start

저는 여기서 기억을 더듬는 것이기 때문에 세부적인 부분이 한두 개 정도는 살짝 어긋날 수도 있습니다.하지만 당신이 올바른 방향으로 나아가게 하기에 충분할 것 같습니다.

일상적인 프린트인 Something()이 어셈블리 파일에 정의되어 있지 않음을 GCC 어셈블리에 알려야 합니다.C'에서는 extern 키워드를 사용합니다.조립의 경우 .glob을 사용해야 합니다.

.globl printSomething

GCC와 다른 어셈블러를 사용하는 경우 키워드가 다를 수 있습니다.

다음으로 중요한 질문은 '어떻게 논쟁을 통과시킬 수 있을까?' 입니다.이는 프로세서와 OS에 따라 크게 달라집니다.질문의 제목이 x86을 나타내므로, 16비트 또는 32비트 모드와 표준 x86 ABI를 사용한다고 가정하겠습니다(Windows와 Linux가 다른 x86-64와는 반대).C 파라미터는 스택에 밀어넣어 호출된 루틴으로 전달됩니다.그들은 오른쪽에서 왼쪽으로 포개져 있습니다.

따라서,

printSomething (arg1, arg2, arg3, arg4);

…로 번역됩니다.

pushl arg4
pushl arg3
pushl arg2
pushl arg1
call  printSomething
addl  $0x10, %esp

당신은 아마 스스로에게 이것이 무엇인지 물을 것입니다.

addl $0x10, %esp

? 32비트 인수 4개를 루틴(스택에) 전달했습니다.루틴에서는 이러한 인수를 예상할 수 있지만, 해당 인수를 스택에서 제거할 책임은 없습니다.그것은 발신자에게 책임이 있습니다.따라서 루틴에서 돌아온 후 스택 포인터를 조정하여 이전에 스택에 적용했던 4개의 32비트 인수를 폐기합니다.

위의 예에서는 우리가 32비트 모드로 동작하고 있다고 가정하고 있습니다.16비트 모드라면...

pushw arg4
pushw arg3
pushw arg2
pushw arg1
call  printSomething
addw  $0x8, %sp

예제에서 printSomething()은 하나의 인수만 사용하고 예제에서는 4개의 인수를 사용했습니다.필요에 따라 제 예를 조정해 주십시오.

마지막 단계에서는 C 파일과 어셈블리 파일을 모두 개체 파일로 컴파일하고 개체 파일을 연결한 다음 실행해야 합니다.

도움이 되었으면 좋겠습니다.

x86_64의 경우 몇 가지 추가 사항을 주의해야 합니다.

언급URL : https://stackoverflow.com/questions/16255608/calling-c-functions-from-x86-assembly-language

반응형