我想我已经将Mod R / M字节缩小了,但我仍然对有效内存地址/缩放索引字节感到困惑。我正在查看这些网站:http://www.sandpile.org/x86/opc_rm.htm,http://wiki.osdev.org/X86-64_Instruction_Encoding。有人编码一个示例,目的地址在使用SIB的寄存器中吗?比方说,如果将8位寄存器添加到使用SIB的8位寄存器中的地址?
当我使用0x05的ModR / M字节时,(*)相对于当前指令指针?在64位模式下是32位还是64位?'
SIB是否始终与源地址或目标地址一起使用?
答案 0 :(得分:0)
存储器地址永远不会出现在8位寄存器中,但这里是使用SIB的一个例子:
add byte [rax + rdx], 1
这是add rm8, imm8
,80 /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}}既没有来源也没有目的地。如果你的意思是"哪一个编码",它可以是一个。查看所有指令,它通常可以出现在源操作数中。但显然有很多情况下它可以编码目的地 - 例如:见上文。如果你的意思是"是总是使用",那么,请看那个你正在看的表。