ザ・インタープリター
http://www.inpri.jp/
バックグランド的にはいろいろあるんだろうけど、二コール・キッドマン、ほんとにかわいかった
関数呼び出し
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 ! 呼び出し元へ戻る
関数呼び出し
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 ...
関数呼び出し
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$ gcc -g -fomit-frame-pointer -c a.c doyu@oreo:/tmp$ objdump -d -S a.o a.o: ファイル形式 elf32-i386 セクション .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: 8b 44 24 08 mov 0x8(%esp),%eax ! 足し算 4: 03 44 24 04 add 0x4(%esp),%eax 8: 03 44 24 0c add 0xc(%esp),%eax c: 03 44 24 10 add 0x10(%esp),%eax 10: 03 44 24 14 add 0x14(%esp),%eax 14: 03 44 24 18 add 0x18(%esp),%eax 18: 03 44 24 1c add 0x1c(%esp),%eax ! 戻り値は"eax"に格納 1c: c3 ret ! 呼び出し元へ戻る 0000001d : int main() { int rc = func(1,2,3,4,5,6,7); return rc; } 1d: 55 push %ebp ! 呼び出し元のpcをスタックに保存 1e: 89 e5 mov %esp,%ebp 20: 83 ec 28 sub $0x28,%esp ! 作業領域の確保 23: 83 e4 f0 and $0xfffffff0,%esp 26: b8 00 00 00 00 mov $0x0,%eax 2b: 29 c4 sub %eax,%esp 2d: c7 44 24 18 07 00 00 movl $0x7,0x18(%esp) ! 引数は全てスタックで 34: 00 35: c7 44 24 14 06 00 00 movl $0x6,0x14(%esp) 3c: 00 3d: c7 44 24 10 05 00 00 movl $0x5,0x10(%esp) 44: 00 45: c7 44 24 0c 04 00 00 movl $0x4,0xc(%esp) 4c: 00 4d: c7 44 24 08 03 00 00 movl $0x3,0x8(%esp) 54: 00 55: c7 44 24 04 02 00 00 movl $0x2,0x4(%esp) 5c: 00 5d: c7 04 24 01 00 00 00 movl $0x1,(%esp) 64: e8 fc ff ff ff call 65 ! 関数コール 69: 89 45 fc mov %eax,0xfffffffc(%ebp) ! 戻り値をスタックに保存 6c: 8b 45 fc mov 0xfffffffc(%ebp),%eax ! 戻り値は"eax"に格納 6f: c9 leave ! 呼び出し元へ戻る 70: c3 ret