·ChinaUnix首页 ·论坛 ·博客 
Linux首页 | Linux新闻 | Linux论坛 | Linux文档 | Linux下载 | Linux博客 | Linux搜索 | 开源项目孵化平台 | 《开源时代》
新手入门 | 安装启动 | 管理员指南 | 开发手册 | 桌面应用 | 程序开发 | 数据库 | 网络技术| CentOS | Fedora | MySQL | Apache | Ubuntu | Gentoo| OSCON08
  Linux时代 >> 技术文档 >> 网络技术
 
一个分析汇编的好例子
来源: ChinaUnix博客  日期: 2009.06.12 09:17 (共有条评论) 我要评论
 
不想看那些长篇大论。90%的信息都是多余的。今天有了点空,自己搞定了。
入栈指令 stmfd stmfa stmed stmea
出栈指令 ldmfd ldmfa ldmed ldmea
我先说一下ldm和stm指令,stm指令是将寄存器(列表)的数据写到记忆体中,而ld
m指令是将记忆体中的数据写到寄存器(列表)中。
我花了些时间找了些规律在里面,
首先选取个两个参考点, stmfd和ldmfd,以fd做为基准
stm这类指令增加和减少(d 或 a)和我们逻辑上理解的地址的增减是相同的,比
如stmfd(满递减堆栈),可以这么看,压栈了,元素增多,我们在压栈时候栈顶
确实是地址减小的方向,那么stmfa是按地址增加的方向。
但是出栈正好相反,ldm这类指令上所谓的增加和减少和逻辑上的相反。ldmfd可
以这样理解,出栈了,元素减少,那么堆栈的方向应该是向高地址的方向走。那
么ldmfa就应该向地址低的方向走。
寄存器列表是按序号从小到大对应地址也是从小到大。即小序号对应小地址。
我做了张列表,来验证这个规律。
入栈 出栈
stmfd = stmdb ldmfd = ldmia
stmfa = stmib ldmfa = ldmda
stmed = stmda ldmed = ldmib
stmea = stmia ldmea = ldmdb
附加:
上面的规律是我写测试程序测出来的,因为gdb没有work,没法看寄存器了,所以
自己打了出来。这个程序验证了两件事情
1. 小序号寄存器对应小地址
2. fp对应了被呼叫函数的帧的首地址,lr对应了呼叫层的下一条指令地址。不会
随指令执行改变 (fp = ip - 4, ip值是上一层的sp)
有了2就把ldmea的行为分析出来了。有兴趣的读者可以分析一下。
#include  
int func1(int j)
{
int t;
int v_fp; //new fp
int v_ip;
int v_sp;
int v_lr;
int o_lr; //old lr
int o_sp;
int o_ip;
int o_fp;
int o_pc;
__asm__ __volatile__
(
"mov %0, fp "
"mov %1, ip "
"mov %2, sp "
"mov %3, lr"
: "=r" (v_fp), "=r" (v_ip), "=r" (v_sp), "=r" (v_lr)
:
: "memory"
);
printf("v_fp= 0x%x, v_ip= 0x%x, v_sp= 0x%x, v_lr= 0x%x ",v_fp,v_ip,v_sp,v_lr);
__asm__ __volatile__
(
"ldr %3, [fp] "
"ldr %0, [fp,#-4] "
"ldr %1, [fp,#-8] "
"ldr %2, [fp,#-12]"
: "=r" (o_lr), "=r" (o_sp), "=r" (o_fp), "=r" (o_pc)
:
: "memory"
);
printf("o_pc = 0x%x, o_lr= 0x%x, o_sp= 0x%x, o_fp= 0x%x ",o_pc,o_lr,o_sp,o_fp);
t = 100 + j;
//see registers
__asm__ __volatile__
(
"mov %0, fp "
"mov %1, ip "
"mov %2, sp "
"mov %3, lr"
: "=r" (v_fp), "=r" (v_ip), "=r" (v_sp), "=r" (v_lr)
:
: "memory"
);
printf("v_fp= 0x%x, v_ip= 0x%x, v_sp= 0x%x, v_lr= 0x%x ",v_fp,v_ip,v_sp,v_lr);
//end see
return t;
}
int main()
{
int i = 0;
int b;
b = func1(i);
printf("b = %d ",b);
return 0;
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/69404/showart_1962452.html
  发表评论 查看评论(共有条评论) 我要提问
 
 


最新资讯更多>> 
· 谷歌劝说诺基亚采用Android操作..
· Apache 基金会确认退出 JCP 执..
· Chrome 10 新功能探秘:新增GP..
· 金山宣布开源其安全软件
· 女黑客在开源会议上抱受骚扰
· 21款值得关注的Linux游戏
· 马化腾:腾讯半年后彻底转型,..
· [多图] Chrome OS 预发布版本多..
· Lubuntu 11.04 默认应用抢先一览
· Red Hat宣布收购云计算软件提供..
论坛热点更多>> 
· do_execve时候用户栈中参数的..
· swapinfo -atm 问题
· Linux 的优点简述
· VM虚拟机上得Red Hat Linux上..
· 我看成了上海男人喜欢女人毛..
· 校车展览,看了你就知道
· 在遇到他之前,唯一需要做的..
· GRUB的疑问
· 从来没有人真正付足书价——..
· 云存储 vs 网盘
文档更新更多>> 
· orcale queue
· 谁可以推荐几本经典的操作系统的..
· 【北京】某物联网公司招云计算应..
· 【北京】某物联网公司招云计算应..
· 谁能推荐几本关于操作系统的书
· 如何添加网络接口eth1
· 葡萄牙语入门教材的选取与经验分享
· 葡萄牙语就业前景分析
· 葡萄牙语学习经验交流
· Щ
 
关于我们 | 联系方式 | 广告合作 | 诚聘英才 | 网站地图 | 友情链接 | 免费注册

Copyright © 2001-2009 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们

京ICP证:060528号