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