【问题标题】:Is it possible to keep redundant prefixes for an assembly instruction in NASM?是否可以为 NASM 中的汇编指令保留冗余前缀?
【发布时间】: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 个 O32rep 前缀等于 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 谢谢大家!

标签: assembly x86 nasm


【解决方案1】:

您声明mov eax, [fs:0] 是一个 6 字节长的指令。这意味着您使用的是 16 位代码。 (32 位代码会占用 7 个字节)

因此mov ax,1 将使用 3 个字节。您已经添加了 12 个操作数大小前缀。 总共最多 15 个,这仍然是完全合法的。因此,您尚未测试您的“Windows 模拟器”。

如果提出的解决方案是 32 位代码,那么总数将是 16 个字节。

只是好奇:模拟器有抱怨吗?

【讨论】:

  • 我使用的是 32 位“普通”x86 代码。 mov eax, [fs:0] 是 6 字节长:64 A1 00 00 00 00。我不确定第 7 个字节是什么。 mov ax, 1 是 4 字节长:66 B8 01 00;哦,是的,它确实抱怨。我在上面的评论中给出的示例确实是 16 个字节长,它会导致异常。如果我去掉 0x66 前缀之一,它运行良好。
猜你喜欢
  • 2015-04-21
  • 1970-01-01
  • 2018-04-28
  • 2011-12-20
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多