関数呼び出し

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 ! 呼び出し元へ戻る