首页
社区
课程
招聘
汇编指令求解 mov 0x6d0211(%rip),%rax
发表于: 2016-7-18 15:13 16667

汇编指令求解 mov 0x6d0211(%rip),%rax

2016-7-18 15:13
16667
大侠们好:
mov    0x6d0211(%rip),%rax
小弟不解,为何要将RIP偏移内存赋值给rax寄存器?RIP也可以当做普通的寄存器存取数据?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 1262
活跃值: (775)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
In Intel's manual volume 2 section 2.2.1.6 RIP-Relative Addressing:

A new addressing form, RIP-relative (relative instruction-pointer) addressing, is implemented in 64-bit mode. An effective address is formed by adding displacement to the 64-bit RIP of the next instruction.

e.g.
7ffff7a97759    mov    0x33b780(%rip),%rax        # 0x7ffff7dd2ee0
7ffff7a97760    mov    (%rax),%rax

This:

Takes the address in rip, and adds 0x33b780 to it. At this point, rip contains the address of the next instruction, which is 0x7ffff7a97760. Adding 0x33b780 to that gives you 0x7ffff7dd2ee0, which is the address in the comment.
It copies the 8 byte value stored at that address into rax.
2016-7-18 16:46
0
雪    币: 807
活跃值: (2288)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
64 位程序全局变量惯用的寻址方式,下一条指令的虚拟地址 + 偏移(0x6d0211)即为该全局变量的实际地址。倒不是真和要让 rax 寄存器和 rip 寄存器拉上什么干系,仅仅只是因为 rip 的值是现成的(其它寄存器就不灵),偏移的值也是确定的,那么,这个全局变量的地址也就确定了,不用执行,反汇编就能确定此值。楼主如果是在 Linux 下使用 objdump 反汇编,这条指令的后面应该就有相应的注释,直接标出了这个地址。
          在32位程序中,具有相似效果的指令是:
          lea eax , dword ptr[0x8A0288]
          eax 寄存器此刻指向某全局变量的内存地址 0x8A0288 。
2016-7-18 18:18
0
雪    币: 346
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
x64新增了RIP相对寻址~
2016-7-19 10:31
0
游客
登录 | 注册 方可回帖
返回
//