为啥 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的主要内容,如果未能解决你的问题,请参考以下文章

错误:'nasm' 不是内部或外部命令,也不是可运行的程序

为啥在尝试添加引用时会看到“无法发出程序集:引用的程序集...没有强名称”?

xcode - 使用命令行构建应用程序会导致配置文件错误

使用GDB for NASM程序集中断本地标签

Linux内核使用哪个程序集?真的是NASM吗?

NASM 程序集将输入转换为整数?