操作数后应有逗号、冒号、修饰符或行尾

标签 c assembly gcc x86 nasm

我在用 c 编程,我将 c 代码编译为汇编代码,但是当我用 NASM 汇编程序重新编译代码时,它给我一个错误

操作数后预期的逗号、冒号、修饰符或行尾。这发生在 第 6 行,第 7 行和第 8 行。请帮我解决这个问题。

push    ebp
mov     ebp, esp
and     esp, -16
sub     esp, 16
call    ___main ;
mov     DWORD PTR [esp+12], 753664
mov     eax, DWORD PTR [esp+12]
mov     BYTE PTR [eax], 65
leave
ret

谢谢,

最佳答案

语法上,使用 NASM,没有 PTR 关键字。删除这些允许代码编译到未定义的 ___main。例如:

push    ebp
mov     ebp, esp
and     esp, -16
sub     esp, 16
call    ___main:     ; semi-colon starts comment (should be colon)
mov     DWORD [esp+12], 753664
mov     eax, DWORD [esp+12]
mov     BYTE [eax], 65
leave
ret

然后编译:

$ nasm -felf -o asm_recompile.o asm_recompile.asm

返回的唯一错误是:

asm_recompile.asm:5: error: symbol `___main' undefined

通常,NASM 汇编程序需要:

section .text
    global _start

    _start:

注意:仅仅因为您使用 gcc 编译成汇编,不要指望能够简单地将代码编译回可以工作的 elf 使用 NASM 可执行。 gcc 默认生成与 NASM 不兼容的 AT&T 语法。即使告诉 gcc 使用 -masm=intel 选项输出程序集以生成 intel 格式程序集,也不会在 NASM 中按原样编译。 gcc 使用 as 作为汇编器。由于 gcc 默认使用无数编译器脚本和选项,使用 as 也会有不同的运气。使用 gcc 获得的过程的最佳检查是使用 -v, --verbose 选项将您的 c 程序编译为可执行文件。这将显示 gcc 用于生成与 c 代码关联的程序集的所有编译器命令。

关于操作数后应有逗号、冒号、修饰符或行尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27599858/

相关文章:

c - 使用 lex 检测 float

c - 如何使用 getrusage 读取 C 中的页面错误?

assembly - 使用 cmpq 和 je 时的无限循环

c++ - 在 C 函数末尾的循环中,break 和 return 之间是否存在显着的性能差异?

使用预处理器检查表达式是否为左值

assembly - iret 和 iretd,iretq 和有什么不一样?

gcc - 用C代码(GCC)定义程序段

C 中包含 ljpeg 库时出现编译错误

c - "char"是一种特殊类型的整数变量吗?

c - 如何在 C 或 ASM 中获取调用函数的传入参数