我正在尝试使用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

最佳答案

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

关于assembly - NASM:声明字符串时,“预期在操作数之后的逗号,冒号,修饰符或行尾”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40559438/

10-11 18:42