免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1487 | 回复: 0
打印 上一主题 下一主题

Arm汇编实例解析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-16 09:06 |只看该作者 |倒序浏览


  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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP