Chinaunix首页 | 论坛 | 博客
  • 博客访问: 354601
  • 博文数量: 43
  • 博客积分: 1493
  • 博客等级: 上尉
  • 技术积分: 660
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-01 10:57
文章分类

全部博文(43)

文章存档

2015年(1)

2013年(1)

2011年(6)

2010年(13)

2009年(13)

2008年(9)

分类: 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后的结果

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 <.text+0x104>

/*把全局的那个变量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 <.text+0x104>

/*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所在的地址,而不是一个指令*/

阅读(1287) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-12-19 12:32:54

你好,非常感谢您提供的信息, 我会仔细考虑的。

chinaunix网友2009-12-18 22:56:40

这位兄弟,看到你的博客,提供一个信息如下,真诚希望你能关注下: 全球TOP3通信公司创新项目招募人才(本次机会较好,待遇从优) 地点:上海   包括但不限于以下方面:(1)嵌入式技术和linux开发(2)编译环境开发(3)应用和业务软件开发(4)浏览器和互联网技术(5)媒体平台:媒体技术和算法(6)通信协议:传输,组网以及协议开发等   招聘范围:中高级技术专家,技术带头人,3年以上工作经验   待遇:从优,只要您有实力,待遇一切可谈   关于我们:提供一个良好的技术和开发环境,提供优越的个人发展空间通道以及完善的培训制度,个人配股激励计划。   若有任何疑问或者兴趣,欢迎邮件:BlankHt@163.com   静候您或者您的朋友回音。