doyu@oreo:/tmp$ cat a.c
int func(int a1,int a2,int a3,int a4,int a5,int a6, int a7){ retrun a1+a2+a3+a4+a5+a6+a7; }
int main() { int rc = func(1,2,3,4,5,6,7); return rc; }
doyu@oreo:/tmp$ ppc_82xx-gcc -g -fomit-frame-pointer -c a.c
doyu@oreo:/tmp$ ppc_82xx-objdump -d -S a.o
a.o: ファイル形式 elf32-powerpc
セクション .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: 94 21 ff d0 stwu r1,-48(r1) ! 作業領域の確保:"r1"はスタックポインタ
4: 90 61 00 08 stw r3,8(r1) ! 呼び出し元のPCをスタックに保存
8: 90 81 00 0c stw r4,12(r1) ! 引数をスタックに保存
c: 90 a1 00 10 stw r5,16(r1)
10: 90 c1 00 14 stw r6,20(r1)
14: 90 e1 00 18 stw r7,24(r1)
18: 91 01 00 1c stw r8,28(r1)
1c: 91 21 00 20 stw r9,32(r1)
20: 81 21 00 08 lwz r9,8(r1)
24: 80 01 00 0c lwz r0,12(r1) ! 足し算
28: 7c 09 02 14 add r0,r9,r0
2c: 81 21 00 10 lwz r9,16(r1)
30: 7c 00 4a 14 add r0,r0,r9
34: 81 21 00 14 lwz r9,20(r1)
38: 7c 00 4a 14 add r0,r0,r9
3c: 81 21 00 18 lwz r9,24(r1)
40: 7c 00 4a 14 add r0,r0,r9
44: 81 21 00 1c lwz r9,28(r1)
48: 7c 00 4a 14 add r0,r0,r9
4c: 81 21 00 20 lwz r9,32(r1)
50: 7c 00 4a 14 add r0,r0,r9
54: 7c 03 03 78 mr r3,r0 ! 戻り値は"r3"に格納
58: 38 21 00 30 addi r1,r1,48 ! スタックポインタの復元
5c: 4e 80 00 20 blr ! 呼び出し元へ戻る
00000060 :
int main() { int rc = func(1,2,3,4,5,6,7); return rc; }
60: 94 21 ff f0 stwu r1,-16(r1) ! 作業領域の確保:"r1"はスタックポインタ
64: 7c 08 02 a6 mflr r0 ! 呼び出し元のpcをスタックに保存
68: 90 01 00 14 stw r0,20(r1)
6c: 38 60 00 01 li r3,1 ! 引数はレジスタで
70: 38 80 00 02 li r4,2
74: 38 a0 00 03 li r5,3
78: 38 c0 00 04 li r6,4
7c: 38 e0 00 05 li r7,5
80: 39 00 00 06 li r8,6
84: 39 20 00 07 li r9,7
88: 48 00 00 01 bl 88 ! 関数コール
8c: 7c 60 1b 78 mr r0,r3 ! 関数の戻り値"r"3を
90: 90 01 00 08 stw r0,8(r1) ! スタックに保存
94: 80 01 00 08 lwz r0,8(r1) ! スタックから復元
98: 7c 03 03 78 mr r3,r0 ! 戻り値"r3"に代入しておく
9c: 80 01 00 14 lwz r0,20(r1) ! 呼び出し元のPCをスタックから復元
a0: 7c 08 03 a6 mtlr r0
a4: 38 21 00 10 addi r1,r1,16 ! スタックポインタの復元
a8: 4e 80 00 20 blr ! 呼び出し元へ戻る