- 论坛徽章:
- 0
|
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
st1\:*{behavior:url(#ieooui) }
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
Arm汇编实例解析
源代码
int global=19;
int main(int argc,char **argv)
{
int i, j;
i=1;
j=2;
if(j>2){
global=j;
} else {
global=i;
}
return 0;
}
编译:
Gcc test_arm.c
Objdump后的结果
Objdump –CSDR >obj
Cat obj
00008350 :
8350: e1a0c00d
mov ip, sp
/*把进入main之前的栈指针保存*/
8354: e92dd800
stmdb sp!, {fp, ip, lr, pc}
/*把fp也即是栈底指针,ip(此时指向sp)保存 ,lr也就是返回地址保存,pc当前指令地址保存(为实际的值加8)*/
8358: e24cb004 sub fp, ip, #4 ; 0x4
/*fp=ip-4,也就是说fp此刻指向的地方是属于新的函数的栈底就是上一个函数的栈指针下面*/
835c:
e24dd010 sub sp, sp, #16 ; 0x10
/*sp往下涨16个字节,也就是4个字长*/
8360: e50b0010 str r0, [fp, #-16]
/*把r0的内容放在刚长出来的空间里面的第一个*/
8364: e50b1014 str r1, [fp, #-20]
/*把r1的内容放在r0下面,这都是在栈里*/
8368: e3a03001 mov
r3, #1 ; 0x1
/*把1放在r3里面,其实就是i*/
836c:
e50b3018 str r3, [fp, #-24]
/*把i的值1放在开辟出来的四个字长的第三个空间里面*/
8370: e3a03002 mov r3, #2
; 0x2
/*把j的值放在r3里面*/
8374: e50b301c str r3,
[fp, #-28]
/*把r3的值2放在了开辟出来的四个字长的空间里面最后一个*/
8378: e51b301c ldr r3,
[fp, #-28]
/*再把刚放进去的东西,取出来放在r3里面*/
837c:
e3530002 cmp r3, #2 ; 0x2
/*和2比较*/
8380: da000003 ble 8394
/*如果小于==就跳转到8394*/
8384: e59f2020 ldr
r2, [pc, #32] ; 83ac
/*把全局的那个变量global的值取到r2上*/
8388: e51b301c ldr r3,
[fp, #-28]
/*把四个字长的空间里面最后一个放到r3寄存器里面*/
838c:
e5823000 str r3, [r2]
/*把j的值存在r2所在的空间也就是global变量的地方*/
8390: ea000002 b 83a0 main+0x50>
/*跳转到83a0*/
8394:
e59f2010 ldr r2, [pc, #16] ; 83ac
/*把83ac的地址放到r2寄存器*/
8398: e51b3018 ldr r3, [fp, #-24]
/*把i的值放在r3寄存器*/
839c:
e5823000 str r3, [r2]
/*把i的值放到global变量*/
83a0: e3a00000 mov r0, #0
; 0x0
/*把r0设为0*/
83a4: e24bd00c sub sp,
fp, #12 ; 0xc
/*sp=fp-12,这样的话,sp就指向了先前入栈的时候fp所在的地址*/
83a8:
e89da800 ldmia
sp, {fp, sp, pc}
/*这样的话再把sp所在的内容出栈,把以前的fp送会到fp,把以前的ip送给sp,把以前的返回地址送回给了pc,这样的话,下次执行的时候就直接跳转到这个pc地址,也就是调用这个函数的时候设好的返回地址*/
83ac: 0001055c andeq
r0, r1, ip, asr r5
/*这里其实就是那个全局的global所在的地址,而不是一个指令*/
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/67984/showart_2122441.html |
|