2014-06-22 2 views
-1

내가 알기로, 매개 변수가 C에서 함수 호출로 전달되면 호출 수신자는 첫 번째 매개 변수를 [ebp+8]에서 찾을 수 있습니다.
eax을 통해 값을 반환하면 스택에서 올바른 매개 변수 값을 읽지 않아도됩니다.C에서 어셈블리 코드로 매개 변수를 전달할 수 없다

지금 당장 나는 C에서 호출 할 수있는 어셈블리 함수를 작성하려고하고 있으며 전달 된 동일한 값을 반환합니다.

다음 프로그램을 실행할 때 어떤 값이 myFunc에 전달 되더라도 콘솔에 number: 1을 인쇄합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?


assembly.s

section .text 
    global _myFunc 

    _myFunc: 
     mov eax, [ebp+8] 
     ret 

main.c를

#include <stdio.h> 

extern unsigned int myFunc(unsigned int somedata); 

int main() { 
    unsigned int i = myFunc(6); 
    printf("number: %i\n",i); 
    return 0; 
} 

나는 C 컴파일에 대한 코드 및 GCC를 조립하는 맥, NASM을 사용하고 있습니다.

메이크 당신이에서 읽고, 스택에 인수를 참조

macho32: 
    nasm -f macho32 assembly.s 
    gcc -m32 -o macho32 assembly.o main.c 
+1

,하지만 난 당신이 푸시 ebp'와'mov 인 EBP, esp' 전에'와 어셈블리 기능에'ebp'을 설정해야합니다 생각 함수 인수를 참조 할 수 있습니다. 그런 다음 돌아 오기 전에 '팝 립 (pop ebp)'해야합니다. http://unixwiz.net/techtips/win32-callconv-asm.html –

답변

1

[EBP + 오프셋] - 실제로 스택을 가리 키도록 EBP가 설정되었습니다?

push ebp  
mov ebp,esp 

그런 다음에야 스택 반환 주소 아래에, 그리고 전달 된 인수 아래의 스택 이전 내용을 EBP를 포인트 : 아니, 당신은 통상적으로 수행, 첫 번째는 그렇게해야합니다.

+0

그리고 돌아 가기 전에'pop ebp'을 잊지 마라. 아니면'leave'를 대안으로 사용할 수 있다고 생각한다. –

+0

나는 이것이 나를 위해 C 컴파일러에 의해 수행되었다고 생각했다. 고마워. –

+0

어셈블리에 오신 것을 환영합니다. –

1

먼저 esp을 저장하여 매개 변수에 액세스하려면 설정해야합니다. 섹션

http://www.nasm.us/doc/nasmdoc9.html

나를 위해

다음 작품

assembly.s

section .text 
    global myFunc:function 

    myFunc: 
    push ebp 
    mov ebp, esp 
    mov eax, [ebp+8] 
    mov esp, ebp 
    pop ebp 
     ret 

주 "9.1.2 함수 정의와 함수 호출"이이 설명되어 있습니다 .c

#include <stdio.h> 

extern unsigned int myFunc(unsigned int somedata); 

int main() { 
    unsigned int i = myFunc(6); 
    printf("number: %i\n",i); 
    return 0; 
} 

조립 & 컴파일

[email protected]:~$ nasm -f elf32 assembly.s 
[email protected]:~$ gcc -m32 assembly.o main.c 
[email protected]:~$ ./a.out 
number: 6 

내가 elf32을 사용 그래서 나는 리눅스 시스템에서입니다. Mac에서 macho32의 사용이 올 바릅니다.함수는 다음과 같이한다

+0

'mov esp, ebp'는 푸시되었지만 어셈블리 코드에 꽂혀 있지 않은 것을 잡는 것입니다. 맞습니까? 그렇지 않으면 esp는 어쨌든 이전과 같은 위치에 있어야합니다. –

+0

이것은 ESP 아래의 공간이 함수의 지역 변수에 사용되며 ESP에서 필요한 공간의 양을 뺀 것으로 예약되고 나중에 함수의 끝에서 ESP가 그 이전 값으로 복원되기 때문에 수행됩니다 –

1

,

_myFunc: 

    push ebp     ; setup ebp as frame pointer 
    mov  ebp, esp 

    mov  eax, [ebp + 8] 

    leave       ; mov esp,ebp/pop ebp 

    ret 

협약은 스택에 EBP을 저장하고 그것을 가리 키도록해야 그렇게, 매개 변수에 액세스 할 수 EBP을 사용하는 것입니다 새로운 스택 상단 함수 출구에서 ebpesp을 복원해야합니다. 으로 남겨 둡니다. NASM에서

C의 호출 규칙 지원에 도움을 줄 수있는 매크로 패키지, c32.mak이,이,이 매크로는 , 인수, PROCENDPROC 있습니다. 코드가 같아야 이러한 매크로를 사용 , 조금 내 요소 중

proc _myfunc 
%$i arg 

    mov  eax, [ebp + %$i] 

endproc 
관련 문제