我正在尝试使用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)
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.
| 归档时间: |
|
| 查看次数: |
2966 次 |
| 最近记录: |