理解Qword ptr表示的地址位置?

时间:2016-11-23 10:30:33

标签: assembly x86 x86-64 intel-pin

我遇到了以下汇编指令and rax, qword ptr [0xff5ff098]

我想知道的是什么是将在以下指令中访问的内存地址。 内存地址0xff5ff098是否会被扩展为零,还是会被最高位扩展?

Intel Pin工具中,api IARG_MEMORYREAD_EA将其扩展为1,即它提供以下地址0xffffffffff5ff098。这个地址是可能的地址吗?

我正在使用64位机器。

1 个答案:

答案 0 :(得分:3)

它是如何编码的? RIP相对还是绝对?

如果是绝对的,它使用sign-extended-disp32寻址模式(因为32-bit displacements in addressing modes are always sign extended,即使没有涉及寄存器)。

如果它是RIP相对的,那么你的反汇编程序应该显示正确的最终地址,从RIP + rel32计算。

您的反汇编程序或PIN都显示错误,因为如果它真的符号扩展为64位,那么您的反汇编程序应该向您显示。

是的,在x86-64中,RIP相对和绝对寻址都是可能的。

x86-32有两种冗余方式来编码[disp32]寻址模式,没有寄存器。 x86-64将较短的一个重新用作RIP相对,并将较长的一个用作[sign-extended-disp32]绝对寻址。

我将使用NASM语法作为示例。默认情况下,您可以使用default rel来使用RIP相对,并且您可以根据具体情况进行覆盖:

  MOV     RAX, [abs FS:_start]    ; _start just as something that assembles
  MOV     RAX, [rel FS:_start]    ; RIP-rel for thread-local is usually not useful!

 64 48 8b 04 25 b5 00 40 00   mov rax,QWORD PTR fs:0x4000b5
 64 48 8b 05 e7 fe ff ff      mov rax,QWORD PTR fs:[rip+0xfffffffffffffee7]  # 4000b5 <_start>
  

这个地址是可能的地址吗?

是的,使用规范范围上半部分的地址。例如less /proc/self/maps表明Linux将其导出的vsyscall页面映射到高地址空间:

ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

典型地址意味着位[63:48]是位47的副本。即地址是从低位48位进行符号扩展所得到的。非规范地址在当前硬件上总是会出错,因此如果要实现带有这些冗余位的标记指针之类的东西,您仍需要在解除引用之前重做符号扩展。

请注意,qword ptr告诉您操作数大小,而不是有关如何编码寻址模式的任何内容。