word、word 和 y word 操作数的大小是多少?
Posted
技术标签:
【中文标题】word、word 和 y word 操作数的大小是多少?【英文标题】:What are the sizes of tword, oword and yword operands? 【发布时间】:2012-08-17 07:53:12 【问题描述】:NASM/YASM manual 中使用的tword
、oword
和yword
操作数的大小是多少?在相关的说明中,这些名称是否有技巧或潜在的想法?有没有办法给更大的字长赋予逻辑名称?
我知道虽然系统之间的字长可能不同,但 NASM word
是 2 个字节,dword
是它的两倍(4 个字节),qword
是一个四字(8 个字节),但是... tword
是 三个字(6 个字节)吗?对于oword
和yword
,我什至想不出一个合理的含义。
请注意,这可能是一个简单的问题,但我找不到答案。在 NASM 和 YASM 手册中没有解释这些大小,甚至在 DQ
、DT
、DY
、RESQ
、REST
、RESY
伪指令中也没有解释。我在某处读到 MASM 使用类似的系统,但也找不到任何东西。
编辑:根据答案,这是完整列表:
1 字节(8 位):byte
、DB
、RESB
2 字节(16 位):word
、DW
、RESW
4 字节(32 位):dword
、DD
、RESD
8 字节(64 位):qword
、DQ
、RESQ
10 字节(80 位):tword
、DT
、REST
16 字节(128 位):oword
、DO
、RESO
、DDQ
、RESDQ
32 字节(256 位):yword
、DY
、RESY
64 字节(512 位):zword
、DZ
、RESZ
【问题讨论】:
【参考方案1】:看the nasm source,是这样的:
'oword'/'DO'是“word”的8倍(O代表“octoword”),与dqword(“double-quad”)同义;这将是 128 位,对应于 SSE 向量寄存器的大小。 'tword'/'DT' 为 80 位(T 表示“ten 字节”),是 Intel x87 浮点寄存器的完整大小。 'yword'/'DY' 是 256 位,Y 可能是英特尔 AVX 扩展中 256 位向量寄存器的 YMM 名称的助记符。 'zword'/'DZ' 是 512 位,Z 代表英特尔 AVX-512 扩展中 512 位向量寄存器的 ZMM 名称。所以,这不完全是一个合乎逻辑的命名约定; “它刚刚长大”。
【讨论】:
这是我第一次知道YWORD (DY?)。它是 NASM/YASM 还是英特尔特定的(即:不是或还不是标准)? 128 位数据还有其他关键字吗? 不知道,可能不是标准的。对于 NASM,DO == DDQ,OWORD == DQWORD @Jay:这是 NASM 的事情。 (MASM 和 gas.intel_syntax
对内存操作数大小覆盖使用类似的命名约定,例如 vmovdqa ymmword ptr [rdi], ymm0
。您通常只会在反汇编输出中看到这一点;我想不出内存操作数宽度不明确的情况向量指令,因为至少有一个操作数总是一个寄存器。)
o
被英特尔用于cqo
,但向量指令使用dq
而不是o
(例如punpckhqdq
)。另见my answer on a recent duplicate of this question【参考方案2】:
我用 NASM 的两种方法对其进行了检查:源代码和经验。
源代码
来源:http://repo.or.cz/w/nasm.git
然后:
git grep -C2 tword
我们fall upon:
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 -p
和 git 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
我想知道当字母表中的字母结束时英特尔会做什么。
【讨论】:
以上是关于word、word 和 y word 操作数的大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章