我在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
谢谢,
答案 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