了解由 Qword ptr 表示的地址位置?
Understanding the Address location denoted by Qword ptr?
我遇到了下面的汇编指令and rax, qword ptr [0xff5ff098]
我想知道的是下面指令访问的内存地址是多少。
内存地址 0xff5ff098
会被零扩展还是会被最高有效位扩展?
在 Intel Pin
工具中,api IARG_MEMORYREAD_EA
将其扩展为 1,即它给出以下地址 0xffffffffff5ff098
。这个地址是可能的地址吗?
我在 64 位机器上工作。
它是如何编码的? RIP 相对还是绝对?
如果是绝对的,它使用符号扩展 disp32 寻址模式(因为 ,即使不涉及寄存器)。
如果它是 RIP 相关的,那么您的反汇编程序应该会向您显示正确的最终地址,该地址是根据 RIP + rel32 计算得出的。
您的反汇编程序或 PIN 显示不正确,因为如果它真的符号扩展为 64 位,您的反汇编程序应该向您显示。
是的,RIP 相对寻址和绝对寻址在 x86-64 中都是可能的。
x86-32 有两种冗余方式来编码 [disp32]
没有寄存器的寻址模式。 x86-64 将较短的地址重新用作 RIP 相对地址,将较长的地址保留为 [sign-extended-disp32]
绝对寻址。
我将使用 NASM 语法作为示例。您可以使用 default rel
默认情况下使用 RIP-relative,并且您可以像这样根据具体情况进行覆盖:
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>
Is this address a possible address ?
是的,使用了规范范围上半部分的地址。例如less /proc/self/maps
显示 Linux 将其导出的 vsyscall
页面映射到高地址 space:
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
规范地址意味着位 [63:48]
是位 47 的副本。即地址是您通过对低 48 位进行符号扩展而获得的地址。非规范地址在当前硬件上总是会出错,所以如果你想用那些冗余位实现标记指针之类的东西,你仍然必须在取消引用之前重做符号扩展。
请注意,qword ptr
告诉您操作数的大小,而不是有关寻址模式编码方式的任何信息。
我遇到了下面的汇编指令and rax, qword ptr [0xff5ff098]
我想知道的是下面指令访问的内存地址是多少。
内存地址 0xff5ff098
会被零扩展还是会被最高有效位扩展?
在 Intel Pin
工具中,api IARG_MEMORYREAD_EA
将其扩展为 1,即它给出以下地址 0xffffffffff5ff098
。这个地址是可能的地址吗?
我在 64 位机器上工作。
它是如何编码的? RIP 相对还是绝对?
如果是绝对的,它使用符号扩展 disp32 寻址模式(因为
如果它是 RIP 相关的,那么您的反汇编程序应该会向您显示正确的最终地址,该地址是根据 RIP + rel32 计算得出的。
您的反汇编程序或 PIN 显示不正确,因为如果它真的符号扩展为 64 位,您的反汇编程序应该向您显示。
是的,RIP 相对寻址和绝对寻址在 x86-64 中都是可能的。
x86-32 有两种冗余方式来编码 [disp32]
没有寄存器的寻址模式。 x86-64 将较短的地址重新用作 RIP 相对地址,将较长的地址保留为 [sign-extended-disp32]
绝对寻址。
我将使用 NASM 语法作为示例。您可以使用 default rel
默认情况下使用 RIP-relative,并且您可以像这样根据具体情况进行覆盖:
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>
Is this address a possible address ?
是的,使用了规范范围上半部分的地址。例如less /proc/self/maps
显示 Linux 将其导出的 vsyscall
页面映射到高地址 space:
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
规范地址意味着位 [63:48]
是位 47 的副本。即地址是您通过对低 48 位进行符号扩展而获得的地址。非规范地址在当前硬件上总是会出错,所以如果你想用那些冗余位实现标记指针之类的东西,你仍然必须在取消引用之前重做符号扩展。
请注意,qword ptr
告诉您操作数的大小,而不是有关寻址模式编码方式的任何信息。