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