2013-12-16 1 views
1

어셈블러 코드를 이해하기위한 간단한 코드를 작성했습니다. 다음과 같습니다.메서드 호출 후 EBP 포인터 사용

int sum(int a, int b){ 
     int res = a+b; 
    } 

그리고 sum-function을 호출합니다. 그래서, 나는이 assemblercode을 얻을 내 질문에 지금 4

push ebp, 
    mov ebp, esp 
    sub esp, 16 
    mov eax, DWORD PTR[ebp + 12] 
    mov edx, DWORD PTR[ebp + 8] 
    add eax, edx 
    mov DWORD PTR [ebp-4], eax 
    mov eax, DWORD PTR [ebp-4] 
    leave 

와 (나는 단지 여기 sum 함수의 참여). 나는 그것에 대해 두 가지 질문을 가지고있다 : sum 매개 변수의 값, 예를 들어 sum (5,4)가 ebp + 12와 ebp + 8에서 스트로크되고 ebp-4에서 결과가 왜 생겨나는 이유가 있는가? 왜 우리가 그걸합니까? 항상 같거나 무작위로 선택합니까?

둘째, 우리가 가지고있는 부분 : 우리가 EAX 먼저 EBP-4 다음 결과를 할 이유

mov DWORD PTR [ebp-4], eax 
    mov eax, DWORD PTR [ebp-4] 

우리가 기능을 중단 전에 다시? 이유가 있습니까?

+0

당신에게 확답을 줄 수 있기를, 그리고 당신이 사용하고있는 컴파일러에게하도록 요청하고 싶습니다 하나가있다. – Rastikan

+0

어떤 OS와 어떤 컴파일러입니까? – nrz

+0

함수를'int'로 선언했지만 아무 것도 반환하지 않았습니다. –

답변

2

이것은 일반적으로 x86 시스템에서 스택 프레임을 만드는 방법입니다. 호출자가이 변환됩니다

... 각 항목이 스택으로 푸시됩니다으로

push b 
push a 
call sum 

는, 스택은 아래로 성장한다. 즉, 스택 포인터 레지스터는 4 바이트 (32 비트 모드)만큼 감소되고 항목은 스택 포인터 레지스터가 가리키는 메모리 위치에 복사됩니다.

'call'명령이 내려졌으며 이제는 호출 된 루틴이 시작되었습니다. 우리는 지역 변수와 물건에 대한 공간을 개척 한 후 우리는 우리의 매개 변수에 액세스하려면, 우리는 그러나

[esp + 4] - parameter 'a' 
[esp + 8] - parameter 'b' 

처럼 액세스 할 수 있습니다, 이것은 서투른 얻을 수 있습니다. 그래서 스택 포인터 레지스터와 스택베이스 포인터 레지스터를 사용합니다. 그러나 stackbase-pointer 레지스터는 이전 함수가 아닌 현재 프레임으로 설정해야합니다. 따라서 이전 스택을 스택에 저장하고 스택에있는 매개 변수의 오프셋을 수정 한 다음 현재 스택 포인터 레지스터를 스택베이스 포인터 레지스터에 복사합니다.

push ebp  ; save previous stackbase-pointer register 
mov ebp, esp ; ebp = esp 

모두 함께. 매개 변수는 stackbase 포인터 등록기를 사용하여 액세스

[ebp + 12] - parameter 'b' 
[ebp + 8] - parameter 'a' 
[ebp + 4] - return address 
[ebp + 0] - saved stackbase-pointer register 

출처 : 당신은 다음과 같은 키워드를 찾는하여이 정보를 찾을 수 있습니다 What is stack frame in assembly?

0

:

  • 호출 규칙
  • fastcall
  • stdcall

그 당시에는 EAX에서 16 비트 워드 매개 변수가 AX (및 32 비트 1)와 함께 전달되었습니다. 반환은 또한 AX/EAX 일 것입니다. 64 비트 매개 변수 (또는 EDX : EAX에있는 2 개의 매개 변수)가 반환됩니다.그것은 전형적인 FASTCALL 호출 규칙을위한 것입니다 (저는 오래된 파스칼이 사용하고 있다고 믿습니다)

이제는 C/C++ fastcall이 일반적으로 사용되지 않습니다 (어쩌면 휴대용이 아니기 때문에). 대부분이 스택을 사용했으며 EBP가 재생되는 곳입니다. 기본 스택 포인터 인 EBP -4, -8, -12는 매개 변수가 저장되어 반환되는 로컬 스택의 오프셋 포인터입니다. 여기

몇 가지 링크입니다 : http://en.wikibooks.org/wiki/X86_Disassembly/Calling_Convention_Examples http://en.wikipedia.org/wiki/X86_calling_conventions

관련 문제