为啥 Xcode 命令行 nasm 程序集发出错误:unknown use of instruction mnemonic without a size suffix
Posted
技术标签:
【中文标题】为啥 Xcode 命令行 nasm 程序集发出错误:unknown use of instruction mnemonic without a size suffix【英文标题】:Why is the Xcode command line nasm assembly issuing error: unknown use of instruction mnemonic without a size suffix为什么 Xcode 命令行 nasm 程序集发出错误:unknown use of instruction mnemonic without a size suffix 【发布时间】:2019-02-10 20:53:45 【问题描述】:我的目标是使用 Xcode (10.2-beta) 为 MacOS (14.1) 编写 C 和汇编;我想用 NASM 代替默认的 GNU 编译器,GAS 语法太可怕了。
顺便说一句,虽然我将 Xcode 配置为使用 NASM,如下所示,我怀疑它没有使用它!
我使用 GNU 编译器构建了我的项目。它运行良好。
// main.c
# include <stdio.h>
int myOperation(int a, int b);
int main(int argc, char * argv[])
// insert logic here
int x = 10;
int y = 12;
int z = myOperation(x, y);
printf("The sum of %d and %d is %d\n", x, y, z);
return 0;
// assembly.s
.text
.globl _myOperation
_myOperation:
add %esi, %edi
mov %edi, %eax
ret
我安装了 XCode 命令行工具并更改了构建规则以编译 NASM 文件。 C文件也一样:
// assembly.s
.text
.globl _myOperation
_myOperation:
add edi, esi
mov eax, edi
ret
建筑规则
我收到以下错误:
/Users/rodrigomattososilveira/projects/asm/NASM Tutorial/Tutorial_01AA/Tutorial_01AA/assembly.s:12:5: error: unknown use of instruction mnemonic without a size suffix
add edi, esi
^
/Users/rodrigomattososilveira/projects/asm/NASM Tutorial/Tutorial_01AA/Tutorial_01AA/assembly.s:13:5: error: unknown use of instruction mnemonic without a size suffix
mov eax, edi
^
Command CompileC failed with a nonzero exit code
我查看的一些链接:
X86 Assembly/GAS Syntax Compiling NASM Assembly with Xcode in a C/C++ Project Xcode and NASM coding Writing 64 Bit Assembly on Mac OS X 我创建此问题时建议的热门链接【问题讨论】:
带有后缀.s
的文件被视为使用系统自己的汇编程序的AT&T 语法中的汇编文件。使用后缀.asm
(我认为)用于使用 NASM 处理的文件。
错误消息不是来自 NASM。 NASM 不会在 add edi, esi
中发现任何令人反感的内容。
将 .s 后缀替换为 .asm 无效。
【参考方案1】:
我在this Reddit posting找到了提示:
看起来 gas 可以采用 Intel 语法,但您必须使用 .intel_syntax 标志来指定它。
现在,这段代码编译:
.intel_syntax // THIS DID THE TRICK
.text
.global _myOperation
_myOperation:
add edi, esi
mov eax, edi
ret
【讨论】:
那仍然不是 NASM 语法;注意.text
指令和.global
而不是global
。更重要的是,mov eax, foobar
是来自 GAS 的.intel-syntax
中的[foobar]
的负载,与 NASM 不同的是,它是mov reg, imm32
。 GNU .intel_syntax
类似于 MASM。见***.com/tags/intel-syntax/info
正确,我开枪了。不知何故,Xcode 似乎已经放弃了 NASM,所以我不得不放弃尝试使用 Xcode 编写 NASM
我假设您可以使用自定义构建规则配置 Xcode 以手动告诉它如何运行 NASM,即使您是对的,它不再带有内置的 NASM 模式。但实际上,为 OS X 避免 NASM 可能是个好主意。多年来,NASM 的macho64
支持中存在多个严重错误。 Successive sys_write syscalls not working as expected, NASM bug on OS X?Mach-O 64-bit format does not support 32-bit absolute addresses. NASM Accessing Array
@PeterCodes,关于不使用 NASM 的明智建议。除了 GAS,你还有什么推荐的吗
YASM 与 nasm 兼容。我不知道它对 OS X 的支持有多好,而且维护得不好(仍然缺乏 AVX512 支持),但它在 Linux 上的其他方面非常好。以上是关于为啥 Xcode 命令行 nasm 程序集发出错误:unknown use of instruction mnemonic without a size suffix的主要内容,如果未能解决你的问题,请参考以下文章