関数のアセンブリコード!!!(及びその関数形パラメータ伝達方式、関数内部の局所変数格納方式)

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