関数呼び出し

"gp"の扱いがよくわからん..

doyu@oreo:/tmp$ cat > a.c << EOF
> 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$ mips2_fp_le-gcc -g -fomit-frame-pointer -c a.c
doyu@oreo:/tmp$ mips2_fp_le-objdump -d -S a.o 

a.o:     ファイル形式 elf32-tradlittlemips

セクション .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:	3c1c0000 	lui	gp,0x0     ! 
   4:	279c0000 	addiu	gp,gp,0	   !
   8:	0399e021 	addu	gp,gp,t9   !
   c:	afa40000 	sw	a0,0(sp)   ! スタックに引数を積む
  10:	afa50004 	sw	a1,4(sp)   ! スタックに引数を積む
  14:	afa60008 	sw	a2,8(sp)   ! スタックに引数を積む
  18:	afa7000c 	sw	a3,12(sp)  ! スタックに引数を積む
  1c:	8fa30000 	lw	v1,0(sp)   ! スタックから取り出す
  20:	8fa20004 	lw	v0,4(sp)   ! スタックから取り出す
  24:	00621021 	addu	v0,v1,v0   ! 足し算
  28:	8fa30008 	lw	v1,8(sp)   ! スタックから取り出す
  2c:	00431021 	addu	v0,v0,v1   ! 足し算
  30:	8fa3000c 	lw	v1,12(sp)  ! スタックから取り出す
  34:	00431021 	addu	v0,v0,v1   ! 足し算
  38:	8fa30010 	lw	v1,16(sp)  ! スタックから取り出す
  3c:	00431021 	addu	v0,v0,v1   ! 足し算
  40:	8fa30014 	lw	v1,20(sp)  ! スタックから取り出す
  44:	00431021 	addu	v0,v0,v1   ! 足し算
  48:	8fa30018 	lw	v1,24(sp)  ! スタックから取り出す
  4c:	00431021 	addu	v0,v0,v1   ! 足し算 戻り値は、"v0"に
  50:	03e00008 	jr	ra         ! "return address"へ戻る
  54:	00000000 	nop                ! 遅延スロット

00000058 
: int main() { int rc = func(1,2,3,4,5,6,7); return rc; } 58: 3c1c0000 lui gp,0x0 ! 5c: 279c0000 addiu gp,gp,0 ! 60: 0399e021 addu gp,gp,t9 ! 64: 27bdffc8 addiu sp,sp,-56 ! 作業領域の確保(14x4) 68: afbf0030 sw ra,48(sp) ! "return address"をスタックへ 6c: afbc0020 sw gp,32(sp) ! 呼び出し元のPCをスタックへ 70: 24020005 li v0,5 ! 引数はレジスタ+スタックで 74: afa20010 sw v0,16(sp) ! 78: 24020006 li v0,6 ! 7c: afa20014 sw v0,20(sp) ! 80: 24020007 li v0,7 ! 84: afa20018 sw v0,24(sp) ! 88: 24040001 li a0,1 ! 8c: 24050002 li a1,2 ! 90: 24060003 li a2,3 ! 94: 24070004 li a3,4 ! 98: 8f990000 lw t9,0(gp) ! 9c: 0320f809 jalr t9 ! raに"return address"を格納 & jump t9 a0: 00000000 nop ! 遅延スロット a4: 8fbc0020 lw gp,32(sp) ! 呼び出し元を復元 a8: afa20028 sw v0,40(sp) ! 戻り値をスタックに保存 ac: 8fa20028 lw v0,40(sp) ! 戻り値をスタックから復元 b0: 8fbf0030 lw ra,48(sp) ! スタックから"return address"を取り出す b4: 27bd0038 addiu sp,sp,56 ! spを戻す b8: 03e00008 jr ra ! 呼び出し元へ戻る bc: 00000000 nop ! 遅延スロット