2008年1月5日

ARMでの関数呼び出し(ABI)調査

C言語から呼び出し可能なアセンブラコードを作成するために、C言語の関数がどのようにコンパイルされるか、ディスアセンブルしてみた。

テスト用に作成したCのソースコードは以下。
u8
add1(u8 a, u8 b)
{
u8 sum = a + b;
return sum;
}

u8
add2(u8 a, u8 b, u8 c, u8 d, u8 e, u8 f, u8 g)
{
u8 sum = a + b + c + d + e + f + g;
return sum;
}

u32
add3(u32 a, u32 b)
{
u32 sum = a + b;
return sum;
}


上記Cのコードをディスアセンブリした結果は以下。
test.o:     ファイル形式 elf32-littlearm

セクション .text の逆アセンブル:

00000000 add1:
0: e1a0c00d mov ip, sp
4: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8: e24cb004 sub fp, ip, #4 ; 0x4
c: e24dd004 sub sp, sp, #4 ; 0x4
10: e1a03000 mov r3, r0
14: e1a02001 mov r2, r1
18: e54b300d strb r3, [fp, #-13]
1c: e1a03002 mov r3, r2
20: e54b300e strb r3, [fp, #-14]
24: e55b200d ldrb r2, [fp, #-13]
28: e55b300e ldrb r3, [fp, #-14]
2c: e0823003 add r3, r2, r3
30: e54b300f strb r3, [fp, #-15]
34: e55b300f ldrb r3, [fp, #-15]
38: e1a00003 mov r0, r3
3c: e89da808 ldmia sp, {r3, fp, sp, pc}

00000040 add2:
40: e1a0c00d mov ip, sp
44: e92dd830 stmdb sp!, {r4, r5, fp, ip, lr, pc}
48: e24cb004 sub fp, ip, #4 ; 0x4
4c: e24dd008 sub sp, sp, #8 ; 0x8
50: e1a0c003 mov ip, r3
54: e59be004 ldr lr, [fp, #4]
58: e59b4008 ldr r4, [fp, #8]
5c: e59b500c ldr r5, [fp, #12]
60: e1a03000 mov r3, r0
64: e54b3015 strb r3, [fp, #-21]
68: e1a03001 mov r3, r1
6c: e54b3016 strb r3, [fp, #-22]
70: e1a03002 mov r3, r2
74: e54b3017 strb r3, [fp, #-23]
78: e1a0300c mov r3, ip
7c: e54b3018 strb r3, [fp, #-24]
80: e1a0300e mov r3, lr
84: e54b3019 strb r3, [fp, #-25]
88: e1a03004 mov r3, r4
8c: e54b301a strb r3, [fp, #-26]
90: e1a03005 mov r3, r5
94: e54b301b strb r3, [fp, #-27]
98: e55b2015 ldrb r2, [fp, #-21]
9c: e55b3016 ldrb r3, [fp, #-22]
a0: e0823003 add r3, r2, r3
a4: e1a02003 mov r2, r3
a8: e55b3017 ldrb r3, [fp, #-23]
ac: e0823003 add r3, r2, r3
b0: e1a02003 mov r2, r3
b4: e55b3018 ldrb r3, [fp, #-24]
b8: e0823003 add r3, r2, r3
bc: e1a02003 mov r2, r3
c0: e55b3019 ldrb r3, [fp, #-25]
c4: e0823003 add r3, r2, r3
c8: e1a02003 mov r2, r3
cc: e55b301a ldrb r3, [fp, #-26]
d0: e0823003 add r3, r2, r3
d4: e1a02003 mov r2, r3
d8: e55b301b ldrb r3, [fp, #-27]
d8: e55b301b ldrb r3, [fp, #-27]
dc: e0823003 add r3, r2, r3
e0: e54b301c strb r3, [fp, #-28]
e4: e55b301c ldrb r3, [fp, #-28]
e8: e1a00003 mov r0, r3
ec: e24bd014 sub sp, fp, #20 ; 0x14
f0: e89da830 ldmia sp, {r4, r5, fp, sp, pc}

000000f4 add3:
f4: e1a0c00d mov ip, sp
f8: e92dd800 stmdb sp!, {fp, ip, lr, pc}
fc: e24cb004 sub fp, ip, #4 ; 0x4
100: e24dd00c sub sp, sp, #12 ; 0xc
104: e50b0010 str r0, [fp, #-16]
108: e50b1014 str r1, [fp, #-20]
10c: e51b2010 ldr r2, [fp, #-16]
110: e51b3014 ldr r3, [fp, #-20]
114: e0823003 add r3, r2, r3
118: e50b3018 str r3, [fp, #-24]
11c: e51b3018 ldr r3, [fp, #-24]
120: e1a00003 mov r0, r3
124: e24bd00c sub sp, fp, #12 ; 0xc
128: e89da800 ldmia sp, {fp, sp, pc}