分类: LINUX
2009-12-16 09:06:07
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 –CSDR >obj
Cat obj
00008350
8350: e
/*把进入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此刻指向的地方是属于新的函数的栈底就是上一个函数的栈指针下面*/
/*sp往下涨16个字节,也就是4个字长*/
8360: e50b0010 str r0, [fp, #-16]
/*把r0的内容放在刚长出来的空间里面的第一个*/
8364: e50b1014 str r1, [fp, #-20]
/*把r1的内容放在r0下面,这都是在栈里*/
8368: e
/*把1放在r3里面,其实就是i*/
/*把i的值1放在开辟出来的四个字长的第三个空间里面*/
8370: e
/*把j的值放在r3里面*/
8374: e50b
/*把r3的值2放在了开辟出来的四个字长的空间里面最后一个*/
8378: e51b
/*再把刚放进去的东西,取出来放在r3里面*/
/*和2比较*/
8380: da000003 ble 8394
/*如果小于==就跳转到8394*/
8384: e
/*把全局的那个变量global的值取到r2上*/
8388: e51b
/*把四个字长的空间里面最后一个放到r3寄存器里面*/
/*把j的值存在r2所在的空间也就是global变量的地方*/
8390: ea000002 b
/*跳转到
8394:
e
/*把
8398: e51b3018 ldr r3, [fp, #-24]
/*把i的值放在r3寄存器*/
/*把i的值放到global变量*/
/*把r0设为0*/
/*sp=fp-12,这样的话,sp就指向了先前入栈的时候fp所在的地址*/
/*这样的话再把sp所在的内容出栈,把以前的fp送会到fp,把以前的ip送给sp,把以前的返回地址送回给了pc,这样的话,下次执行的时候就直接跳转到这个pc地址,也就是调用这个函数的时候设好的返回地址*/
/*这里其实就是那个全局的global所在的地址,而不是一个指令*/
chinaunix网友2009-12-18 22:56:40
这位兄弟,看到你的博客,提供一个信息如下,真诚希望你能关注下: 全球TOP3通信公司创新项目招募人才(本次机会较好,待遇从优) 地点:上海 包括但不限于以下方面:(1)嵌入式技术和linux开发(2)编译环境开发(3)应用和业务软件开发(4)浏览器和互联网技术(5)媒体平台:媒体技术和算法(6)通信协议:传输,组网以及协议开发等 招聘范围:中高级技术专家,技术带头人,3年以上工作经验 待遇:从优,只要您有实力,待遇一切可谈 关于我们:提供一个良好的技术和开发环境,提供优越的个人发展空间通道以及完善的培训制度,个人配股激励计划。 若有任何疑问或者兴趣,欢迎邮件:BlankHt@163.com 静候您或者您的朋友回音。