【问题标题】:error: comma, colon, decorator or end of line expected after operand错误:操作数后应有逗号、冒号、装饰符或行尾
【发布时间】:2018-04-14 21:13:46
【问题描述】:

我正在使用 NASM,x86,它给了我这个错误,我不明白为什么

%包括“io.inc” 节 .data 味精:分贝“你好世界”,0 msg2:分贝 13 计数:dw 13 部分 .text 外部打印 全球 CMAIN 主: 推送ebp mov ebp,esp 移动 eax,味精 mov ebx,count 移动 esi,0 移动 edi,0 添加编辑,计数 dec edi 再次: mov eax, msg[esi] mov msg2[edi],eax 公司 dec edi 再次循环 调用 printf mov esp,ebp 流行音乐 ret

【问题讨论】:

  • 你得到什么错误? “它给了我这个错误”不是错误描述。你的问题是什么?错误表示哪一行?
  • @fuz 错误出现在问题标题中,但一开始我也很困惑,然后编辑甚至添加了更多代码,而这两行在这个特定问题中已经足够了。
  • OP:我快速查看了源代码的其他部分,它看起来像 MASM 风格,即执行 mov ebx,count 可能期望 ebx 加载值 13,但在 NASM 中内存值必须在括号中,因此这会将内存地址count 存储到ebx,而不是内存中的值。不确定您使用的是哪本教程/书籍,但您要么在开始时付出更多努力,不仅要学习 x86 asm,还要学习识别 MASM 与 NASM(小的)语法差异并修复它们,或者您应该切换书籍或汇编器。所有这些选项听起来都不错(甚至可以全部尝试!)。

标签: assembly nasm x86-64


【解决方案1】:

因为这两行不是 NASM 语法。

mov eax, msg[esi] 几乎被解析为mov eax,msg(加载eax,地址为msg),但随后出现意外的[esi] 而不是换行。

mov msg2[edi],eax 很难猜测,解析器是什么样的(mov immediate,eax 不存在),但也不合法。

如果您想使用内存值,请将整个地址计算放在括号内,例如:

        mov eax, [msg+esi]
        mov [msg2+edi], eax

有关内存操作数的完整语法,请参阅NASM documentation - 3.3 Effective Addresses

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多