首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NASM产生意外的额外操作数大小前缀。

NASM产生意外的额外操作数大小前缀。
EN

Stack Overflow用户
提问于 2022-11-01 01:27:32
回答 1查看 34关注 0票数 0

我在Linux amd64上运行NASM时遇到了问题。

在单个指令nasm上运行mov eax, 0x12345678会产生6个字节:

代码语言:javascript
运行
复制
00000000 <.data>:
   0:   66 b8 78 56             mov    $0x5678,%ax
   4:   34 12                   xor    $0x12,%al

但是,在AT&T格式的同一指令上使用asmov $0x12345678, %eax会产生5个字节的正确结果:

代码语言:javascript
运行
复制
0000000000000000 <.text>:
   0:   b8 78 56 34 12          mov    $0x12345678,%eax

我错过了NASM的什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-01 01:48:31

NASM认为你正在组装16位代码,看到一条32位指令,并在上面打一个大小覆盖前缀。然后反汇编程序认为您正在拆卸32位代码,被大小覆盖前缀弄糊涂了,并假设它是2条指令。

GAS认为您正在组装32位代码,所以它不会生成大小覆盖前缀。

您可以通过弄清NASM为什么认为您正在组装16位代码来修复NASM。它是“平面二进制”输出文件格式的默认格式,如果是这样的话,您可以在32位指令/s之前放置一个bits 32指令来修复它。

或者,也许你试图组装16位代码和气体是错误的。在这种情况下,您可能需要在16位代码之前的某个地方使用.code16指令。

注意,大小覆盖前缀的工作方式类似于切换--如果默认大小为16位,则前缀将使指令32位;如果默认大小为32位,则相同的前缀将使指令16位。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74270600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档