簡単な出力

VCとgccアセンブラを出力してみる。

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の意味がよく分からないなぁ。共有する領域?