Каковы размеры операндов tword, oword и yword?
Каковы размеры операндов tword
, oword
и yword
, которые используются в NASM/Руководство YASM? И по соответствующей заметке, есть ли трюк или основная идея этих имен? Есть ли способ, которым большие размерные слова задают логические имена?
Я знаю, что, хотя размеры слов могут различаться между системами, 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
Глядя на TFS, это выглядит так:
- 'oword'/'DO' в 8 раз больше слова "word" (O означает " o ctoword"), синонимично с dqword ("double-quad"); это будет 128 битов, что соответствует размеру векторного регистра SSE.
- 'tword'/'DT' - это 80 бит (T для " t en bytes"), полный размер регистра Intel x87 с плавающей запятой.
- 'yword'/'DY' - 256 бит, и Y, по-видимому, является мнемоническим для имен YMM 256-битных векторных регистров в расширениях Intel AVX.
- 'zword'/'DZ' составляет 512 бит, Z для имен ZMM 512-битных векторных регистров в расширениях Intel AVX-512.
Таким образом, это не совсем логическое соглашение об именах; "это только выросло".
Ответ 2
Я проверил его с двумя подходами к 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 -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 menemonic
Для регистров ZMM
, добавленных AVX-512: https://en.wikipedia.org/wiki/AVX-512
Интересно, что сделает Intel, когда буквы алфавита заканчиваются.