関数のアセンブリコード!!!(及びその関数形パラメータ伝達方式、関数内部の局所変数格納方式)
3608 ワード
extern "C" void fun(int a, int b) {
int x = a;
int y = b;
int z = x + y;
return;
}
int main() {
fun(5, 10);
return 0;
}
C , :
1. 8086CPU ,bsp ,esp
2. ebp + x , ebp - x ,
3. , , !
C , :
1. :
push 10 ; 0000000aH
push 5
call _fun@8
2. :
push ebp ;
mov ebp, esp ; ebp
sub esp, 12 ; 0000000cH
; int x = a;
mov eax, DWORD PTR _a$[ebp]
mov DWORD PTR _x$[ebp], eax
; int y = b;
mov ecx, DWORD PTR _b$[ebp]
mov DWORD PTR _y$[ebp], ecx
; int z = x + y;
mov edx, DWORD PTR _x$[ebp]
add edx, DWORD PTR _y$[ebp]
mov DWORD PTR _z$[ebp], edx
mov esp, ebp
pop ebp
ret 0
_x _y ?? !
_a$ = 8
_b$ = 12
_x$ = -4
_y$ = -8
_z$ = -12
。
, X,Y
; int x = a;
mov eax, DWORD PTR [ebp + 8]; +4
mov DWORD PTR [ebp - 4], eax
; int y = b;
mov ecx, DWORD PTR [ebp + 12]
mov DWORD PTR [ebp - 8], ecx
; int z = x + y;
mov edx, DWORD PTR [ebp - 4]
add edx, DWORD PTR [ebp - 8]
mov DWORD PTR [ebp - 12], edx