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

use*_*609 1 c assembly nasm

我在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)

谢谢,

Dav*_*ica 7

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