Tabla de contenidos
El procesador Intel Pentium 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 del Intel Pentium 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
, donde etiq
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 en s
esto denota que la instrucción requiere un
sufijo de tamaño B
, W
o L
.
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 $imm, 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 $imm, 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 $imm, 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 $imm, 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 $imm, 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 $imm, 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 $imm, 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 $imm, 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.