int i; int j = 100; int k = 0; int main() { i = 1; j = 2; k = i + j; return 0; }
GCC
.file "foo.c" .globl _j .data .align 4 _j: .long 100 .globl _k .bss .align 4 _k: .space 4 .def ___main; .scl 2; .type 32; .endef .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax sall $4, %eax movl %eax, -4(%ebp) movl -4(%ebp), %eax call __alloca call ___main movl $1, _i # i = 1 movl $2, _j # j = 1 movl _j, %eax # j -> アキュムレータ addl _i, %eax # i を アキュムレータに加算 movl %eax, _k # アキュムレータ -> k movl $0, %eax leave ret .comm _i, 16 # 4
VC
; 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 _j PUBLIC _k _DATA SEGMENT COMM _i:DWORD _DATA ENDS _BSS SEGMENT _k DD 01H DUP (?) _BSS ENDS _DATA SEGMENT _j DD 064H _DATA ENDS PUBLIC _main ; Function compile flags: /Odtp _TEXT SEGMENT _main PROC ; File c:\program files\microsoft visual studio 9.0\vc\foo.c ; Line 5 push ebp mov ebp, esp ; Line 6 mov DWORD PTR _i, 1 ; i = 1 ; Line 7 mov DWORD PTR _j, 2 ; j = 2 ; Line 9 mov eax, DWORD PTR _i ; i -> アキュムレータ add eax, DWORD PTR _j ; j を アキュムレータに加算 mov DWORD PTR _k, eax ; アキュムレータ -> k ; Line 11 xor eax, eax ; Line 12 pop ebp ret 0 _main ENDP _TEXT ENDS END
計算やっているところは比較的分かりやすいなぁ。gccの前半の処理はスタックに何か確保しているんだろうけど、どういう処理かイマイチわからない…。
えーっと、jが0以外で初期化してるからdataセグメントで、iが未初期化、kが0で初期化だからbssセグメントかな…VCではiはdataセグメントに存在するように見えるけど。commの意味がよく分からないなぁ。共有する領域?