操作数后预期的逗号,冒号,装饰器或行尾

时间:2014-12-22 09:29:20

标签: c assembly 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

谢谢,

2 个答案:

答案 0 :(得分:7)

从语法上讲,使用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代码关联的程序集。

答案 1 :(得分:-1)

似乎由于逗号后的空格而发生错误。尝试更改示例声明

mov     DWORD PTR [esp+12], 753664

mov     DWORD PTR [esp+12],753664