関数呼び出し

[root@kingfisher01 tmp]# cat > a.c << EOF
> int func(int a1,int a2,int a3,int a4,int a5,int a6, int a7){ return a1+a2+a3+a4+a5+a6+a7; }
> int main() { int rc =  func(1,2,3,4,5,6,7); return rc; }
> [root@kingfisher01 tmp]#
[root@kingfisher01 tmp]# /opt/montavista/cee/devkit/arm/iwmmxt_le/bin/iwmmxt_le-gcc -g -fomit-frame-pointer -c a.c
[root@kingfisher01 tmp]# /opt/montavista/cee/devkit/arm/iwmmxt_le/bin/iwmmxt_le-objdump -d -S a.o

a.o:     ファイル形式 elf32-littlearm

セクション .text の逆アセンブル:

00000000 :
int func(int a1,int a2,int a3,int a4,int a5,int a6, int a7){ return a1+a2+a3+a4+a5+a6+a7; }
   0:   e24dd010        sub     sp, sp, #16     ; 0x10 ! 作業領域の確保:"sp"はスタックポインタ
   4:   e58d000c        str     r0, [sp, #12]          ! 引数をスタックから取り出す
   8:   e58d1008        str     r1, [sp, #8]
   c:   e58d2004        str     r2, [sp, #4]
  10:   e58d3000        str     r3, [sp]
  14:   e59d200c        ldr     r2, [sp, #12]
  18:   e59d3008        ldr     r3, [sp, #8]
  1c:   e0823003        add     r3, r2, r3              ! 足し算
  20:   e59d2004        ldr     r2, [sp, #4]
  24:   e0833002        add     r3, r3, r2
  28:   e59d2000        ldr     r2, [sp]
  2c:   e0833002        add     r3, r3, r2
  30:   e59d2010        ldr     r2, [sp, #16]
  34:   e0833002        add     r3, r3, r2
  38:   e59d2014        ldr     r2, [sp, #20]
  3c:   e0833002        add     r3, r3, r2
  40:   e59d2018        ldr     r2, [sp, #24]
  44:   e0833002        add     r3, r3, r2
  48:   e1a00003        mov     r0, r3                  ! 戻り値は"r3"に格納
  4c:   e28dd010        add     sp, sp, #16     ; 0x10  ! スタックポインタの復元
  50:   e1a0f00e        mov     pc, lr                  ! "return address"へ戻る

00000054 
: int main() { int rc = func(1,2,3,4,5,6,7); return rc; } 54: e92d4010 stmdb sp!, {r4, lr} ! "return address"をスタックに保存 58: e24dd010 sub sp, sp, #16 ; 0x10 ! 作業領域の確保:"sp"はスタックポインタ 5c: e3a03005 mov r3, #5 ; 0x5 ! 引数はスタック+レジスタ 60: e58d3000 str r3, [sp] 64: e3a03006 mov r3, #6 ; 0x6 68: e58d3004 str r3, [sp, #4] 6c: e3a03007 mov r3, #7 ; 0x7 70: e58d3008 str r3, [sp, #8] 74: e3a00001 mov r0, #1 ; 0x1 78: e3a01002 mov r1, #2 ; 0x2 7c: e3a02003 mov r2, #3 ; 0x3 80: e3a03004 mov r3, #4 ; 0x4 84: ebfffffe bl 0 ! 関数コール 88: e1a03000 mov r3, r0 ! 関数の戻り値"r"3 8c: e58d300c str r3, [sp, #12] 90: e59d300c ldr r3, [sp, #12] 94: e1a00003 mov r0, r3 ! 戻り値は"r3"に格納 98: e28dd010 add sp, sp, #16 ; 0x10 ! スタックポインタの復元 9c: e8bd8010 ldmia sp!, {r4, pc} ! "return address"へ戻る