【问题标题】:Comma, colon, decorator or end of line expected after operand操作数后应有逗号、冒号、装饰符或行尾
【发布时间】:2015-02-20 09:14:44
【问题描述】:

我正在用 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

谢谢,

【问题讨论】:

  • 如果在调用 main 的语句后删除分号,会出现错误吗?语句中是否也允许使用空格,例如 move byte ptr[eax], 65?尝试删除 65 之前的空格。
  • 你是如何用gcc 编译这个的? gcc -S -masm=intel -o your.asm your.c?
  • 是的,我就像 David C.Rankin 所展示的那样编译!

标签: c assembly gcc x86 nasm


【解决方案1】:

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

【讨论】:

  • call ___main: 是一个语法错误,即使你已经完成了extern ___main。分号; 是注释字符,而不是: 冒号。并且您不会在您提到的符号名称上使用:,只有在使用标签来定义它们时。 error: invalid combination of opcode and operands 因为包含:call 的唯一语法是对seg:off 地址的远调用,而main 不是段,也没有偏移量。
【解决方案2】:

似乎错误是由于逗号后的空格引起的。尝试更改示例语句

mov     DWORD PTR [esp+12], 753664

mov     DWORD PTR [esp+12],753664

【讨论】:

  • 这个句法调整修复了我的错误。
猜你喜欢
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多