isasubset.html
Tabla de contenidos
- A.1. Nomenclatura
- A.2. Instrucciones de movimiento de datos
- A.3. Instrucciones aritméticas
-
- A.3.1. ADD: Instrucción de suma
- A.3.2. sub: Instrucción de resta
- A.3.3. INC: Instrucción de incremento
- A.3.4. DEC: Instrucción de decremento
- A.3.5. NEG: Instrucción de cambio de signo
- A.3.6. MUL: Instrucción de multiplicación sin signo
- A.3.7. DIV: Instrucción de división sin signo
- A.3.8. IMUL: Instrucción de multiplicación con signo
- A.3.9. IDIV: Instrucción de división con signo
- A.4. Instrucciones lógicas
- A.5. Instrucciones de desplazamiento
- A.6. Instrucciones de salto
- A.7. Instrucciones de comparación y comprobación
La arquitectura IA-32 dispone de un lenguaje máquina con cientos de instrucciones para múltiples tipos de tareas diferentes. En este apéndice se describen en detalla tan sólo un subconjunto mínimo que permite realizar operaciones sencillas sobre tipos de datos tales como strings y enteros.
Para la descripción detallada del subconjunto de instrucciones de esta arquitectura se utiliza la siguiente nomenclatura:
-
%reg
: Denota cualquiera de los ocho registros de propósito general. -
inm
: Denota una constante numérica. En ensamblador, el valor numérico debe ir precedido por el símbolo$
. También se incluyen en esta categoría las expresiones$etiq
, dondeetiq
corresponde con el nombre de una de las etiquetas definidas en el código. -
mem
: Denota el nombre de una etiqueta definida en el código. Nótese que en este caso no se utiliza el prefijo$
pues si fuese así se trataría de una constante. -
INSs
: Cuando el código de operación de una instrucción termina ens
esto denota que la instrucción requiere un sufijo de tamañoB
,W
oL
.
Instrucción | Descripción |
---|---|
MOV %regA, %regB |
Mueve el
contenido de %regA al registro %regB . |
MOV $inm, %reg |
Mueve inm al registro %reg . |
MOV mem, %reg |
Mueve el
contenido almacenado en la posición mem al
registro %reg . |
MOV %reg, mem |
Mueve el
contenido de %reg a la posición mem . |
MOVs $inm, mem |
Mueve inm ,
codificado con los bits especificados por el sufijo s al dato cuyo tamaño está especificado por el
sufijo s y que está almacenado a partir de la
posición mem . |
La instrucción de mover recibe dos operandos y mueve el primero al lugar donde indica el segundo. Esta instrucción no modifica ninguno de los flags de la palabra de estado.
Instrucción | Descripción |
---|---|
PUSH %reg |
Almacena el
contenido de %reg en la posición anterior a
la que apunta el puntero de pila. |
PUSH mem |
Almacena el dato
de 32 bits que está almacenado a partir de la posición mem en la posición anterior a la que apunta el
puntero de pila. |
PUSH $inm |
Almacena inm
codificado con 32 bits en la posición anterior a la que apunta el
puntero de pila. |
Esta instrucción recibe un único operando y manipula siempre operandos de 32 bits, por lo tanto no es preciso utilizar ningún sufijo de tamaño. El procesador toma el valor del registro puntero de pila, le resta 4 y almacena el operando dado en los cuatro bytes de memoria a partir de la posición del puntero de pila. Esta instrucción no modifica ninguno de los flags de la palabra de estado.
Instrucción | Descripción |
---|---|
POP %reg |
Almacena el
contenido al que apunta el puntero de pila en %reg . Modifica el puntero a la cima para que apunte
a la siguiente posición de la pila. |
POP mem |
Almacena los 32 bits a los que apunta el
puntero de pila a partir de la posición mem .
Modifica el puntero a la cima para que apunte a la siguiente posición
de la pila. |
Esta instrucción recibe un único operando y manipula siempre operandos de 32 bits, por lo tanto no es preciso utilizar ningún sufijo de tamaño. El procesador toma el valor del registro puntero de pila y mueve ese dato al lugar que le indique el operando de la instrucción. Tras esta transferencia, se suma el valor 4 al registro puntero de pila. Esta instrucción no modifica ninguno de los flags de la palabra de estado.
Instrucción | Descripción |
---|---|
XCHG %regA, %regB XCHG %reg, mem XCHG mem, %reg |
Intercambia los valores de sus dos operandos. Cuando un operando está en memoria, se intercambia el dato almacenado a partir de la posición de memoria dada. Al menos uno de los operandos debe ser de tipo registro. |
Esta instrucción utiliza un registro temporal interno del procesador para intercambiar los operandos. No se modifica ninguno de los flags de la palabra de estado.
Instrucción | Descripción |
---|---|
ADD %regA, %regB |
Suma el
contenido de %regA al contenido de %regB . |
ADD $inm, %reg |
Suma inm al contenido de %reg . |
ADD mem, %reg |
Suma el
contenido almacenado en la posición mem al
contenido de %reg . |
ADD %reg, mem |
Suma el
contenido de %reg al contenido almacenado en
la posición mem . |
ADDs $inm, mem |
Suma inm ,
codificado con los bits especificados por el sufijo s al dato cuyo tamaño está especificado por el
sufijo s y que está almacenado a partir de la
posición mem . |
La instrucción de suma recibe dos operandos, los suma y deposita el
resultado en el lugar especificado por el segundo operando. Se pierde,
por tanto, el valor del segundo operando. Los flags de la palabra de
estado OF
, SF
,
ZF
, PF
y CF
se modifican de acuerdo al resultado
obtenido.
Instrucción | Descripción |
---|---|
sub %regA, %regB |
Resta el
contenido de %regA del contenido de %regB . |
sub $inm, %reg |
Resta inm del contenido de %reg . |
sub mem, %reg |
Resta el
contenido almacenado en la posición mem del
contenido de %reg . |
sub %reg, mem |
Resta el
contenido de %reg del contenido almacenado en
la posición mem . |
subs $inm, mem |
Resta inm ,
codificado con los bits especificados por el sufijo s del dato cuyo tamaño está especificado por el
sufijo s y que está almacenado a partir de la
posición mem . |
La instrucción de resta recibe dos operandos op1
y op2
, realiza la
operación op2 - op1
y almacena el resultado
en el lugar especificado por el segundo operando. Se pierde, por tanto,
el valor del segundo operando. Los flags de la palabra de estado OF
, SF
, ZF
, PF
y CF
se modifican de acuerdo al resultado
obtenido.
Instrucción | Descripción |
---|---|
INC %reg |
Suma uno al
contenido de %reg . |
INCs mem |
Suma uno, codificado con los bits
especificados por el sufijo s al dato cuyo
tamaño está especificado por el sufijo s y
que está almacenado a partir de la posición mem . |
La instrucción de incremento recibe un único operando al que le suma
el valor 1. Esta instrucción tiene la particularidad de que no modifica
el flag de acarreo (CF
). Los flags de la
palabra de estado OF
, SF
, PF
y ZF
sí se modifican de acuerdo al resultado
obtenido.
Instrucción | Descripción |
---|---|
DEC %reg |
Resta uno del
contenido de %reg . |
DECs mem |
Resta uno, codificado con los bits
especificados por el sufijo s del dato cuyo
tamaño está especificado por el sufijo s y
que está almacenado a partir de la posición mem . |
La instrucción de decremento recibe un único operando al que le
resta el valor 1. Esta instrucción tiene la particularidad de que no
modifica el flag de acarreo (CF
). Los flags
de la palabra de estado OF
, SF
, PF
y ZF
sí se modifican de acuerdo al resultado
obtenido.
Instrucción | Descripción |
---|---|
NEG %reg |
Toma el
contenido de %reg , cambia su signo y se
almacena en %reg . |
NEGs mem |
Toma el número codificado con los bits
especificados por el sufijo s y almacenado a
partir de la posición mem y le cambia el
signo. |
La instrucción de decremento recibe un único operando y la operación
que realiza es equivalente a multiplicar por -1. El operando se asume
que está codificado en complemento a 2. Esta instrucción tiene la
particularidad de que asigna directamente el valor 1 al flag de acarreo
(CF
) excepto si el operando tiene el valor 0.
Los flags de la palabra de estado OF
, SF
, PF
y ZF
sí se modifican de acuerdo al resultado
obtenido.
Instrucción | Descripción |
---|---|
MUL %reg |
Multiplica el
contenido de %reg por el registro %al , %ax o %eax dependiendo de si el tamaño del operando es de
8, 16 o 32 bits respectivamente. El resultado se almacena en %ax , el registro de 32 bits resultante de
concatenar %dx:%ax (%dx el más significativo) o el registro de 64 bits
resultante de concatenar %edx:%eax (%edx el más significativo) dependiendo de si el
operando dado es de 8, 16 o 32 bits respectivamente. |
MULs mem |
Multiplica el dato codificado con los bits
especificado por el sufijo s y almacenado a
partir de la posición mem por el registro
%al , %ax o %eax dependiendo de si el tamaño del operando es de
8, 16 o 32 bits respectivamente. El resultado se almacena en %ax , el registro de 32 bits resultante de
concatenar %dx:%ax (%dx el más significativo) o el registro de 64 bits
resultante de concatenar %edx:%eax (%edx el más significativo) dependiendo de si el
sufijo especifica 8, 16 o 32 bits respectivamente. |
Esta instrucción utiliza dos operandos, pero uno de ellos es
implícito, es decir, no aparece en la instrucción. Este multiplicando
se obtiene de %al
, %ax
o %eax
dependiendo de
si la operación debe utilizar datos de 8, 16 o 32 bits.
Se permite, por tanto, la utilización de 3 posibles tamaños de
operandos: 8, 16 y 32 bits. Ambos operandos tienen idéntico tamaño. El
problema de la multiplicación es que si en general se multiplican dos
números de tamaño n y m bits, se precisan n + m bits para representar
el restulado. Como consecuencia de esto, el resultado de esta
instrucción se almacena en %ax
si la
multiplicación es de dos números de 8 bits, en el registro de 32 bits
resultante de concatenar %dx:%ax
, con %dx
como parte más significativa, si se multiplican
dos números de 16 bits, y en caso de multiplicación de dos números de
32 bits, se almacena en la concatenación %edx:%ecx
como un registro de 64 bits con %edx
como parte más significativa.
La razón por la que no se utiliza uno de los registros de 32 bits para almacenar el producto de dos operandos de 16 bits es histórica. Han existido procesadores anteriores a este en el que sólo había registros de 16 bits. Para almacenar un operando de 32 bits había que realizar esta concatenación. Los nuevos procesadores disponen de registros de 32 bits, pero por mantener el lenguaje máquina compatible con las versiones anteriores, esta instrucción conserva la descripción anterior. La tabla A.1 muestra la relación entre el tamaño de los operandos y el lugar en el que se almacena el resultado.
Tabla A.1. Opciones de la multiplicación sin signo
Tamaño de Operando | Operando Implícito | Operando Explícito | Resultado |
---|---|---|---|
Byte | %al |
%reg ó mem |
%ax |
Word (2 bytes) | %ax |
%reg ó mem |
%dx:%ax |
Doubleword (4 bytes) | %eax |
%reg ó mem |
%edx:%eax |
Los únicos flags que se modifican con esta instrucción son CF
y OF
. Ambos bits se
ponen a 1 cuando la mitad más significativa del resultado tiene alguno
de sus bits a 1. El resto de flags tienen valores no definidos tras
ejecutar esta instrucción.
Instrucción | Descripción |
---|---|
DIV %reg |
Esta instrucción
tiene tres versiones posibles. Divide el registro %ax , los 32 bits obtenidos al concatenar los
registros %dx:%ax o los 64 bits obtenidos al
concatenar los registros %edx:%eax entre
%reg . Como resultado se deposita el cociente
en %al , %ax o %eax y el resto en %ah ,
%dx o %edx
respectivamente. Se consideran todos los operandos como números
naturales. |
DIVs mem |
Esta instrucción tiene tres versiones
posibles. Divide el registro %ax , los 32 bits
obtenidos al concatenar los registros %dx:%ax
o los 64 bits obtenidos al concatenar los registros %edx:%eax entre el dato codificado según el sufijo
s y almacenado a partir de la posición de
memoria mem . Como resultado se deposita el
cociente en %al , %ax o %eax y el resto en
%ah , %dx o %edx respectivamente. |
Esta instrucción utiliza dos operandos: dividendo y divisor. Tan
sólo se especifica en la instrucción el divisor. El dividendo es
implícito y tiene tamaño doble al del divisor y se obtiene de %ax
(16 bits), la concatenación de los registros
%dx:%ax
(32 bits) o la concatenación de los
registros %edx:%eax
(64 bits) dependiendo de
si el divisor es de 8, 16 o 32 bits respectivamente.
La instrucción devuelve dos resultados: cociente y resto. El
cociente se devuelve en %al
, %ax
o %eax
y el resto en
%ah
, %dx
o %edx
. La tabla A.2
muestra la relación entre el tamaño de los operandos y el lugar en el
que se almacena el resultado.
Tabla A.2. Opciones de la división sin signo
Tamaño de Operandos | Dividendo | Divisor | Cociente | Resto | Valor Máximo Cociente |
---|---|---|---|---|---|
Word/Byte | %ax |
1 byte %reg ó mem |
%al |
%ah |
255 |
Doubleword/Word | %dx:%ax |
2 bytes %reg ó mem |
%ax |
%dx |
65.535 |
Quadword/Doubleword | %edx:%eax |
4 bytes %reg ó mem |
%eax |
%edx |
232 - 1 |
Ninguno de los flags de la palabra de estado tiene valor definido tras ejecutar esta instrucción.
La instrucción para multiplicar dos enteros con signo tiene tres posibles formatos dependiendo del número de operandos explícitos.
El formato con un único operando se interpreta de forma idéntica a
la instrucción de multiplicación sin signo MUL
(ver sección
A.3.6). El segundo operando es implícito y tiene idéntico tamaño al
explícito. El resultado tiene tamaño doble que los operandos.
Instrucción | Descripción |
---|---|
IMUL %reg |
Multiplica el
contenido de %reg por el registro %al , %ax o %eax dependiendo de si el tamaño del operando es de
8, 16 o 32 bits respectivamente. El resultado se almacena en %ax , el registro de 32 bits resultante de
concatenar %dx:%ax (%dx el más significativo) o el registro de 64 bits
resultante de concatenar %edx:%eax (%edx el más significativo) dependiendo de si el
operando dado es de 8, 16 o 32 bits respectivamente. |
IMULs mem |
Multiplica el dato codificado con los bits
especificado por el sufijo s y almacenado a
partir de la posición mem por el registro
%al , %ax o %eax dependiendo de si el tamaño del operando es de
8, 16 o 32 bits respectivamente. El resultado se almacena en %ax , el registro de 32 bits resultante de
concatenar %dx:%ax (%dx el más significativo) o el registro de 64 bits
resultante de concatenar %edx:%eax (%edx el más significativo) dependiendo de si el
sufijo especifica 8, 16 o 32 bits respectivamente. |
La segunda versión de esta instrucción contiene dos operandos. El segundo de ellos es a la vez multiplicando y destino del resultado y debe ser uno de los registro de propósito general. En esta versión, tanto operandos como resultado tienen idéntico tamaño, con lo que hay una mayor probabilidad de overflow.
Instrucción | Descripción |
---|---|
MUL %regA, %regB |
Multiplica el
contenido de %regA por el contenido de %regB . Los registros deben tener idéntico tamaño y
sólo pueden ser de 16 o 32 bits, no de 8. |
MUL $inm, %reg |
Multiplica inm por el contenido de %reg . El registro sólo puede ser de 16 o 32
bits. |
MUL mem, %reg |
Multiplica el contenido almacenado a partir
de la posición mem por el contenido de %reg . El registro sólo puede ser de 16 o 32
bits. |
La tercera versión de la instrucción de multiplicación consta de tres operandos. El primero es un multiplicando y debe ser una constante, el segundo es también un multiplicando y debe ser una posición de memoria o un registro. El tercer operando es donde se guarda el resultado y debe ser un registro de propósito general.
Instrucción | Descripción |
---|---|
MUL $inm, %regA, %regB |
Multiplica $inm por el contenido de %regA y almacena el restulado en %regB . Los registros deben tener idéntico tamaño y
sólo pueden ser de 16 o 32 bits, no de 8. |
MUL $inm, mem, %reg |
Multiplica $inm por
el dato almacenado a partir de la posición mem y almacena el resultado en %reg . El registro sólo puede ser de 16 o 32
bits. |
De las tres versiones posibles para esta operación, sólo la primera
deposita el resultado del tamaño apropiado para evitar desbordamientos.
El formato con dos y tres operandos realiza la multiplicación, obtiene
todos los bits del resultado y posteriormente los trunca para almacenar
en destino. Los únicos flags que se modifican con esta instrucción son
CF
y OF
. Ambos bits
se ponen a 1 cuando la mitad más significativa del resultado tiene
alguno de sus bits a 1. Nótese que estos dos flags son los que indican,
en el caso de la instrucción con dos y tres operandos, si el resultado
obtenido ha sido truncado para almacenarse en destino. El resto de
flags tienen valores no definidos tras ejecutar esta instrucción.
El comportamiento de esta instrucción es idéntico al de la instrucción DIV (ver sección A.3.7) con la diferencia de que los operandos son números enteros.
Instrucción | Descripción |
---|---|
IDIV %reg |
Esta instrucción
tiene tres versiones posibles. Divide el registro %ax , los 32 bits obtenidos al concatenar los
registros %dx:%ax o los 64 bits obtenidos al
concatenar los registros %edx:%eax entre
%reg . Como resultado se deposita el cociente
en %al , %ax o %eax y el resto en %ah ,
%dx o %edx
respectivamente. Los operandos se tratan como números enteros. |
IDIVs mem |
Esta instrucción tiene tres versiones
posibles. Divide el registro %ax , los 32 bits
obtenidos al concatenar los registros %dx:%ax
o los 64 bits obtenidos al concatenar los registros %edx:%eax entre el dato codificado según el sufijo
s y almacenado a partir de la posición de
memoria mem . Como resultado se deposita el
cociente en %al , %ax o %eax y el resto en
%ah , %dx o %edx respectivamente. Los operandos se tratan como
números enteros. |
Al igual que la instrucción DIV, esta instrucción utiliza dos
operandos: dividendo y divisor. Tan sólo se especifica en la
instrucción el divisor. El dividendo es implícito y tiene tamaño doble
al del divisor y se obtiene de %ax
(16 bits),
la concatenación de los registros %dx:%ax
(32
bits) o la concatenación de los registros %edx:%eax
(64 bits) dependiendo de si el divisor es
de 8, 16 o 32 bits respectivamente.
La instrucción devuelve dos resultados: cociente y resto. El
cociente se devuelve en %al
, %ax
o %eax
y el resto en
%ah
, %dx
o %edx
. La tabla A.2
muestra la relación entre el tamaño de los operandos y el lugar en el
que se almacena el resultado.
Tabla A.3. Opciones de la división con signo
Tamaño de Operandos | Dividendo | Divisor | Cociente | Resto | Rango del Cociente |
---|---|---|---|---|---|
Word/Byte | %ax |
1 byte %reg ó mem |
%al |
%ah |
-128 a 127 |
Doubleword/Word | %dx:%ax |
2 bytes %reg ó mem |
%ax |
%dx |
-32.768 a 32.767 |
Quadword/Doubleword | %edx:%eax |
4 bytes %reg ó mem |
%eax |
%edx |
-231 - 1 a 231 |
Ninguno de los flags en la palabra de estado tiene valores definidos tras ejecutar esta instrucción.
Instrucción | Descripción |
---|---|
AND %regA, %regB |
Realiza la
conjunción bit a bit del contenido de %regA
con el contenido de %regB . Deposita el
resultado en %regB . |
AND $inm, %reg |
Realiza la
conjunción bit a bit entre inm y el contenido
de %reg . Deposita el resultado en %reg . |
AND mem, %reg |
Realiza la
conjunción bit a bit entre el contenido almacenado en la posición mem y el contenido de %reg . Deposita el resultado en %reg . |
AND %reg, mem |
Realiza la
conjunción bit a bit entre el contenido de %reg y el contenido almacenado a partir de la
posición mem . El resultado se almacena en
memoria a partir de la posición mem . |
ANDs $inm, mem |
Realiza la conjunción bit a bit entre inm , codificado con los bits especificados por el
sufijo s con el dato cuyo tamaño está
especificado por el sufijo s y que está
almacenado a partir de la posición mem . El
resultado se almacena en memoria a partir de la posición mem . |
La conjunción bit a bit significa que ambos operandos deben tener el
mismo tamaño y que cada bit del resultado se calcula haciendo la
conjunción de los correspondientes bits de ambos operandos. Los flags
OF
y CF
se ponen a
cero. Los flags SF
, ZF
y PF
se modifican de
acuerdo con el resultado.
Instrucción | Descripción |
---|---|
OR %regA, %regB |
Realiza la
disyunción bit a bit del contenido de %regA
con el contenido de %regB . Deposita el
resultado en %regB . |
OR $inm, %reg |
Realiza la
disyunción bit a bit entre inm y el contenido
de %reg . Deposita el resultado en %reg . |
OR mem, %reg |
Realiza la
disyunción bit a bit entre el contenido almacenado en la posición mem y el contenido de %reg . Deposita el resultado en %reg . |
OR %reg, mem |
Realiza la
disyunción bit a bit entre el contenido de %reg y el contenido almacenado a partir de la
posición mem . El resultado se almacena en
memoria a partir de la posición mem . |
ORs $inm, mem |
Realiza la disyunción bit a bit entre inm , codificado con los bits especificados por el
sufijo s con el dato cuyo tamaño está
especificado por el sufijo s y que está
almacenado a partir de la posición mem . El
resultado se almacena en memoria a partir de la posición mem . |
La disyunción bit a bit significa que ambos operandos deben tener el
mismo tamaño y que cada bit del resultado se calcula haciendo la
disyunción de los correspondientes bits de ambos operandos. Los flags
OF
y CF
se ponen a
cero. Los flags SF
, ZF
y PF
se modifican de
acuerdo con el resultado.
Instrucción | Descripción |
---|---|
XOR %regA, %regB |
Realiza la
disyunción exclusiva bit a bit del contenido de %regA con el contenido de %regB . Deposita el resultado en %regB . |
XOR $inm, %reg |
Realiza la
disyunción exclusiva bit a bit entre inm y el
contenido de %reg . Deposita el resultado en
%reg . |
XOR mem, %reg |
Realiza la
disyunción exclusiva bit a bit entre el contenido almacenado en la
posición mem y el contenido de %reg . Deposita el resultado en %reg . |
XOR %reg, mem |
Realiza la
disyunción exclusiva bit a bit entre el contenido de %reg y el contenido almacenado a partir de la
posición mem . El resultado se almacena en
memoria a partir de la posición mem . |
XORs $inm, mem |
Realiza la disyunción exclusiva bit a bit
entre inm , codificado con los bits
especificados por el sufijo s con el dato
cuyo tamaño está especificado por el sufijo s
y que está almacenado a partir de la posición mem . El resultado se almacena en memoria a partir
de la posición mem . |
La disyunción exclusiva bit a bit significa que ambos operandos
deben tener el mismo tamaño y que cada bit del resultado se calcula
haciendo la disyunción de los correspondientes bits de ambos operandos.
Los flags OF
y CF
se ponen a cero. Los flags SF
, ZF
y PF
se modifican de
acuerdo con el resultado.
Instrucción | Descripción |
---|---|
NOT %reg |
Niega bit a bit
el contenido de %reg . |
NOTs mem |
Niega bit a bit al dato cuyo tamaño está
especificado por el sufijo s y que está
almacenado a partir de la posición mem . |
Esta instrucción no modifica ninguno de los flags de la palabra de estado.
Instrucción | Descripción |
---|---|
SAL $inm, %reg |
Desplaza el
contenido de %reg a la izquierda tantas
posiciones como indica inm . Para cada
desplazamiento, el bit más significativo se carga en el flag CF y el menos significativo se pone a cero. |
SAR $inm, %reg |
Desplaza el
contenido de %reg a la derecha tantas
posiciones como indica inm . Para cada
desplazamiento el bit menos significativo se carga en el flag CF y el nuevo bit más significativo se pone al
mismo valor del anterior (extensión de signo). |
SAL %cl, %reg |
Desplaza el
contenido de %reg a la izquierda tantas
posiciones como indica el registro %cl . Para
cada desplazamiento, el bit más significativo se carga en el flag CF y el menos significativo se pone a cero. |
SAR %cl, %reg |
Desplaza el
contenido de %reg a la derecha tantas
posiciones como indica %cl . Para cada
desplazamiento el bit menos significativo se carga en el flag CF y el nuevo bit más significativo se pone al
mismo valor del anterior (extensión de signo). |
SALs $inm, mem |
Desplaza el
contenido del dato cuyo tamaño lo especifica el sufijo s y que está almacenado a partir de la posición de
memoria mem a la izquierda tantas posiciones
como indica inm . Para cada desplazamiento, el
bit más significativo del segundo operando se carga en el flag CF y el menos significativo del resultado se pone a
cero. |
SARs $inm, mem |
Desplaza el
contenido del dato cuyo tamaño lo especifica el sufijo s y que está almacenado a partir de la posición de
memoria mem a la derecha tantas posiciones
como indica inm . Para cada desplazamiento el
bit menos significativo del segundo operando se carga en el flag CF y el nuevo bit más significativo del resultado
se pone al mismo valor del anterior (extensión de signo). |
SALs %cl, mem |
Desplaza el
contenido del dato cuyo tamaño lo especifica el sufijo s y que está almacenado a partir de la posición de
memoria mem a la izquierda tantas posiciones
como indica el registro %cl . Para cada
desplazamiento, el bit más significativo del segundo operando se carga
en el flag CF y el menos significativo del
resultado se pone a cero. |
SARs %cl, mem |
Desplaza el contenido del dato cuyo tamaño lo
especifica el sufijo s y que está almacenado
a partir de la posición de memoria mem a la
derecha tantas posiciones como indica el registro %cl . Para cada desplazamiento el bit menos
significativo del segundo operando se carga en el flag CF y el nuevo bit más significativo del resultado
se pone al mismo valor del anterior (extensión de signo). |
El flag CF
contiene el valor del último
bit que ha sido desplazado. El flag OF
se
modifica sólo en el caso de desplazamientos de 1 bit. Para
desplazamientos a izquierda, este flag se pone a cero si los dos bits
más significativos del operando antes de desplazarse son ambos cero. En
caso contrario se pone a 1. Si el desplazamiento es a la derecha, el
valor es siempre cero. Los flags SF
, ZF
y PF
se modifican de
acuerdo con el resultado obtenido.
Instrucción | Descripción |
---|---|
SHL $inm, %reg |
Desplaza el
contenido de %reg a la izquierda tantas
posiciones como indica inm . Para cada
desplazamiento, el bit más significativo se carga en el flag CF y el menos significativo se pone a cero. |
SHR $inm, %reg |
Desplaza el
contenido de %reg a la derecha tantas
posiciones como indica inm . Para cada
desplazamiento el bit menos significativo se carga en el flag CF y el nuevo bit más significativo se pone a
cero. |
SHL %cl, %reg |
Desplaza el
contenido de %reg a la izquierda tantas
posiciones como indica el registro %cl . Para
cada desplazamiento, el bit más significativo se carga en el flag CF y el menos significativo se pone a cero. |
SHR %cl, %reg |
Desplaza el
contenido de %reg a la derecha tantas
posiciones como indica %cl . Para cada
desplazamiento el bit menos significativo se carga en el flag CF y el nuevo bit más significativo se pone a
cero. |
SHLs $inm, mem |
Desplaza el
contenido del dato cuyo tamaño lo especifica el sufijo s y que está almacenado a partir de la posición de
memoria mem a la izquierda tantas posiciones
como indica inm . Para cada desplazamiento, el
bit más significativo del segundo operando se carga en el flag CF y el menos significativo del resultado se pone a
cero. |
SHRs $inm, mem |
Desplaza el
contenido del dato cuyo tamaño lo especifica el sufijo s y que está almacenado a partir de la posición de
memoria mem a la derecha tantas posiciones
como indica inm . Para cada desplazamiento el
bit menos significativo del segundo operando se carga en el flag CF y el nuevo bit más significativo del resultado
se pone a cero. |
SHLs %cl, mem |
Desplaza el
contenido del dato cuyo tamaño lo especifica el sufijo s y que está almacenado a partir de la posición de
memoria mem a la izquierda tantas posiciones
como indica el registro %cl . Para cada
desplazamiento, el bit más significativo del segundo operando se carga
en el flag CF y el menos significativo del
resultado se pone a cero. |
SHRs %cl, mem |
Desplaza el contenido del dato cuyo tamaño lo
especifica el sufijo s y que está almacenado
a partir de la posición de memoria mem a la
derecha tantas posiciones como indica el registro %cl . Para cada desplazamiento el bit menos
significativo del segundo operando se carga en el flag CF y el nuevo bit más significativo del resultado
se pone a cero. |
El flag CF
contiene el valor del último
bit que ha sido desplazado. El flag OF
se
modifica sólo en el caso de desplazamientos de 1 bit. Para
desplazamientos a izquierda, este flag se pone a cero si los dos bits
más significativos del operando antes de desplazarse son ambos cero. En
caso contrario se pone a 1. Si el desplazamiento es a la derecha, el
valor es el bit más significativo del segundo operando. Los flags SF
, ZF
y PF
se modifican de acuerdo con el resultado
obtenido.
Instrucción | Descripción |
---|---|
RCL $inm, %reg RCR $inm, %reg |
Rota el
contenido de %reg concatenado con el flag
CF a la izquierda (RCL ) o derecha (RCR )
tantas posiciones como indica inm . Si el
desplazamiento es a la izquierda, para cada desplazamiento el bit más
significativo se carga en el flag CF y éste
pasa a ser el bit menos significativo. Si el desplazamiento es a la
derecha, para cada desplazamiento el bit menos significativo se carga
en el flag CF y éste pasa a ser el bit más
significativo. |
RCL %cl, %reg RCR %cl, %reg |
Rota el
contenido de %reg concatenado con el flag
CF a la izquierda (RCL ) o derecha (RCR )
tantas posiciones como indica el registro %cl . Si el desplazamiento es a la izquierda, para
cada desplazamiento el bit más significativo se carga en el flag CF y éste pasa a ser el bit menos significativo. Si
el desplazamiento es a la derecha, para cada desplazamiento el bit
menos significativo se carga en el flag CF y
éste pasa a ser el bit más significativo. |
RCLs $inm, mem RCRs $inm, mem |
Rota el dato
cuyo tamaño viene especificado por el sufijo s y que está almacenado en memoria a partir de la
posición mem concatenado con el flag CF a la izquierda (RCL ) o
derecha (RCR ) tantas posiciones como indica
inm . Si el desplazamiento es a la izquierda,
para cada desplazamiento el bit más significativo se carga en el flag
CF y éste pasa a ser el bit menos
significativo. Si el desplazamiento es a la derecha, para cada
desplazamiento el bit menos significativo se carga en el flag CF y éste pasa a ser el bit más significativo. |
RCLs %cl, mem RCRs %cl, mem |
Rota el dato cuyo tamaño viene especificado
por el sufijo s y que está almacenado en
memoria a partir de la posición mem
concatenado con el flag CF a la izquierda
(RCL ) o derecha (RCR ) tantas posiciones como indica el registro
%cl . Si el desplazamiento es a la izquierda,
para cada desplazamiento el bit más significativo se carga en el flag
CF y éste pasa a ser el bit menos
significativo. Si el desplazamiento es a la derecha, para cada
desplazamiento el bit menos significativo se carga en el flag CF y éste pasa a ser el bit más significativo. |
Estas instrucciones hacen que el operando destino, concatenado con
el flag de acarreo CF
se comporte igual que
si tuviese una estructura circular. Es decir, el bit más significativo
pasa al accarreo y éste al menos significativo si se desplaza a
izquierda, y al revés si se desplaza a derecha.
Esta instrucción se utiliza para posicionar un determinado bit de un dato en el bit de acarreo y así poder consultar su valor. Mediante la operación inversa, permite dejar tanto el operando como el flag con su valor anterior.
Aparte del flag CF
que almacena uno de los
bits del operando, el otro flag que se modifica es OF
pero sólo en los casos en los que el
desplazamiento es de un bit. Para desplazamientos a izquierda OF
contiene el resultado de la disyunción exclusiva
entre CF
tras el desplazamiento y el bit más
significativo del resultado. Para desplazamientos a la derecha, OF
es igual a la disyunción exclusiva de los dos
bits más significativos del resultado.
El resto de flags SF
, ZF
y PF
no se
modifican.
Instrucción | Descripción |
---|---|
ROL $inm, %reg ROR $inm, %reg |
Rota el
contenido de %reg a la izquierda (ROL ) o derecha (ROR )
tantas posiciones como indica inm . Si el
desplazamiento es a la izquierda, para cada desplazamiento el bit más
significativo pasa a ser el menos significativo. Si el desplazamiento
es a la derecha, para cada desplazamiento el bit menos significativo
pasa a ser el más significativo. |
ROL %cl, %reg ROR %cl, %reg |
Rota el
contenido de %reg a la izquierda (ROL ) o derecha (ROR )
tantas posiciones como indica el registro %cl . Si el desplazamiento es a la izquierda, para
cada desplazamiento el bit más significativo pasa a ser el bit menos
significativo. Si el desplazamiento es a la derecha, para cada
desplazamiento el bit menos significativo pasa a ser el bit más
significativo. |
ROLs $inm, mem RORs $inm, mem |
Rota el dato
cuyo tamaño viene especificado por el sufijo s y que está almacenado en memoria a partir de la
posición mem a la izquierda (ROL ) o derecha (ROR )
tantas posiciones como indica inm . Si el
desplazamiento es a la izquierda, para cada desplazamiento el bit más
significativo pasa a ser el bit menos significativo. Si el
desplazamiento es a la derecha, para cada desplazamiento el bit menos
significativo pasa a ser el bit más significativo. |
ROLs %cl, mem RORs %cl, mem |
Rota el dato cuyo tamaño viene especificado
por el sufijo s y que está almacenado en
memoria a partir de la posición mem a la
izquierda (ROL ) o derecha (ROR ) tantas posiciones como indica el registro
%cl . Si el desplazamiento es a la izquierda,
para cada desplazamiento el bit más significativo pasa a ser el bit
menos significativo. Si el desplazamiento es a la derecha, para cada
desplazamiento el bit menos significativo pasa a ser el bit más
significativo. |
Estas instrucciones hacen que el operando destino se comporte igual que si tuviese una estructura circular. Es decir, el bit más significativo pasa a ser el bit de menos peso si se desplaza a izquierda, y al revés si se desplaza a derecha.
El flag CF
almacena el bit más
significativo si se desplaza a izquierda, y el menos significativo si
se desplaza a derecha. El flag OF
se modifica
sólo en los casos en los que el desplazamiento es de un bit. Para
desplazamientos a izquierda OF
contiene el
resultado de la disyunción exclusiva entre CF
tras el desplazamiento y el bit más significativo del resultado. Para
desplazamientos a la derecha, OF
es igual a
la disyunción exclusiva de los dos bits más significativos del
resultado.
El resto de flags SF
, ZF
y PF
no se
modifican.
Instrucción | Descripción |
---|---|
JMP mem |
Pasa a ejecutar
a continuación la instrucción almacenada a partir de la posición de
memoria mem . |
JMP *%reg |
Pasa a ejecutar a continuación la instrucción
almacenada a partir de la posición de memoria en %reg |
Esta instrucción simplemente cambia la secuencia de ejecución del
procesador que ejecuta la instrucción indicada en la posición de
memoria dada como operando. El uso más común es con una etiqueta como
operando, que es donde pasa a ejecutar el procesador. Si el segundo
operando es un registro con el prefijo *
el
valor del registro se carga en el contador de programa y se ejecuta la
instrucción en la posición de memoria con ese valor.
Instrucción | Condición | Descripción | Instrucción | Condición | Descripción |
---|---|---|---|---|---|
JA mem JNBE mem |
CF = 0 y ZF = 0 |
Salto si mayor, salto si no menor o igual (sin signo) |
JBE mem JNA mem |
CF = 1 ó ZF = 1 |
Salto si menor o igual, salto si no mayor (sin signo) |
JAE mem JNB mem |
CF = 0 |
Salto si mayor o igual, salto si no menor (sin signo) |
JB mem JNAE mem |
CF = 1 |
Salto si menor, salto si no mayor o igual (sin signo) |
JE mem JZ mem |
ZF = 1 |
Salto si igual, salto si cero. |
JNE mem JNZ mem |
ZF = 0 |
Salto si diferente, salto si no cero. |
JG mem JNLE mem |
ZF = 0 y SF = OF |
Salto si mayor, si no menor o igual (con signo) |
JLE mem JNG mem |
ZF = 1 ó SF != OF |
Salto si menor o igual, si no mayor (con signo) |
JGE mem JNL mem |
SF = OF |
Salto si mayor o igual, si no menor (con signo) |
JL mem JNGE mem |
SF != OF |
Salto si menor, si no mayor o igual (con signo) |
JC mem |
CF = 1 |
Salto si acarreo es uno |
JNC mem |
CF = 0 |
Salto si acarreo es cero |
JCXZ mem |
%cx = 0 |
Salto si registro %cx es
cero. |
JECXZ mem |
%ecx = 0 |
Salto si
registro %ecx es cero. |
JO mem |
OF = 1 |
Salto si el bit de desbordamiento es uno. |
JNO mem |
OF = 0 |
Salto si el bit de desbordamiento es cero. |
JPO mem JNP mem |
PF = 0 |
Salto si paridad impar, si no paridad. |
JPE mem JP mem |
PF = 1 |
Salto si paridad par, si paridad. |
JS mem |
SF = 1 |
Salto si positivo. |
JNS mem |
SF = 0 |
Salto si negativo. |
Instrucción | Descripción |
---|---|
CALL mem |
Invoca la
subrutina cuya primera instrucción está en la posición de memoria mem . Se salva el contador de programa en la cima de
la pila. |
CALLs *%reg |
Invoca la subrutina cuya primera instrucción
está en la posición de memoria contenida en el registro %reg . |
El efecto relevante de esta instrucción es que deposita en la cima de la pila la dirección de retorno, o lo que es lo mismo, la dirección de la instrucción que sigue a esta en el flujo de ejecución. Esta instrucción no modifica los flags de la palabra de estado.
Instrucción | Descripción |
---|---|
RET |
Retorna la ejecución a la instrucción cuya dirección está almacenada en la cima de la pila. Esta dirección se saca de la pila. |
El aspecto relevante de esta instrucción es que supone que la dirección a la que debe retornar está almacenada en la cima de la pila. Esta instrucción no modifica los flags de la palabra de estado.
Instrucción | Descripción |
---|---|
CMP %regA, %regB |
Realiza la
operación %regB - %regA y modifica los flags con el resultado que no
se almacena en lugar alguno. |
CMP $inm, %reg |
Realiza la
operación %reg - inm y modifica los flags con el restulado que no se
almacena en lugar alguno. |
CMP mem, %reg |
Realiza la
operación mem - %reg y modifica los flags con el restulado que no
se almacena en lugar alguno. |
CMP %reg, mem |
Realiza la
operación mem - %reg y modifica los flags con el resultado que no
se almacena en lugar alguno. |
CMPs $inm, mem |
Resta el dato almacenado a partir de la
posición de memoria mem y cuyo tamaño está
especificado por el sufijo s del valor inm codificado con tantos bits como indica el
sufijo s . Se modifican los flags con el
resultado de esta resta que no se almacena en lugar alguno. |
El efecto de esta instrucción se refleja únicamente en los flags de la palabra de estado. Estos flags se pueden utilizar para, por ejemplo, cambiar el flujo de ejecución mediante una instrucción de salto condicional.
Instrucción | Descripción |
---|---|
TEST %regA, %regB |
Realiza la
conjunción bit a bit entre %regB y %regA y modifica los flags con el resultado que no
se almacena en lugar alguno. |
TEST $inm, %reg |
Realiza la
conjunción bit a bit entre %reg e inm y modifica los flags con el restulado que no se
almacena en lugar alguno. |
TEST mem, %reg |
Realiza la
conjunción bit a bit entre mem y %reg y modifica los flags con el restulado que no
se almacena en lugar alguno. |
TEST %reg, mem |
Realiza la
conjunción bit a bit entre mem y %reg y modifica los flags con el resultado que no
se almacena en lugar alguno. |
TESTs $inm, mem |
Realiza la conjunción bit a bit entre el dato
almacenado a partir de la posición de memoria mem y cuyo tamaño está especificado por el sufijo
s y el valor inm
codificado con tantos bits como indica el sufijo s . Se modifican los flags con el resultado de esta
resta que no se almacena en lugar alguno. |
El efecto de esta instrucción se refleja únicamente en los flags de
la palabra de estado. Los flags OF
y CF
se ponen a cero. Los flags SF
, ZF
y PF
se modifican de acuerdo con el resultado.