为什么这么多的汇编语法都包含逗号?
Why do so many assembler syntaxs include commas?
我目前正在开发一个小汇编程序,我一直想知道为什么我在网上找到的几乎所有汇编程序语法都使用逗号并且看起来像这样:
MOV eax, 123
我考虑这个的原因如下:
- 在我看来,空格作为分隔符似乎已经足够好了,因此在可读性方面没有任何好处
- 将逗号作为(n 个额外的)分隔符使解析器的性能更高 complex/less(即使只是勉强)
- 我会认为,尤其是在早期,当汇编程序是自举的或与其他汇编程序一起编写时,包含该语法会很麻烦
我能在网上找到的一个例外是这张来自维基百科的图片:
https://en.wikipedia.org/wiki/File:Motorola_6800_Assembly_Language.png
现在我不知道逗号是不是更现代的东西(x86/arm/etc.汇编),但我的问题是:
何时、何地以及为什么使用这种逗号语法?
如果您的汇编程序支持符号表达式或体系结构具有复杂的寻址模式,显式分隔符将消除歧义。
MASM 和 TASM 支持 mov [var], 1
的语法 mov var, 1
(大小根据上下文推断)。
mov var +2 -3
是什么意思? mov var+2, -3
还是 mov var, +2-3
? (两者都有效)。
如果寻址模式具有类似 (R1)+2
的形式(例如,对于某种写回),则同样适用,MOV (R1) +3 +2
是不明确的。
在我看来,逗号使代码更具可读性,我的流程如下:
- 扫描第一个字并阅读,这是操作码。
经过多年的训练,人类从历史开始就用空格分隔单词,我也学会了这种自动操作。
- 根据逗号分隔其余文本。
无需在脑子里解析 LTR 或其他任何东西,只需找到外部逗号即可获得操作数的数量及其近似形式。
- 如果猜测的指令听起来不合时宜或其他任何内容,请对该行执行完整、缓慢的 LTR 解析。
这让我可以快速浏览汇编,但这只是我个人的意见。
最后,这是设计师的决定,Intel used it since the 8008 这是 4004 的芯片继任者,是第一款(如果不是第一款)商用微芯片之一。
它可能只是卡住了。
处理逗号有点复杂,这是一个需要考虑的特殊情况,但归结为:这种语法是为人类还是计算机设计的?
在像 mov (r0), r3
这样的表达式中,括号不需要配对(mov (r0, r3
仍然是明确的),这样更容易解析,但是:
来自XKCD
我目前正在开发一个小汇编程序,我一直想知道为什么我在网上找到的几乎所有汇编程序语法都使用逗号并且看起来像这样:
MOV eax, 123
我考虑这个的原因如下:
- 在我看来,空格作为分隔符似乎已经足够好了,因此在可读性方面没有任何好处
- 将逗号作为(n 个额外的)分隔符使解析器的性能更高 complex/less(即使只是勉强)
- 我会认为,尤其是在早期,当汇编程序是自举的或与其他汇编程序一起编写时,包含该语法会很麻烦
我能在网上找到的一个例外是这张来自维基百科的图片: https://en.wikipedia.org/wiki/File:Motorola_6800_Assembly_Language.png
现在我不知道逗号是不是更现代的东西(x86/arm/etc.汇编),但我的问题是:
何时、何地以及为什么使用这种逗号语法?
如果您的汇编程序支持符号表达式或体系结构具有复杂的寻址模式,显式分隔符将消除歧义。
MASM 和 TASM 支持 mov [var], 1
的语法 mov var, 1
(大小根据上下文推断)。
mov var +2 -3
是什么意思? mov var+2, -3
还是 mov var, +2-3
? (两者都有效)。
如果寻址模式具有类似 (R1)+2
的形式(例如,对于某种写回),则同样适用,MOV (R1) +3 +2
是不明确的。
在我看来,逗号使代码更具可读性,我的流程如下:
- 扫描第一个字并阅读,这是操作码。
经过多年的训练,人类从历史开始就用空格分隔单词,我也学会了这种自动操作。 - 根据逗号分隔其余文本。
无需在脑子里解析 LTR 或其他任何东西,只需找到外部逗号即可获得操作数的数量及其近似形式。 - 如果猜测的指令听起来不合时宜或其他任何内容,请对该行执行完整、缓慢的 LTR 解析。
这让我可以快速浏览汇编,但这只是我个人的意见。
最后,这是设计师的决定,Intel used it since the 8008 这是 4004 的芯片继任者,是第一款(如果不是第一款)商用微芯片之一。
它可能只是卡住了。
处理逗号有点复杂,这是一个需要考虑的特殊情况,但归结为:这种语法是为人类还是计算机设计的?
在像 mov (r0), r3
这样的表达式中,括号不需要配对(mov (r0, r3
仍然是明确的),这样更容易解析,但是:
来自XKCD