NASM:声明字符串时"操作数后预期的逗号,冒号,装饰器或行尾"

Rob*_*lay 2 assembly nasm

我正在尝试使用NASM来制作汇编代码程序,但由于某种原因它不断给我一个错误.它说它在我声明一个字符串后需要一个逗号,冒号,装饰器或行尾,但我不知道它是如何成为一个问题请告知.

section .text
        global main
main:
        mov edi,str
lab3:
        cmp [edi],' '
        je lab1

        cmp [edi],0x0
        je lab2

        mov eax,4
        mov ebx,1
        mov ecx,edi
        mov edx,1
        int 0x80
        inc edi
        jmp lab3
lab1:
        inc edi
        mov eax,4
        mov ebx,1
        mov ecx,nwln
        mov edx,1
        int 0x80
        jmp lab3

lab2:
        mov eax,1
        int 0x80

section .data
str db 'this is a test',0x0     ;this is the line giving the error
nwln db 0xa
Run Code Online (Sandbox Code Playgroud)

Pet*_*des 6

STR(存储任务寄存器)是指令助记符.您将它用作没有冒号的标签. str: db ...本来会有用的.

YASM在此处提供了更有用的错误消息: string.asm:33: error: unexpected DB/DW/etc. after instruction


无论您是标记代码还是数据,最好始终使用:标签名称.它对于人类读者来说更清晰,并且对未来的指令助记符或汇编程序指令更具前瞻性.

构建时-Worphan-labels也是一个好主意,所以如果你自己写一些像cqde(不cqde:)这样的东西就会得到一个警告.没有该选项,它会在该行添加标签.有了这个选项,你会得到一个警告,并注意到你输了cdqe!(或任何其他无操作数x86指令.)


顺便说一句,cmp byte [edi],' '在使用带有立即数和内存操作数的指令时,不要忘记使用操作数大小修饰符,因为它不会使用不明确的操作数大小进行汇编.

另外,使用有意义的标签名称.喜欢.space_found而不是lab1.