x64操作码和缩放字节索引

时间:2015-01-20 23:34:53

标签: 64-bit machine-code

我想我已经将Mod R / M字节缩小了,但我仍然对有效内存地址/缩放索引字节感到困惑。我正在查看这些网站:http://www.sandpile.org/x86/opc_rm.htmhttp://wiki.osdev.org/X86-64_Instruction_Encoding。有人编码一个示例,目的地址在使用SIB的寄存器中吗?比方说,如果将8位寄存器添加到使用SIB的8位寄存器中的地址?

当我使用0x05的ModR / M字节时,(*)相对于当前指令指针?在64位模式下是32位还是64位?'

SIB是否始终与源地址或目标地址一起使用?

1 个答案:

答案 0 :(得分:0)

存储器地址永远不会出现在8位寄存器中,但这里是使用SIB的一个例子:

add byte [rax + rdx], 1

这是add rm8, imm880 /0 ib的一个实例。 /0表示ModR / M字节中的r字段为零。我们必须在这里使用SIB但不需要立即偏移,因此我们可以使用00b作为mod,使用100b作为rm,形成04h作为ModR / M字节(44h和84h也可以工作,但浪费空间编码零偏移量)。现在查看SIB表,有两个寄存器都带有"比例1和#34;因此基数和索引大多可以互换(rsp不能作为索引,但我们不是在这里使用它)。所以SIB字节可以是10h或02h。

现在把字节放在一行:

80 04 10 01
; or
80 04 02 01
  

当我使用0x05的ModR / M字节时,(*)相对于当前指令指针?在64位模式下是32位还是64位?

是。你看到了这张纸条,我确定。所以它可以是,或者取决于你是否使用了地址大小覆盖。在每个合理的情况下,它将是rip + sdword。使用另一种形式会给你一个截断的结果,我无法立即想象任何有意义的情况(对于一般lea数学肯定,但不是指针)。可能(这是猜测),只有存在使地址大小覆盖合理均匀的可能性。

  

SIB是否始终与源地址或目标地址一起使用?

取决于你的意思。当然,如果你有一个SIB,它会编码一个源或目的地(因为还有什么?)(你可能会认为nop rm中出现的SIB可以编码 ,因为{ {1}}既没有来源也没有目的地。如果你的意思是"哪一个编码",它可以是一个。查看所有指令,它通常可以出现在源操作数中。但显然有很多情况下它可以编码目的地 - 例如:见上文。如果你的意思是"是总是使用",那么,请看那个你正在看的表。