tutorial software qué para español curso aprender assembly nasm word yasm word-size

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.