下面是一个简单的函数调用ARM反汇编例子
/*C语言源代码*/
static int d = 13;
char e = 1;
char* fun(char a, int b)
{
char *p = "anhu";
*p = a;
*(p+3) = b;
return p;
}
int main(void)
{
char* f = fun(100,200);
*f='c';
return 0;
}
以下是上述C语言的ARM核心反汇编代码以及我添加的注释(ADS1.2上编译)
……
** Section #5 '.text' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR]
Size : 60 bytes (alignment 4)
fun
$a
.text
0x00000000: e1a02000 .... MOV r2,r0
0x00000004: e28f0008 .... ADD r0,pc,#8 ; #0x14 ;执行到0x00000004时,pc已经为0x0000000c
0x00000008: e5c02000 . .. STRB r2,[r0,#0] ;*p=a
0x0000000c: e5c01003 .... STRB r1,[r0,#3] ;*(p+3)=b
0x00000010: e1a0f00e .... MOV pc,r14 ;r14保存了返回地址
$d
0x00000014: 75686e61 anhu DCD 1969778273 ;常量字符串
0x00000018: 00000000 .... DCD 0
main
$a
0x0000001c: e52de004 .... STR r14,[r13,#-4]! ;保存r14,r13地址完了自减4
0x00000020: e3a010c8 .... MOV r1,#0xc8
0x00000024: e3a00064 .... MOV r0,#0x64
0x00000028: ebfffffe .... BL fun ; 0x0
0x0000002c: e3a01063 .... MOV r1,#0x63 ;'c' = 0x63
0x00000030: e5c01000 .... STRB r1,[r0,#0] ;fun返回值保存在r0中
0x00000034: e3a00000 .... MOV r0,#0
0x00000038: e49df004 .... LDR pc,[r13],#4
……