【问题标题】:NASM: "comma, colon, decorator or end of line expected after operand" when declaring a stringNASM:声明字符串时,“操作数后应有逗号、冒号、装饰符或行尾”
【发布时间】:2016-11-12 04:00:06
【问题描述】:

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

【问题讨论】:

  • nasm 要求标签后有冒号,即str: db 'this is a test',0x0
  • @Jester:不,它没有,只有当它们也是有效的助记符时:P 这就是 -Worphan-labels 选项存在的原因。将str 更改为str1 时,OP 的程序会组装。 (当然,cmp mem, immediate 指令中缺少的操作数大小除外)
  • 最好一直使用它,少一个头痛。另外,如果明年 intel 引入与您的标签名称冲突的新指令会发生什么......
  • @Jester:完全同意它解决了问题并且是风格/面向未来的好主意,只是不是从语言规则的角度来看。将更新我的答案以提出建议。

标签: assembly nasm


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-20
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多