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
...