为何tword为10字节而非20字节?相关类型大小命名规则咨询
xword系列命名的错位感,本质是x86架构演化中压根没做过长期统一的命名规划
核心认知误区
这套在汇编里常用的、带word后缀的操作数尺寸标注,从来不是一套“前缀对应数词N、代表N个基础word长度”的统一设计。它是跟着x86硬件几十年的发展逐步补全的标注体系,不同时期加进来的名称,命名来源完全独立,压根没有提前对齐过规则。
逐个拆解每个名称的实际来源
- 通用整数操作数线的命名,是沿着2倍长度递增的数词逻辑做的:
word:16位/2字节,是8086时代定下的基础长度单位dword:32位/4字节,前缀d-来自拉丁语duo(双),对应2个基础word,是32位通用寄存器时代引入的标注qword:64位/8字节,前缀q-来自拉丁语quadri(四),对应4个基础word,是64位通用寄存器时代引入的标注oword:128位/16字节,前缀o-来自拉丁语octo(八),对应8个基础word,是SSE指令集时代引入的标注。这几个顺着16→32→64→128位的2倍递增序列,完全符合数词命名的逻辑。
tword是完全不属于上述序列的“外来户”:
这个标注是8087浮点协处理器配套推出的,全称是temporary word(临时操作数),对应x87 FPU内部用的10字节扩展浮点临时格式,和“前缀代表多少个word”的数词逻辑半毛钱关系都没有。它的长度恰好是10字节,才会让大家误以为t-是ten(十)的缩写,顺理成章推算成10个word也就是20字节,这是纯纯的语义误解。- 后期SIMD扩展的命名,直接跳脱了数词体系:
到了AVX、AVX-512指令集阶段,需要标注256位、512位的操作数尺寸,已经找不到顺承数词逻辑的合适前缀了,干脆直接用对应硬件寄存器的名字来命名:yword:256位/32字节,对应AVX架构的ymm寄存器zword:512位/64字节,对应AVX-512架构的zmm寄存器
为什么会出现“oword比tword大”的反常感受
这种反常感完全来自大家的预设——默认所有带word后缀的名称,都是按同一套数词规则生成、前缀顺序和长度顺序严格对应的序列。但实际上:
oword是通用整数/SIMD操作数尺寸序列的成员,沿着2倍增长的规则一路涨到128位(16字节)tword是浮点协处理器分支引入的特殊尺寸标注,本身长度就是固定的10字节,从来没参与过“按数词排大小”的排序逻辑
两个名称来自完全不同的技术分支,从来没为了对齐长度、排序前缀做过统一设计,自然会出现字母顺序上靠后的oword实际存储长度更长的情况。
内容的提问来源于stack exchange,提问作者mediocrevegetable1
相关产品推荐
相关产品推荐

