¿Cuál es el contenido del conjunto de instrucciones X86?
Instrucciones de transferencia de datos Transfieren datos entre la memoria y los registros, registros y puertos de entrada/salida.
1. Instrucciones generales de transferencia de datos.
MOV transfiere palabras o bytes.
MOVSX primero expande los símbolos y luego los transmite.
.8086, solo admite el ensamblaje de instrucciones 8086
.186, solo admite el ensamblaje de instrucciones 80186
.286, admite el ensamblaje de instrucciones 80286 sin privilegios
..286C admite el ensamblaje de instrucciones 80286 sin privilegios
.286P admite el ensamblaje de instrucciones 80386 sin privilegios
.386 admite el ensamblaje de instrucciones 80386 sin privilegios
p>
.386C admite el ensamblaje de instrucciones 80386 sin privilegios
.386P admite el ensamblaje de todas las instrucciones 80386
Solo mediante el uso de pseudoinstrucciones que especifican el tipo de procesador, el ensamblador puede saber cómo compilar y vincular mejor los programas y comprobar mejor los errores.
9. Instrucciones FPU (extraídas del archivo de ayuda de FASM, lo traduciré al chino cuando tenga tiempo)
Instrucciones FPU (unidad de punto flotante) para punto flotante
p>
La manipulación de valores es la misma que para la FPU: registros FPU de precisión simple (32 bits), precisión doble (64 bits)
y doble extensión forman la pila. Los registros de FPU forman una pila
y cada registro contiene un valor de coma flotante de precisión extendida doble.
Cuando algún valor se inserta en la pila o se elimina de la parte superior de la pila,
el registro FPU se desplaza, por lo que st0 siempre es el valor en la parte superior de la pila FPU
, st1 es el primer valor de la pila de FPU
y st1 es el primer valor de la pila de FPU
. Un sinónimo de st0 es st.
fld inserta un valor de punto flotante en la pila de registros de FPU.
fld inserta un valor de punto flotante en la pila de registros de FPU.
El operando puede ser una ubicación de memoria de 32, 64 u 80 bits o un registro FPU,
su valor se cargará en el nivel superior de la pila de registros FPU (registro st0)
p>
y se convierte automáticamente al formato de doble precisión extendida.
fld dword [bx]; cargar valor de precisión simple desde la memoria
fld st2; enviar el valor de st2 a la pila de registros
fld1, fldz, fldl2t , fldl2e, fldpi, fldlg2 y fldln2 cargan constantes
usadas comúnmente en la pila de registros de FPU. Las constantes cargadas son 1,0, 0,0, log2 10, log2 e, pi, log10 2 y ln 2 respectivamente. Estas instrucciones
no tienen operandos.
campo convierte operandos enteros de precisión simple a formato de punto flotante
de doble precisión extendida y envía el resultado a la pila de registros de FPU.
fild qword [bx]; Cargar un entero de 64 bits desde la memoria
primero copia el valor del registro st0 al operando de destino, que puede ser de 32 o 64 bits. ubicación de memoria de bits u otro registro FPU. fstp realiza
la misma operación que fst, luego abre la pila de registros y elimina
st0. fstp acepta los mismos operandos que el registro st0 y puede usarse para almacenar el valor del registro st0.
fstp acepta los mismos operandos que la instrucción fst y también puede almacenar valores en una memoria de 80 bits.
fst st3 ; Copia el valor de st0 al registro st3
fstp tword [bx] ; Almacena el valor en la memoria y abre la pila
primero. Convierta el valor en st0 a un entero con signo y almacene el resultado
en el operando de destino. fbstp
Convierte el valor en st0 en un entero BCD empaquetado de 18 bits. fbstp
Convierte el valor en st0 en un entero BCD empaquetado de 18 bits, almacena
el resultado en el operando de destino y abre la pila de registros. El operando de destino es siempre un registro FPU,
si el operando de origen es una ubicación de memoria, entonces el operando de destino es el registro st0 y solo se puede especificar el
operando de origen. El operando de destino es siempre un registro FPU,
si el operando de origen es una ubicación de memoria, entonces el operando de destino es el registro st0 y solo se puede especificar el
operando de origen. Si ambos operandos son registros FPU, al menos un operando es un registro st0. Si ambos operandos son registros FPU,
al menos un operando debe ser un registro st0.
fadd qword [bx] ; Agrega un valor doble a st0
fadd st2, st0 ; Agrega st0 a st2
faddp Convierte el operando de destino en el origen. Se agregan operandos, la suma se almacena en la ubicación de destino y se abre la pila de registros. El operando de destino
es una función del operando de destino y del operando de origen. El operando
debe ser un registro FPU y el operando fuente debe ser st0. Si no se especifica ningún operando, st1 se utiliza como operando de destino.
38 Capítulo 2. Conjunto de instrucciones
faddp; Agrega st0 a st1 y abre la pila
faddp st2, st0; Agrega st0 a st2 y abre la pila
La instrucción fiadd convierte un operando de origen entero en un valor de punto flotante de precisión
doble extendido y lo agrega al operando de destino.
fiadd word [bx]; agrega un entero de palabra a st0
Las instrucciones fsub, fsubr, fmul, fdiv, fdivr son similares a fadd, las reglas de los operandos son las mismas, las únicas La diferencia radica en el cálculo de ejecución.
fsub resta el operando de origen del operando de destino, fsubr
resta el operando de destino del operando de origen, fmul multiplica el operando de destino
y el operando de origen , fdiv divide el operando de destino por
el operando de origen, fdivr divide el operando de origen por el operando de destino
. fsubp, fsubrp, fmulp, fdivp, fdivrp realizan la misma operación que abrir la pila de registros
, con las mismas reglas de operandos que la instrucción faddp
. fisub, fisubr, fimul, fidiv, fidivr realizan estas operaciones
Después de convertir los operandos fuente enteros a valores de coma flotante, sus
reglas de operandos son las mismas que faddp
directiva es la misma.
fsqrt calcula la raíz cuadrada del valor en el registro st0, fsin calcula el seno del valor, fcos calcula el coseno del valor, fchs
repone su bit de signo y fabs borra su signo para crear un valor absoluto,
frndint lo redondea al entero más cercano.
fsincos calcula el seno y el coseno de st0,
almacena el valor del seno en st0 y envía el valor del coseno al registro FPU
en la parte superior de la pila . fptan calcula la tangente del valor en st0, almacena el resultado en st0 e inserta 1.0 en la pila de registros de FPU. fpatan calcula la cotangente del valor en st1 dividido por el valor en st0, almacena el resultado en st1 y extrae la pila de registros FPU. fyl2x calcula el logaritmo binario de st0, multiplica st1, almacena el resultado en st1 y extrae la pila de registros FPU; fyl2xp1 realiza la misma operación, pero calcula el logaritmo. Anteriormente, st0
se agregó a 1.0.