我在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
Run Code Online (Sandbox Code Playgroud)
谢谢,
从语法上讲,使用NASM没有PTR关键字.删除它们允许代码编译为undefined ___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
Run Code Online (Sandbox Code Playgroud)
然后编译:
$ nasm -felf -o asm_recompile.o asm_recompile.asm
Run Code Online (Sandbox Code Playgroud)
返回的唯一错误是:
asm_recompile.asm:5: error: symbol `___main' undefined
Run Code Online (Sandbox Code Playgroud)
通常,NASM装配程序要求:
section .text
global _start
_start:
Run Code Online (Sandbox Code Playgroud)
注意:仅仅因为您编译为程序集gcc,不要期望能够elf使用NASM 简单地将代码编译回工作的可执行文件.gcc默认情况下,会生成AT&T与NASM不兼容的语法.甚至告诉gcc使用-masm = intel选项输出程序集来生成intel格式程序集也不会在NASM中按原样编译.gcc使用as的汇编.as由于gcc默认情况下使用了无数的编译器脚本和选项,因此您也可以使用不同的运气.您可以获得的最佳检查过程gcc是使用该-v, --verbose选项将您的c程序编译为可执行文件.这将显示所有编译器命令gcc用于生成与c代码关联的程序集.