コンパイルを途中で止める
コンパイルを途中で止めてアセンブラのコードを得る。
main.c
int sum(int a, int b) { return a+b; } int main() { return sum(1, 2); }
これを途中までコンパイルしてみる。
gcc-4.3(cygwin)
gasのコードを得る
$ gcc -s main.c $ cat main.s .file "main.c" .text .globl _sum .def _sum; .scl 2; .type 32; .endef _sum: pushl %ebp movl %esp, %ebp movl 12(%ebp), %edx movl 8(%ebp), %eax addl %edx, %eax popl %ebp ret .def ___main; .scl 2; .type 32; .endef .globl _main .def _main; .scl 2; .type 32; .endef _main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $20, %esp call ___main movl $2, 4(%esp) movl $1, (%esp) call _sum addl $20, %esp popl %ecx popl %ebp leal -4(%ecx), %esp ret
vc9
masmのコードを得る
> cl /Fa main.c > type main.asm ; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01 TITLE H:\work\as\func\main.c .686P .XMM include listing.inc .model flat INCLUDELIB LIBCMT INCLUDELIB OLDNAMES PUBLIC _sum ; Function compile flags: /Odtp _TEXT SEGMENT _a$ = 8 ; size = 4 _b$ = 12 ; size = 4 _sum PROC ; File h:\work\as\func\main.c ; Line 2 push ebp mov ebp, esp ; Line 3 mov eax, DWORD PTR _a$[ebp] add eax, DWORD PTR _b$[ebp] ; Line 4 pop ebp ret 0 _sum ENDP _TEXT ENDS PUBLIC _main ; Function compile flags: /Odtp _TEXT SEGMENT _main PROC ; Line 7 push ebp mov ebp, esp ; Line 8 push 2 push 1 call _sum add esp, 8 ; Line 9 pop ebp ret 0 _main ENDP _TEXT ENDS END
両方ともsum関数に入ったらebpをスタックにプッシュして
espをebpにコピーしている。
その後eax(gasはedxも)を使って足し算と。
ebpをそうしているのはなんか意味があるんやろか。
そろそろアセンブラの中身に入る準備ができたような気がするし、
無駄にアセンブラを濫用したものを作ってみる必要があるなぁ。