tword、oword和yword操作数的大小是多少?

41
NASM/YASM manual中,twordowordyword操作数的大小是多少?此外,这些名称有什么技巧或基本思想吗?是否有一种方法可以给更大的字长命名逻辑名称?
我知道字长可能因系统而异,NASM的word是2个字节,dword是双倍(4个字节),qword是四倍(8个字节),但是... tword是三倍字长(6个字节)吗?至于owordyword,我甚至想不出一个合理的含义。
请注意,这可能是一个简单的问题,但我找不到答案。在NASM和YASM手册中,这些大小没有被解释,甚至在DQ、DT、DY、RESQ、REST、RESY伪指令中也没有。我在某处读到MASM使用了类似的系统,但也找不到相关信息。

编辑:根据答案,这是完整的列表:

  • 1字节(8位):byteDBRESB
  • 2字节(16位):wordDWRESW
  • 4字节(32位):dwordDDRESD
  • 8字节(64位):qwordDQRESQ
  • 10字节(80位):twordDTREST
  • 16字节(128位):owordDORESODDQRESDQ
  • 32字节(256位):ywordDYRESY
  • 64字节(512位):zwordDZRESZ
2个回答

23

看起来,从nasm源代码来看:

  • 'oword'/'DO'是"word"的8倍(O代表"八字"),与dqword("double-quad")同义; 128位,对应于SSE向量寄存器的大小。
  • 'tword'/'DT'为80位(T代表十个字节),是Intel x87浮点寄存器的完整大小。
  • 'yword'/'DY'为256位,Y可能是Intel AVX扩展中256位向量寄存器的YMM名称的助记符。
  • 'zword'/'DZ'是512位,Z可能是Intel AVX-512扩展中512位向量寄存器的ZMM名称的助记符。

因此,并不是一个严格的命名规则;"它只是增长了"。


这是我第一次听说YWORDDY?)。它是NASM/YASM还是英特尔专用的(即:不是或尚未成为标准)?还有其他关于128位数据的关键字吗? - Jay
没什么头绪,可能不太标准。对于NASM,DO等同于DDQ,OWORD等同于DQWORD。 - Russell Borogove
1
@Jay:这是NASM的事情。(MASM和gas.intel_syntax对于内存操作数大小覆盖使用类似的命名约定,例如vmovdqa ymmword ptr [rdi],ymm0。通常只在反汇编输出中看到这种情况;我想不出一个矢量指令的内存操作数宽度不明确的情况,因为至少有一个操作数始终是寄存器。) - Peter Cordes
1
o 是英特尔用于 cqo 的,但向量指令使用 dq 而不是 o(例如 punpckhqdq)。请参见我在最近这个问题的重复中的答案 - Peter Cordes

11

我已经用两种方法检查了NASM:源代码和经验。

源代码

源代码位于:http://repo.or.cz/w/nasm.git

然后:

git grep -C2 tword

我们遇到了

switch (size) {
case 1:
    return "byte";
case 2:
    return "word";
case 4:
    return "dword";
case 8:
    return "qword";
case 10:
    return "tword";
case 16:
    return "oword";
case 32:
    return "yword";
case 64:
    return "zword";
default:
    return "???";
}

实证的

git log -pgit tag --contains 告诉我,zword 是在2.11中添加的,由于我使用的是2.10版本,并且有些懒,我将省略它。

在我们的.asm文件中:

section .bss
resb1 resb 1
resw1 resw 1
resq1 resq 1
rest1 rest 1
reso1 reso 1
resy1 resy 1
; Just to read the objdump better.
resb2 resb 1

然后编译并运行:

objdump -D -j .bss main.o

提供:

00000000 <resb1>:
    ...

00000001 <resw1>:
    ...

00000003 <resd1>:
3:  00 00                   add    %al,(%eax)
    ...

00000007 <resq1>:
    ...

0000000f <rest1>:
    ...

00000019 <reso1>:
    ...

00000029 <resy1>:
    ...

00000049 <resb2>:
    ...

如果我们计算每个位置之间的差异,我们会得出与之前相同的结论。

Zword助记符

对于AVX-512添加的ZMM寄存器:https://en.wikipedia.org/wiki/AVX-512

我想知道当字母表结束时英特尔将会做什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接