【发布时间】:2014-07-30 15:10:18
【问题描述】:
我需要测试 Windows 模拟器是否正确识别和处理过长(超过 15 个字节长)的指令。我用 NASM 编译代码。 我知道指定太长指令的唯一方法是在指令中添加前缀。假设我执行以下操作:
rep O32 rep O32 rep O32 rep O32 rep O32 mov eax, [fs:0]
在这种情况下,我应该得到一个 16 字节长的指令,因为 mov eax, [fs:0] 是一个 6 字节长的指令,加上 10 个 O32 和 rep 前缀等于 16 个字节。
至少理论上是这样的......但是当我用 NASM 编译它并反汇编生成的二进制文件时,我发现不必要的前缀从那里被拔掉了:只有 1 个 rep 前缀保留,显然 fs段前缀。因此,指令的总长度减少到只有 7 个字节。我想这应该是它应该如何工作的,但是有没有办法让它的指令长度实际上超出界限?
【问题讨论】:
-
指令前的
db指令能提供你需要的吗? -
NASM 很可能不会生成长度大于 15 字节的指令的二进制文件,这是 Intel 对有效指令的长度限制。相反,您可以自己制作二进制文件,编写有效指令(任何人),并预先添加 16 个 NOP 指令,当组装文件时,将 0x90 字节(NOP 指令)替换为您想要的前缀。
-
我不确定
db指令会有什么好处。我的猜测是,如果它是多余的,它也会被 NASM 忽略。无论如何我会尝试的。我还考虑将编辑二进制文件本身作为最后的手段。感谢您的回答。 -
NASM 不会删除数据指令。它无法知道它应该是数据还是指令的一部分。
-
好的,起初我不明白你使用
db指令是什么意思,但现在我明白了,它可以工作了!对于任何好奇、需要这个和/或像我一样慢的人,这里有一个在 NASM 中生成超过 16 个字节的指令的示例:db 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66mov ax, 1谢谢大家!