関数呼び出し
"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 ! 遅延スロット