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

时间:2016-11-12 04:00:06

标签: 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

1 个答案:

答案 0 :(得分: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