为什么这么多汇编语法都包含逗号?

时间:2018-02-20 10:05:09

标签: parsing assembly syntax comma

我目前正在开发一个小的汇编程序,我很想知道为什么我在网上找到的几乎所有汇编语法都使用逗号并看起来像这样:

MOV eax, 123

我正在考虑的原因如下:

  • 在我看来,作为分隔符的空白看起来不错,所以在可读性方面没有任何好处
  • 将逗号作为(另外的)分隔符使得解析器更复杂/性能更差(即使只是略微)
  • 我会特别想在早期,当汇编程序被引导或与其他汇编程序一起编写时,包含该语法将是一件麻烦

我在网上找到的一个例外是来自维基百科的这张照片: https://en.wikipedia.org/wiki/File:Motorola_6800_Assembly_Language.png

现在我不知道逗号是否更现代(x86 / arm / etc。汇编程序),但我的问题是:

这个逗号语法何时,何地以及为何使用?

1 个答案:

答案 0 :(得分:7)

如果汇编程序支持符号表达式或者体系结构具有复杂的寻址模式,则显式分隔符将消除歧义。

MASM和TASM支持mov var, 1的语法mov [var], 1(从上下文中推断出大小)。
mov var +2 -3是什么意思? mov var+2, -3mov var, +2-3? (两者都有效)。

如果寻址模式具有类似(R1)+2的形式(例如,对于某种回写),MOV (R1) +3 +2是不明确的,则同样适用。

在我看来,逗号使代码更具可读性,我的流程如下:

  1. 扫描第一个单词并阅读,这是操作码 经过多年的训练,人类从历史开始就用空格分隔词语,我也接受了这种自动化。
  2. 将剩下的文字分开看逗号 无需精神上解析LTR或任何东西,只需找到外部逗号,即可得到操作数及其近似形式。
  3. 如果猜到的指令听起来不合适或者任何事情,请执行完整,慢速,LTR,解析该行。
  4. 这让我可以很快地浏览装配,但这只是我个人的意见。 最后,这是设计师的电话,Intel used it since the 8008,这是4004的芯片继承者,是第一个(如果不是第一个)商用微芯片之一。
    它可能只是卡住了。

    处理逗号有点复杂,这是一个需要考虑的特殊情况,但这一切都归结为:这种语法是针对人类还是计算机进行的? 在像mov (r0), r3这样的表达式中,括号不需要配对(mov (r0, r3仍然是明确的),这将更容易解析,但是:

    XKCD opinion on unmatching parenthesis
    来自XKCD