int add(int a, int b) { int c; c = a + b; return c; } int main() { int n; n = add(1, 2); return n; }
; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01 TITLE C:\Program Files\Microsoft Visual Studio 9.0\VC\foo.c .686P .XMM include listing.inc .model flat INCLUDELIB LIBCMT INCLUDELIB OLDNAMES PUBLIC _add ; Function compile flags: /Odtp _TEXT SEGMENT _c$ = -4 ; size = 4 _a$ = 8 ; size = 4 _b$ = 12 ; size = 4 _add PROC ; File c:\program files\microsoft visual studio 9.0\vc\foo.c ; Line 1 push ebp mov ebp, esp push ecx ; Line 4 mov eax, DWORD PTR _a$[ebp] add eax, DWORD PTR _b$[ebp] mov DWORD PTR _c$[ebp], eax ; Line 6 mov eax, DWORD PTR _c$[ebp] ; Line 7 mov esp, ebp pop ebp ret 0 _add ENDP _TEXT ENDS PUBLIC _main ; Function compile flags: /Odtp _TEXT SEGMENT _n$ = -4 ; size = 4 _main PROC ; Line 9 push ebp mov ebp, esp push ecx ; Line 12 push 2 push 1 call _add add esp, 8 mov DWORD PTR _n$[ebp], eax ; Line 14 mov eax, DWORD PTR _n$[ebp] ; Line 15 mov esp, ebp pop ebp ret 0 _main ENDP _TEXT ENDS END
戻り先アドレスのスタックへの保存・復元とかは暗黙的に行われてるのかなぁ?
_?$はebpからのオフセットか。引数がebpより上で、局所変数はebpより下、と。この辺はテキストと似た感じだなー。スタックの確保とかは_?$の宣言(?)があれば自動で行われるのかな?