【发布时间】:2023-03-11 14:32:01
【问题描述】:
我一直在尝试了解 ASM x64 指令的 0x40 REX 操作码的用途。例如,在这个来自 Kernel32.dll 的函数序言中:
如您所见,他们使用push rbx 作为:
40 53 push rbx
但仅使用 53h 操作码(不带前缀)也会产生相同的结果:
根据this site,REX前缀的布局如下:
所以40h 操作码似乎什么也没做。有人能解释一下它的目的吗?
【问题讨论】:
-
这里似乎有两个问题:1)它有什么作用。 2)为什么会在那里?它的作用(根据我正在阅读的参考资料)什么都不是。那么,它为什么会在那里?我的第一个猜测与 Nathan 的相同:某种对齐/填充。但是我在该代码中看不到任何可以从那里的对齐中受益的东西。所以,这是一个理论:通过 kernel32.dll 进行分页,有很多
nops。这几乎就像有人试图将某些代码保留在特定地址。所以也许rex push rbx被修补了一些短 1 字节的代码? -
这很奇怪,
push rbx有 64 位操作数大小,所以如果他们要使用 REX 前缀填充,它应该使用REX.W=1(0x48)(不需要,因为 @987654339 @ 已经默认为 64 位操作数大小)。我想这证实了REX.W=0被所有现有 CPU 安全地忽略为push,但是,如果你在 Windows 上的kernel32.dll中找到它。哦,NASM 将push r12编码为41 54,即使用 REX.W=0,B=1`。显然我需要在How many bytes does the push instruction pushes onto the stack when I don't specify the operand size? 上更新我的答案 -
该网站的链接已损坏。
-
@duru,链接现在是X86-64 Instruction Encoding
标签: windows 64-bit x86-64 disassembly opcode