登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

快乐一兵

欢迎朋友光临,祝福平安健康

 
 
 

日志

 
 
关于我

我1959年12月应征入伍,1961年5月20日入党。先后任油机技术,干事,1967年7月奉命参加援越抗美.先后任,副股长、股长,政冶处副主任,团副政委,团纪委书记。1986年1月转业到镇海炼化公司,先后任物资管理处党委副书记、纪委书记,卫生处副处长主持全面工作,分管医疗防疫卫生,环境卫生,绿化,计划生育工作,直至2000年3月退休。我的人生是,任其自然,做好本职,快乐生活,乐趣无穷.

[汇编语言] [合集] 问个可能很小白的问题。(转载)  

2012-09-16 16:13:17|  分类: 文化生活园地 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我用有道阅读看到这篇好文,希望和大家分享。我的看法是:

以下原文转载自水木社区 今日十大热门话题

发信人: bookses (读万卷书,行万里路), 信区: Assembler
标 题: [合集] 问个可能很小白的问题。
发信站: 水木社区 (Thu Sep 13 07:16:25 2012), 站内
☆─────────────────────────────────────☆
liujan611 (anti-creditcard) 于 (Sun Jul 29 12:35:24 2012) 提到:
下面main.c在多进程环境执行。
main() {
int i = 10, j;
int arr[100] = {1};
j = i + arr[10]; // 这个语句如何生成汇编? 如何指定arr在内存的基地址
}
i的话可以直接放在reg里。
数组arr[100]没法放在reg里,对数组元素的访问则是通过load指令从内存导入数值。 由于是多进程环境的随机执行,如何通过事先编译生成arr[]数组所在内存页面的基地址?
☆─────────────────────────────────────☆
CKevin ( ) 于 (Sun Jul 29 12:43:04 2012) 提到:
i,j,arr都是在栈上的。现在假定在进入main函数时,栈基已经知道,再假定编译器/ABI没有在栈上留什么空间。
那么只需要
mov eax, [栈基地址 + 0] 把i放在eax
mov ebx, [栈基地址 + 8] 把arr基地址放在ebx
add eax, [ebx + 基址变址寻址长度4 * 10] 使用ebx进行偏移寻址,偏移10个元素
(后来补充:我想了一下,上面这句有问题……还是再使用寄存器标明偏移,或者干脆再拆一条语句出来吧。)
那么“栈基地址”又是什么呢,在这种最简化的场景下就是esp。
在实际场景中,进入一个函数,栈帧都会进行一些调整,比如
push ebp
mov ebp, esp
后续使用ebp寻址
此外,实际场景中如果用到了段,那么要调整段描述符。
总之,你把程序编译一下,然后反汇编不就知道了。
gcc main.c
objdump -S a.out
【 在 liujan611 (anti-creditcard) 的大作中提到: 】
: 下面main.c在多进程环境执行。
: main() {
: int i = 10, j;
: ...................

  • 用有道阅读订阅水木社区 今日十大热门话题
  • 有道阅读开启快捷的资讯阅读之道
  •   评论这张
     
    阅读(38)| 评论(0)

    历史上的今天

    评论

    <#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    页脚

    网易公司版权所有 ©1997-2018