assembly - qué - solidity software
¿Cuáles son los tamaños de los operandos tword, oword y yword? (2)
En cuanto a TFS , parece que:
- ''oword'' / ''DO'' es 8 veces más grande que "word" (O for o ctoword), sinónimo de dqword ("double-quad"); eso sería 128 bits, correspondiente al tamaño de un registro vectorial SSE.
- ''tword'' / ''DT'' es de 80 bits (T para t en bytes), el tamaño completo de un registro de coma flotante Intel x87.
- ''yword'' / ''DY'' es de 256 bits, y la Y es presumiblemente mnemotécnica para los nombres YMM de los registros de vectores de 256 bits en las extensiones Intel AVX.
- ''zword'' / ''DZ'' es 512 bits, Z para los nombres ZMM de los registros vectoriales de 512 bits en las extensiones Intel AVX-512.
Entonces, no es exactamente una convención de nomenclatura lógica.
¿Cuáles son los tamaños de los operandos oword
, oword
y yword
, tal como se utilizan en el manual NASM / YASM ? Y en una nota relacionada, ¿hay algún truco o idea subyacente a estos nombres? ¿Hay alguna forma en que los tamaños de palabra más grandes reciban nombres lógicos?
Sé que aunque los tamaños de las palabras pueden diferir entre los sistemas, una word
NASM es de 2 bytes, dword
es el doble que (4 bytes), qword
es una palabra cuádruple (8 bytes), pero ... es una tword
triple (6 bytes) ? Y para oword
y yword
, ni siquiera puedo pensar en un significado plausible.
Tenga en cuenta que probablemente sea una pregunta fácil, pero no pude encontrar una respuesta. En los manuales de NASM y YASM no se explican estos tamaños, ni siquiera en las pseudo-instrucciones DQ
, DT
, DY
, RESQ
, REST
, RESY
. Leí en alguna parte que MASM usa un sistema similar, pero tampoco pude encontrar nada sobre eso.
Edición: Basado en las respuestas, esta es la lista completa:
- 1 byte (8 bits):
byte
,DB
,RESB
- 2 bytes (16 bits):
word
,DW
,RESW
- 4 bytes (32 bits):
dword
,DD
,RESD
- 8 bytes (64 bits):
qword
,DQ
,RESQ
- 10 bytes (80 bits):
tword
,DT
,REST
- 16 bytes (128 bits):
oword
,DO
,RESO
,DDQ
,RESDQ
- 32 bytes (256 bits):
yword
,DY
,RESY
- 64 bytes (512 bits):
zword
,DZ
,RESZ
Lo he comprobado con dos enfoques para NASM: código fuente y empírico.
Código fuente
Fuente en: http://repo.or.cz/w/nasm.git
Entonces:
git grep -C2 tword
Y nos caemos sobre :
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 "???";
}
Empírico
git log -p
y git tag --contains
zword
me dicen que zword
se agregó en 2.11, y como estoy en 2.10 y perezoso, omitiré esa.
En nuestro archivo .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
Luego compila y
objdump -D -j .bss main.o
da:
00000000 <resb1>:
...
00000001 <resw1>:
...
00000003 <resd1>:
3: 00 00 add %al,(%eax)
...
00000007 <resq1>:
...
0000000f <rest1>:
...
00000019 <reso1>:
...
00000029 <resy1>:
...
00000049 <resb2>:
...
Si tomamos las diferencias entre cada posición, llegamos a la misma conclusión que antes.
zword menemonic
Para los registros ZMM
agregados por AVX-512: https://en.wikipedia.org/wiki/AVX-512
Me pregunto qué hará Intel cuando terminen las letras del alfabeto.