Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 一个2个10字节而不是20字节是怎么回事?_Assembly_Nasm - Fatal编程技术网

Assembly 一个2个10字节而不是20字节是怎么回事?

Assembly 一个2个10字节而不是20字节是怎么回事?,assembly,nasm,Assembly,Nasm,因此,我试图找出zword和yword的大小,但我无意中发现了所有大小的列表,但有一件事让我困惑。它在编辑中说atword是10个字节,但这对我来说真的没有意义。一个单词是两个字节,所以一个tword应该是10个单词,也就是20个字节,不是吗?我发现更奇怪的是,oword实际上是8个字/16个字节,所以oword实际上比tword大。对于这种奇怪的命名选择有什么解释吗?在NASM中,所有大于1字节的东西都是*WORD,例如,YMM向量大小的yword。(@Michael在评论中注意到了这一点;对

因此,我试图找出
zword
yword
的大小,但我无意中发现了所有大小的列表,但有一件事让我困惑。它在编辑中说a
tword
是10个字节,但这对我来说真的没有意义。一个单词是两个字节,所以一个
tword
应该是10个单词,也就是20个字节,不是吗?我发现更奇怪的是,
oword
实际上是8个字/16个字节,所以
oword
实际上比
tword
大。对于这种奇怪的命名选择有什么解释吗?

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

这就引出了一个愚蠢的名字叫TWORD,一个由单词组成的十字节的东西?不要想太多把名字分成几个部分,但是如果你不能控制它,那可能是你最好的选择

MASM/TASM使用的
TBYTE
(和GAS
。根据
objdump-drwC-Mintel
)的英特尔语法更具意义。NASM当然希望在名称中加入一个T,以便与现有的汇编程序保持一致

或者,@fuz建议,
T
代表“临时”
,因为x87的额外精度与IEEE binary64
double
的主要预期用途是在计算过程中作为临时值。通常(对于那个用例),它们可以只存在于寄存器中,但有时您可能想要溢出它们。当然,您可以使用它们作为
长双精度
扩展精度,使用小于
双精度
,或者使用该格式的常量。另请参阅Bruce Dawson的文章,了解更多真实世界的x87和编译器内容,这是一个优秀系列的一部分


NASM的指令类似于
resb
/
resd
/
rest
/../该预留空间(用于BSS)和
db
/
dd
/
dt
/。。。。它们的大小只有一个字符,除了字节和单词,基本上是一个大小代码。与MASM不同的是,没有可以用作
DD
替代品的
DWORD
指令,因此“大小码”相对更重要,它所固定的东西更规范

当然,NASM已经必须将字节和字解析为操作数大小的代码,因此很难想象TBYTE会使解析器的编写或维护变得更加困难。(正如问题中链接的Q&A上的一个答案所示,NASM中的反汇编程序或其他东西有一个开关,其中每个字符串都是完全独立的,而不是
%cWORD
对于大小>2,但解析可能仍然不同。)

这似乎是NASM的设计师想要坚持
*WORD
模式背后的一个似是而非的理论,但我没有这方面的信息,也没有去寻找任何邮件列表文档。IDK如果NASM是在公共场合合作设计的,或者它几乎是原始作者。无论哪种方式,我都在猜测,在设计语法的早期,这对某些人来说似乎是个好主意



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

在MASM和TASM中,它被称为
TBYTE
(即十个字节)。我不知道NASM开发人员为什么选择TWORD这个名字。可能是因为除了
字节
之外的所有其他类型都被称为
*WORD
。我想
QWORD
(对于Quint-Word)应该更准确,但是
QWORD
已经被采用了。我没有使用MASM或TASM,所以这很有趣。你的推理似乎有点道理。@Michael
T
代表暂时,而不是十。毕竟,指令
fstptword
被掩盖为“浮点存储临时和pop”。@fuz我指的是TASM/MASM的
TBYTE
中的
T
。我检查了手册,它说NASM使用
tword
“出于历史原因”。我不确定这些历史原因是什么,但你的理论似乎很有道理。@mediocrevegateable 1:这与“当时似乎是个好主意”是一致的,然后决定,一旦有人提出了与你相同的观点,就不改变语言的关键词,从而打破向后兼容。(即使引入一个新的关键字并保留TWORD作为替代,理论上也可能会破坏碰巧使用TBYTE作为标签名或其他东西的代码。)是的,我认为这会填补一些空白。在FASM中,
TBYTE
TWORD
也是10字节的同义词。此外,还有与6字节同义的
FWORD
PWORD
。根据,在8087数据表中,
fstpt
明确称为“浮点临时存储”