20 个字节而不是 20 个字节是多少?

How is a tword ten bytes instead of 20?

所以当我偶然发现 this helpful thread 时,我试图找出 zwordyword 的大小,其中包含所有大小的列表,但有一件事让我感到困惑。它在编辑中说 tword 是 10 个字节,但是那..对我来说真的没有意义。一个字是两个字节,所以 tword 应该是 10 个字也就是 20 个字节,不是吗?我发现更奇怪的是 oword 确实是 8 words/16 字节,所以 oword 实际上比 tword 大。对这种奇怪的命名选择有解释吗?

在NASM中,所有大于1个字节的东西都是*WORD,例如yword 表示 YMM 向量的大小。 (@Michael 在评论中指出了这一点;对我来说这听起来像是一种有意的模式。)

这导致了 TWORD 这个愚蠢的名字,一个由单词组成的十字节的东西?不要考虑将名称分解成多个部分,但如果你忍不住的话,这可能是你最好的选择。

TBYTE 被 MASM / TASM(和 GAS .intel_syntax 根据 objdump -drwC -Mintel 使用)作为一个有意义/明智的名称更有意义。 NASM 为了与现有汇编程序保持一致,当然希望名称中有一个 T。

或者,@fuz 建议 T 代表“临时”,作为 x87 的额外精度与 IEEE binary64 [=17] 的主要预期用例=] 在计算过程中是临时的。通常(对于那个用例)它们可以只存在于寄存器中,但有时你可能想要溢出它们。当然,您可以将它们作为 long double 扩展精度与 (significantly) worse load/store performance than double, or have constants in that format. See also Bruce Dawson's Intermediate Floating-Point Precision 文章一起使用,以获得更多真实世界的 x87 和编译器内容,这是优秀系列的一部分。


NASM 有类似 resb / resd / rest / ... / 保留 space 的指令(用于 BSS),和 db / dd / dt / .... 它们只有 1 个字符表示大小,除了 Byte 和 Word,它基本上是一个大小代码。而且与 MASM 不同的是,没有 DWORD 指令可以用来替代 DD,因此“尺寸代码”相对来说更重要,而且它所粘贴的东西也更规则化。

当然 NASM 确实已经必须将 BYTE 和 WORD 解析为操作数大小的代码,因此很难想象 TBYTE 实际上会使解析器更难编写或维护。 (正如问题中链接的问答中的一个答案所示,NASM 中的反汇编器或其他东西有一个开关,其中每个字符串都是完全分开的,而不是 %cWORD 用于大小 > 2,但解析仍然可能不同.)

这似乎是 合理的理论 NASM 的设计师想要坚持 *WORD 模式,但我没有任何信息在上面并且没有去寻找任何邮件列表文档。 IDK 如果 NASM 是在 public 中协作设计的,或者它几乎是原作者。无论哪种方式,我都猜测在设计语法的早期阶段,这对某些人来说似乎是个好主意。


FASM 显然支持相同大小的 TBYTE 和 TWORD 名称,但 NASM 支持 TWORD。向该语言添加一个新的保留/特殊关键字可能会破坏向后兼容不建议使用 TBYTE 作为符号名称的代码,或者可能 NASM 开发人员根本不想更改。