関数呼び出し

doyu@oreo:/tmp$ cat a.c
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; }
doyu@oreo:/tmp$ sh_sh3_le-gcc -g -fomit-frame-pointer -c a.c
doyu@oreo:/tmp$ sh_sh3_le-objdump -d -S a.o

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

セクション .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:   f0 7f           add     #-16,r15     ! 作業領域の確保:"r15"はスタックポインタ
   2:   42 2f           mov.l   r4,@r15     ! 引数をスタックに保存
   4:   51 1f           mov.l   r5,@(4,r15)
   6:   62 1f           mov.l   r6,@(8,r15)
   8:   73 1f           mov.l   r7,@(12,r15)
   a:   f2 62           mov.l   @r15,r2
   c:   f1 51           mov.l   @(4,r15),r1   ! 足し算
   e:   2c 31           add     r2,r1
  10:   f2 52           mov.l   @(8,r15),r2
  12:   2c 31           add     r2,r1
  14:   f3 52           mov.l   @(12,r15),r2
  16:   2c 31           add     r2,r1
  18:   f4 52           mov.l   @(16,r15),r2
  1a:   2c 31           add     r2,r1
  1c:   f5 52           mov.l   @(20,r15),r2
  1e:   2c 31           add     r2,r1
  20:   f6 52           mov.l   @(24,r15),r2
  22:   2c 31           add     r2,r1
  24:   13 60           mov     r1,r0         ! 戻り値は"r0"に格納
  26:   10 7f           add     #16,r15       ! スタックポインタの復元
  28:   0b 00           rts                   ! 呼び出し元へ戻る
  2a:   09 00           nop                   ! 遅延スロット

0000002c 
: int main() { int rc = func(1,2,3,4,5,6,7); return rc; } 2c: 22 4f sts.l pr,@-r15 ! 呼び出し元のpcをスタックに保存 2e: fc 7f add #-4,r15 ! 作業領域の確保:"r15"はスタックポインタ 30: f4 7f add #-12,r15 ! 関数呼び出しの引数領域の確保 32: f3 62 mov r15,r2 34: 05 e1 mov #5,r1 ! 引数はレジスタ+スタックで 36: 12 22 mov.l r1,@r2 38: 06 e1 mov #6,r1 3a: 11 12 mov.l r1,@(4,r2) 3c: 07 e1 mov #7,r1 3e: 12 12 mov.l r1,@(8,r2) 40: 01 e4 mov #1,r4 42: 02 e5 mov #2,r5 44: 03 e6 mov #3,r6 46: 04 e7 mov #4,r7 48: 05 d1 mov.l 60 ,r1 ! 0x0 4a: 0b 41 jsr @r1 ! 関数コール 4c: 09 00 nop 4e: 0c 7f add #12,r15 ! スタックポインタの復元 50: 02 2f mov.l r0,@r15 ! 戻り値をスタックに保存 52: f2 61 mov.l @r15,r1 ! 戻り値をスタックから復元 54: 13 60 mov r1,r0     ! 戻り値は"r0"に格納 56: 04 7f add #4,r15 ! スタックポインタの復元 58: 26 4f lds.l @r15+,pr ! 呼び出し元のPCをスタックから復元 5a: 0b 00 rts ! 呼び出し元へ戻る 5c: 09 00 nop ! 遅延スロット 5e: 09 00 nop 60: 00 00 .word 0x0000 ...