Apéndice A. Subconjunto de instrucciones del Intel Pentium

Tabla de contenidos

A.1. Nomenclatura
A.2. Instrucciones de movimiento de datos
A.2.1. MOV: Movimiento de datos
A.2.2. PUSH: Instrucción de carga sobre la pila
A.2.3. POP: Instrucción de descarga de la pila
A.2.4. XCHG: Instrucción de intercabmio
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.4.1. AND: Instrucción de conjunción
A.4.2. OR: Instrucción de disyunción
A.4.3. XOR: Instrucción de disyunción exclusiva
A.4.4. NOT: Instrucción de negación
A.5. Instrucciones de desplazamiento
A.5.1. SAL/SAR: Desplazamiento aritmético
A.5.2. SHL/SHR: Desplazamiento lógico
A.5.3. RCL/RCR: Instrucción de rotación con acarreo
A.5.4. ROR/ROL: Instrucción de rotación sin acarreo
A.6. Instrucciones de salto
A.6.1. JMP: Instrucción de salto incondicional
A.6.2. Jcc: Instrucciones de salto condicional
A.6.3. CALL: Instrucción de llamada a subrutina
A.6.4. RET: Instrucción de retorno de subrutina
A.7. Instrucciones de comparación y comprobación
A.7.1. CMP: Instrucción de comparación
A.7.2. TEST: Instrucción de comprobación

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.

A.1. Nomenclatura

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.

A.2. Instrucciones de movimiento de datos

A.2.1. MOV: Movimiento de datos

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.

A.2.2. PUSH: Instrucción de carga sobre la pila

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.

A.2.3. POP: Instrucción de descarga de la pila

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.

A.2.4. XCHG: Instrucción de intercabmio

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.

A.3. Instrucciones aritméticas

A.3.1. ADD: Instrucción de suma

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.

A.3.2. SUB: Instrucción de resta

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.

A.3.3. INC: Instrucción de incremento

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.

A.3.4. DEC: Instrucción de decremento

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.

A.3.5. NEG: Instrucción de cambio de signo

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.

A.3.6. MUL: Instrucción de multiplicación sin signo

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.

A.3.7. DIV: Instrucción de división sin signo

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.

A.3.8. IMUL: Instrucción de multiplicación con signo

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.

A.3.9. IDIV: Instrucción de división con signo

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.

A.4. Instrucciones lógicas

A.4.1. AND: Instrucción de conjunció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.

A.4.2. OR: Instrucción de disyunción

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.

A.4.3. XOR: Instrucción de disyunción exclusiva

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.

A.4.4. NOT: Instrucción de negación

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.

A.5. Instrucciones de desplazamiento

A.5.1. SAL/SAR: Desplazamiento aritmético

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.

A.5.2. SHL/SHR: Desplazamiento lógico

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.

A.5.3. RCL/RCR: Instrucción de rotación con acarreo

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.

A.5.4. ROR/ROL: Instrucción de rotación sin acarreo

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.

A.6. Instrucciones de salto

A.6.1. JMP: Instrucción de salto incondicional

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.

A.6.2. Jcc: Instrucciones de salto condicional

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.

A.6.3. CALL: Instrucción de llamada a subrutina

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.

A.6.4. RET: Instrucción de retorno de subrutina

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.

A.7. Instrucciones de comparación y comprobación

A.7.1. CMP: Instrucción de comparación

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.

A.7.2. TEST: Instrucción de comprobación

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.