【问题标题】:Assembly language syntax standard [closed]汇编语言语法标准
【发布时间】:2016-02-29 12:54:48
【问题描述】:

为什么汇编语言语法不同即使对于相同的操作系统和指令集?例如 NASMMASM不同的语法 用于 windows。为什么没有语法标准?

【问题讨论】:

  • 因为作者不喜欢现有的,并认为他们对语法的外观只有正确的想法。
  • There is a standard,只是没人用。 :-)
  • 同样的原因,我们有不同的、不兼容的操作系统在相同的硬件上运行。个人选择。即使使用诸如 C++(具有标准的东西)编译器之类的东西,他们也试图符合,但他们添加了自己的、不兼容的功能,以将它们与竞争对手区分开来,无论出于何种原因(可用性、营销/销售、故意不兼容)。
  • @BoPersson :如果您访问该标准(694-1985 IEEE 标准)的链接,它现在被列为withdrawn standard

标签: assembly syntax nasm masm


【解决方案1】:

出于同样的原因,有多个 Unix shell(bash、zsh、dash、Solaris 的非 POSIX-sh /bin/sh 等):有人决定对该语言进行新的实现(或者主要是-兼容的)因为他们不喜欢现有语言或其特定实现。 (除了功能之外,原因可能包括:旧的实现是非免费的、不能移植到他们想要的平台上、速度慢等)

如果您进行一些挖掘并找到历史,这将是一个更好的问题。哪个先来的?

我一直认为 NASM 更明智,内存引用总是使用[addr],而不是试图从符号声明中推断操作数大小。我认为 NASM 应该允许 mov reg, OFFSET symbol,因此无论您使用哪种汇编程序,您都可以明确地编写可以汇编为 mov r32, imm32 的内容(就像您始终可以将 [mem] 用于 MASM。)虽然您可以定义 @987654328 @ 作为扩展为空字符串的宏。

AT&T 语法来自 Unix,它使用 Unix 通常运行的 RISC 架构的 AT&T 语法。 GNU gcc(或为 x86 发明 AT&T 语法的人)遵循了这一传统。有关 AT&T 语法为何如此奇怪(或多或少)的问题,请参阅this excellent answer

【讨论】:

  • 你不喜欢yasm吗?如果是这样,那为什么?第二个问题。您为“Unix 通常运行的 RISC 架构”编写了文章。我没有意识到这一点。 UNIX 和 C 不是主要在 PDP11 上开发的吗?是RISC吗?它有一个 FLAGS 寄存器吗?如果它没有可以解释为什么 C 不能处理 adc 的 FLAGS 寄存器。
  • @Zboson:我根据 x264/x265 的选择选择了 yasm。它仍然使用 NASM 语法。我没有详细比较 yasm 和 nasm。我认为 yasm 的宏工具略有不同,但我并没有最终在 asm 中编写大量代码并需要宏。是的,Unix 和 C 是从 PDP11 开始的。 It's not a RISC machine, though, and it does have a carry flag。我想我已经读过它的汇编语法是 AT&T 风格的,而且他们最初是从那里得到这个想法的。
  • Yasm 可以执行 AT&T 和 Intel 语法(我认为)。 NASM 只执行 Intel 语法。我认为 Yasm 过去可以更好地处理多字节 NOPS,但我不确定这是否正确。这些是我所知道的唯一区别。
  • @Zboson:YASM 具有 AT&T 模式是正确的。它默认使用长 NOP。我最近读过一次,NASM 默认为短 NOP,除非您使用指令来更改它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2020-09-07
相关资源
最近更新 更多