Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 操作数后应为逗号、冒号、装饰符或行尾_C_Assembly_Nasm - Fatal编程技术网

C 操作数后应为逗号、冒号、装饰符或行尾

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

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

谢谢,

似乎错误是由于逗号后的空格造成的。尝试更改示例语句

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: