【问题标题】:Where in the NASM spec is the syntax FFFFh for hexadecimal number not allowed?NASM 规范中哪里不允许十六进制数的语法 FFFFh?
【发布时间】:2022-11-25 23:46:01
【问题描述】:

我正在尝试用 ASM 组装一小段代码。此代码将 CX 设置为零,将 AX 设置为 1。我的代码:

mov cx, 0000h
mov ax, ffffh

但我收到此错误:

$ nasm foo.asm
foo.asm:2: error: symbol `ffffh' not defined

我可以通过写 mov ax, 0ffffh 来解决这个错误。但是为什么它不理解ffffh 语法呢?在 NASM 文档的哪个位置指定允许使用什么十六进制语法?

我读过 https://nasm.us/doc/nasmdoc3.html#section-3.4.1 但在那里找不到任何不允许 ffffh 语法的内容。我错过了什么?

我阅读了其他一些类似的问题,也作为 cmets 提供给这个问题。但它们似乎都没有指向确认数字必须以数字开头的某些权威文档或规范。如果有人可以指出 NASM 文档中的确切摘录或证实这一点的某些规范,那将回答这个问题。

【问题讨论】:

  • f 是一个字母和字母开始符号。数字必须以数字开头,因此您需要以 0 开头。
  • 这是否回答了您的问题(链接的问题是关于 MASM 而不是 NASM,但它们支持十六进制常量的类似语法)? How do I write letter-initiated hexadecimal numbers in masm code?
  • @msaw328:How to represent hex value such as FFFFFFBB in x86 assembly programming? 有一个专门涵盖 NASM 的答案,并提到了同样的原因。
  • @PeterCordes 该问题的 answers 之一链接到我引用的问题。我想指出原始来源。
  • @msaw328:MASM 的回答实际上并不比我一年后的回答更能说明问题。我主要在我现有的答案中添加了一个指向它的链接,以便在它是更合适的重复项(MASM 问题)的情况下帮助找到它。我检查了编辑历史,我的 NASM/GAS/MASM 回答说在我找到之前需要前导数字并将该链接添加到早期的问答中。所以它不是我回答的“原始来源”。它们都不是原始来源(如 NASM 手册),只是重新解释一个共同的事实。

标签: assembly hex nasm


【解决方案1】:

令人惊讶的是,我没有看到明确提及数字文字必须以十进制数字开头的语法规则。在您链接的部分中间接提到了它,以 $ 符号为前缀的十六进制数字必须在 $ 之后有一个数字而不是字母,但他们没有说“必须仍然”甚至暗示这总是必需的。

早些时候在3.1中说标识符必须以字母开头,但并没有说只有标识符才能以字母开头。 (因为那不是真的,所以可以注册名称和指令助记符。但不是数字文字。)


这可能是那些如此“明显”且众所周知(对开发人员/手册作者而言)是真实的事情之一,以至于他们忘记在手册中的任何地方明确写下它。

不过,十六进制示例确实显示了它,包括 0c8h 但没有 c8h。他们在不需要前导零的其他基础中显示示例。


一些事情使得以字母字符开头的标记永远不应该被解析为数字文字是“显而易见的”和必要的:

  • AH 到 DH 是寄存器名称,因此不得解析为数字。如果 EH 是数字文字而 DH 不是,那将是非常奇怪的。 (寄存器名称与符号名称而不是数字符合相同的模式是正常的。除非你在 PowerPC 上,否则 GAS 语法只使用裸数字来表示寄存器和立即数;你必须通过指令记住哪个位置。或者使用gcc -mregnames。但这是一个 IBM 架构,所以它当然使用了奇怪的约定,比如向后编号。)

  • 如果 abcdefgh 是一个符号名称,而 abcdefh 是一个数字文字,那就太奇怪了(因为没有 g,它都是有效的十六进制数字和尾随的 h。)

  • 不能使用像each:这样的英文单词作为标签/符号名称,出于同样的原因你不能使用1234:。 (我试过了;foo.asm:1: error: label or instruction expected at start of line)。这是一个有效的 C 标识符,所以不能使用它会很不方便。 $eax 允许您将其用作符号名称,但 NASM 中的 $1234 等同于 0x1234$ 作为十六进制指示符执行​​双重任务,因此如果事物使用数字。

  • 也许最重要的是,这就是早期用于 DOS 的 x86 汇编程序的工作方式, NASM 从中挑选了语法的好部分。像 MASM,还有 A86 和 as86 之类的东西。
    在 NASM 的早期,人们从其他汇编器转向 NASM,并且已经知道这个规则。 (How to represent hex value such as FFFFFFBB in x86 assembly programming?提到了 NASM 以外的一些其他汇编程序。)


这些都不是证明手册中的遗漏,只是解释而已。在 3.4.1 中提及这一点的措辞调整将是一个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2014-09-19
    • 2023-02-15
    • 2016-10-05
    • 2015-02-22
    相关资源
    最近更新 更多