コンパイルを途中で止める

コンパイルを途中で止めてアセンブラのコードを得る。
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をそうしているのはなんか意味があるんやろか。


そろそろアセンブラの中身に入る準備ができたような気がするし、
無駄にアセンブラを濫用したものを作ってみる必要があるなぁ。