関数呼び出し

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