C 操作数后应为逗号、冒号、装饰符或行尾
我用c语言编程,我把c代码编译成汇编代码,但是当我用NASM汇编程序重新编译代码时,它给了我一个错误 操作数后应为逗号、冒号、装饰符或行尾。这种情况发生在 第6行、第7行和第8行。请帮我做这个C 操作数后应为逗号、冒号、装饰符或行尾,c,assembly,nasm,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
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
谢谢,似乎错误是由于逗号后的空格造成的。尝试更改示例语句
mov DWORD PTR [esp+12], 753664
到
在语法上,使用NASM时,没有
PTR
关键字。删除这些允许代码编译到未定义的\uuuuuuu 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
可执行文件<默认情况下,code>gcc生成与NASM不兼容的AT&T
语法。即使使用-masm=intel选项告诉gcc输出程序集以生成英特尔格式的程序集,也不会像NASM中那样编译gcc
使用as
作为汇编程序。由于默认情况下使用了大量的编译器脚本和选项,gcc
,因此使用as
也会有不同的运气。对使用gcc
的过程的最好检查是使用-v,--verbose
选项将c程序编译为可执行程序。这将显示用于生成与c代码关联的程序集的所有编译器命令gcc
。如果在调用main的语句后删除分号,是否会发生错误?语句中是否也允许使用空格,例如移动字节ptr[eax],65?尝试删除65之前的空白。您是如何使用gcc
编译此代码的gcc-S-masm=intel-o your.asm your.c
?是的,我像大卫·c·兰金那样编译!这个语法调整修复了我案例中的错误。
section .text
global _start
_start: