Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Transferencia de datos
Aritmticas (Entera binaria, BCD y ASCII)
Operaciones Lgicas
Corrimientos y Rotaciones
Gestin de Bits
Gestin de Cadenas
Control del Programa
Control del Sistema
Transferencia de datos
Las instrucciones de transferencia de datos son las encargadas de mover datos de un sitio a
otro de la computadora como pueden ser la memoria, el espacio de E/S y los registros del
CPU. Las instrucciones mas comunes en los programas escritos en lenguaje ensamblador son
tpicamente stas de transferencia de datos. El conjunto de instrucciones del 8088 incluye 14
instrucciones de transferencia de datos las cuales mueven datos del tamao de un byte o de una
palabra. La Tabla 1 lista estas instrucciones y da una breve nota sobre la operacin de cada
una de ella.
Tabla 1. Instrucciones de transferencia de datos
Cdigo de operacin
MOV
PUSH
PUSHF
LAHF
SAHF
POP
POPF
IN
OUT
XCHG
XLAT
LEA
LDS
LES
Funcin
Transfiere una palabra o un byte
Transfiere una palabra a la pila
Introduce el registro de bandera a la pila
Transfiere el registro de banderas a AH
Transfiere AH al registro de bandera
Extrae una palabra de la pila
Carga el registro de banderas con una palabra de la pila
Lee un dato desde un dispositivo de E/S al acumulador
Transfiere un dato del acumulador a un dispositivo de E/S
Intercambia una palabra o byte
Traduce (utiliza una Tabla {Lookup Table})
Carga la direccin efectiva
Carga DS y el operando con una direccin de 32 bits
Carga ES y el operando con una direccin de 32 bits
U.A.B.C.
PUSH/POP
PUSH y POP son instrucciones importantes utilizadas para empujar o sacar datos del
segmento de pila. El microprocesador 8088 posee la instruccin PUSH y POP puede operar
sobre registros, registro/memoria, registro de segmento y banderas.
En la operacin con registros, siempre opera sobre registros de 16 bits para transferir la
informacin al segmento de pila. En registro/memoria almacena el contenido de 16 bits de
alguna localidad de memoria (2 localidades) al segmento de pila. Cuando se opera sobre
registros de segmento es permitido transferir cualquier registro de segmento al segmento de pila
pero el segmento de cdigo (CS) no puede ser recuperado de la pila. Cuando las instrucciones
PUSH y POP operan sobre el registro de banderas se puede transferir o recuperar el estado de
este registro.
PUSH
La instruccin PUSH siempre transfiere 2 bytes de informacin a la pila. Cuando un dato es
metido a la pila, el primer byte (mas significativo) es almacenado en la pila en la localidad
direccionada por SP-1. El segundo byte (menos significativo) es almacenado en la pila en la
localidad direccionada por SP-2. Despus de que el dato se a empujado a la pila, el registro
SP es decrementado en 2. La Figura 1 muestra la ejecucin de la instruccin PUSH AX, la cual
transfiere el contenido de AX en la pila ([SP-1]=AH, [SP-2]=AL y SP=SP-2).
Segmento de
Pila
Registros
AX
12FFF
6AB3
6AB3
antes de PUSH AX
SP
0800
SS
DS
0300
6A
B3
03780
037FF
037FE
03000
Figura 1. El efecto de una ejecucin de una instruccin PUSH AX sobre el registro SP.
U.A.B.C.
POP
La instruccin POP realiza lo inverso a la instruccin PUSH. POP remueve datos de la pila a un
registro dado. Supngase que la instruccin POP BX es ejecutada. El primer byte del dato es
removido de la pila , esto de la localidad direccionada por SP y es almacenado en registro BL.
El segundo byte es removido de la localidad dada por SP+1 y colocado en el registro BH.
Despus de que ambos datos fueron extrados de la pila, el apuntador de pila (SP) es
incrementado en 2. La figura 2 muestra la ejecucin de la instruccin POP BX.
Segmento de
Pila
Registros
BX
BH
BL
39
2F
0FFFF
362F
SP
1006
antes de POP BX
SS
DS
39
2F
01008
01007
01006
0000
00000
Figura 2. El efecto de una ejecucin de una instruccin POP BX sobre el registro SP.
PUSHF
La instruccin PUSHF copia el contenido del registro de bandera a la pila. Al igual que la
instruccin PUSH, PUSHF almacena la parte mas significativa del registro de banderas en la
localidad SP-1 y la menos significativa en la localidad SP-2. Despus del almacenar el registro
de banderas, SP se decrementa 2 unidades.
POPF
La instruccin POPF realiza la operacin inversa de PUSHF, POPF remueve de la pila un dato
de 16 bits que es cargado como el contenido del registro de banderas.
LAHF
Carga el registro AH con banderas, LAHF copia el bytes de orden inferior del registro de
banderas en AH. Despus de la ejecucin de esta instruccin, los bits 7,6,4,2 y 1 de AH son
iguales a las banderas S, Z, A, P y C respectivamente.
U.A.B.C.
SAHF
Almacena AH en el registro de banderas, SAHF copia el contenido de AH en el bytes de
orden inferior del registro de banderas. Despus de la ejecucin de esta instruccin las
banderas S, Z, A, P y C son iguales a los bits 7, 6, 4, 2 y 1 de AH, respectivamente.
IN y OUT
La Tabla 2 muestra una lista de la formas de las instrucciones IN y OUT. Note que solo el
registro AL y AX estn siendo utilizados para la transferencia de datos entre los dispositivos de
E/S y el microprocesador. La instruccin IN transfiere un dato desde un puerto E/S al registro
AL o AX, y la instruccin OUT transfiere una dato del registro AX o AL a un puerto de E/S.
Existen dos formas para el direccionamiento de puertos con la instruccin IN y OUT las cuales
son:
puerto fijo y puerto variable. El direccionamiento con puerto fijo permite la
transferencia de datos entre AL o AX y un puerto de E/S con direccin de 8 bits. Se le llama
direccionamiento "puerto fijo" porque la direccin de puerto se almacena con la instruccin
(anlogamente al direccionamiento inmediato).
El direccionamiento puerto variable permite la transferencia de datos entre AL o AX y un
puerto de E/S con direccin de 16 bits. A este direccionamiento se de llama puerto variable
porque la direccin del puerto se almacena en el registro DX, el cual puede ser cambiado por el
programador.
Tabla 2. Instrucciones IN y OUT.
Cdigo de operacin
IN AL, pp
IN AX,pp
IN AL,DX
IN AX,DX
OUT pp,AL
OUT pp,AX
OUT DX,AL
OUT DX,AX
Funcin
Un dato de 8 bits se transfiere del puerto pp a AL
Un dato de 16 bits se transfiere del puerto pp a AX
Un dato de 8 bits se transfiere del puerto DX a AL
Un dato de 16 bits se transfiere del puerto DX a AX
Un dato de 8 bits se transfiere de AL al puerto DX
Un dato de 16 bits se transfiere de AX al puerto pp
Un dato de 16 bits se transfiere de AL al puerto DX
Un dato de 16 bits se transfiere de AX al puerto DX
U.A.B.C.
Tamao de la instruccin
XCHG AX,reg
XCHG reg,reg
XCHG reg,mem
1 byte
2 byte
2 byte
XLAT
La instruccin XLAT (translate) convierte el contenido del registro AL en un numero
almacenado en una tabla. Esta instruccin se utiliza para realizar una tcnica directa de
conversin de un cdigo a otro (lookup table). Una instruccin XLAT primero suma el
contenido de AL con el contenido del registro BX para formar una direccin del segmento de
datos, luego el dato almacenado en esta direccin es cargado en el registro AL. Esta instruccin
no posee operando, ya que siempre opera sobre AL.
LEA
La instruccin LEA se utiliza para cargar un registro con la direccin de un dato especificado
por un operando (Variable). En el primer ejemplo de la Tabla 4 la direccin de DATA se
almacena en el registro AX, cabe notar que la direccin y no el contenido de la direccin
DATA se almacena en el registro AX.
En una comparacin de la instruccin LEA con MOV se puede observar lo siguiente: LEA
BX,[DI] carga la direccin especificada por [DI] (contenido de DI) en el registro BX, MOV
BX[DI] carga el contenido de la localidad direccionada por DI en el registro BX.
Tabla 4. Instruccin XCHG
Cdigo de operacin
LEA AX,DATA
LDS DI,LIST
LES BX,CAT
Funcin
Ahora por que si la directiva OFFSET realiza la misma tarea que la instruccin LEA est
disponible?. La respuesta es que OFFSET se puede usar solamente para un operando sencillo
tal como LIST, DATA etc., esta directiva no puede utilizarse en operandos como [DI],
LIST[SI]. La directiva OFFSET es mas eficiente que LEA para operandos sencillos, esto es,
el microprocesador 8088 toma ocho ciclos de reloj para ejecutar la instruccin en cambio
OFFSET requiere solo cuatro ciclos de reloj.
U.A.B.C.
LDS y LES
Las instrucciones LDS y LES cargan un registro de 16 bits con un desplazamiento (direccin) y
el registro segmento DS o ES con una nueva direccin de segmento. Esta instrucciones utilizan
cualquier modo de direccionamiento a memoria vlido para seleccionar la localidad del nuevo
desplazamiento y nuevo valor de segmento. En la Figura 3 se muestra la operacin de la
instruccin LDS BX[DI] la cual transfiere la direccin de 32 bits al registro BX y DS que inicia
en la localidad de memoria direccionada por el registro DI.
Segmento de
Datos
Registros
AX
BX
1FFFF
6F2A
89
30
6F
2A
6F2A
DI
1000
11003
11002
11001
11000
8930
CS
DS
1000
10000
U.A.B.C.
Instrucciones Aritmticas
El 8088 es capaz de sumar, restar, multiplicar y dividir datos ya sean del tipo byte o palabra.
Este microprocesador suma y resta utilizando datos (bytes o palabras) con signo o sin signo y
datos BCD o ASCII. La multiplicacin y divisin se realiza con operandos de 8 o 16 bits con
signo, sin signo o nmeros ASCII. La Tabla 5 muestra las instrucciones aritmticas que posee
el microprocesador 8088.
Tabla 5. Instrucciones Aritmticas
Cdigo de operacin
ADD
ADC
AAA
DAA
INC
SUB
SBB
NEG
CMP
AAS
DAS
DEC
MUL
IMUL
AAM
DIV
IDIV
CBW
CWD
AAD
Funcin
Suma bytes o palabras
Suma bytes o palabras con acarreo
Ajusta a ASCII despus de la suma
Ajusta a BCD despus de la suma
Incrementa 1 a un byte o palabra
Resta bytes o palabras
Resta bytes o palabras con prstamo
Cambia el signo de un bytes o palabra
Compara bytes o palabras
Ajusta a ASCII despus de la resta
Ajusta a BCD despus de la resta
Decrementa 1 a un byte o palabra
Multiplica bytes o palabras sin signo
Multiplica bytes o palabras con signo
Ajuste a ASCII despus de la multiplicacin
Divide bytes o palabras sin signo
Divide bytes o palabras con signo
Convierte un byte a palabra
Convierte una palabra a doble-palabra
Ajuste a ASCII antes de la divisin
U.A.B.C.
SUMA (ADD)
La Tabla 6 indica los modos de direccionamiento soportados por la instruccin ADD (casi
todos los modos de direccionamiento mencionados en la unida II). Puesto que hay cerca de
1000 variaciones posibles de la instrucciones de suma en el juego de instrucciones del 8088 es
imposible incluirlas todas en esta tabla .
Los nico tipos de suma no permitidos son memoria-memoria y registro de segmento. Los
registros de segmento slo se pueden mover, introducir o extraer de la pila.
Suma de registro
El ejemplo 1 muestra un programa que usa la instruccin de suma en los registros para sumar el
contenido de varios registros. En este ejemplo se suman los contenidos de AX, BX, CX y DX.
Este ejemplo forma un resultado de 16 bits que se almacena en el registro AX.
Tabla 6. Instrucciones de Suma.
Instrucciones
Comentario
ADD AL,BL
AL = AL + BL
ADD CX,DI
CX = CX + DI
ADD CL,44H
CL = CL + 44H
ADD BX,35AFH
BX = BX+35AFH
ADD [BX],AL
DS:[BX] = DS:[BX]+AL
ADD CL,[BP]
CL=CL+SS:[BP]
ADD BX,[SI+2]
BX=BX+DS:[SI+2]
ADD CL,TEMP
CL=CL+[ offset TEMP]
ADD BX,TEMP[DI]
BX=BX+[ offset TEMP + DI]
ADD [BX+DI],DL
DS:[BX+DI]=DS:[BX+DI]+DL
Ejemplo 1
ADD AX,BX
ADD AX,CX
ADD AX,DX
Siempre que una instruccin aritmtica o lgica se ejecuta, cambia el contenido del registro de
banderas. Las banderas denotan el resultado de la operacin aritmtica. Cualquier instruccin
ADD modifica el contenido de las banderas de signo, cero, acarreo, acarreo auxiliar, paridad y
sobreflujo.
Suma inmediata. La suma inmediata se usa cuando se suma una constante o dato conocido.
En el ejemplo 2 aparece una suma inmediata de 8 bits. En este ejemplo, primero se carga 12H
en DL. A continuacin se suma un 33H a el 12H. Ambas son instrucciones inmediatas.
Despus de la suma, el resultado de la suma (45H) se carga al registro DL y las banderas
cambian de la siguiente forma:
U.A.B.C.
ZF
CF
AF
SF
PF
OF
Ejemplo 2
MOV DL,12H
ADD DL,33H
Suma de memoria a registro. Supngase que una aplicacin requiere la suma de un dato de
memoria y el registro AL. El ejemplo 3 muestra un ejemplo que suma dos byte consecutivos de
datos, almacenados en el segmento de datos en las localidades NUMB y NUMB+1, al registro
AL.
Ejemplo 3
MOV DI,OFFSET NUMB ;direcciona NUMB
MOV AL,0
;limpia sum
ADD AL,[DI]
;suma NUMB
ADD AL,[DI+1]
;suma NUMB+1
La secuencia de instrucciones primero carga el contenido del registro ndice destino DI con la
direccin de NUMB. El registro DI usado en este ejemplo direcciona datos en el segmento de
datos empezando desde la localidad de memoria NUMB. A continuacin la instruccin ADD
AL,[DI] suma el contenido de la localidad de memoria NUMB a AL. Esto ocurre porque DI
direcciona la localidad de memoria NUMB, y la instruccin suma su contenido al registro AL.
A continuacin la instruccin ADD AL,[DI+1] suma el contenido de la localidad de memoria
NUMB+1 al registro AL. Despus que se han ejecutado las dos instrucciones ADD, el
resultado aparece en el registro AL formando la suma de los contenidos de NUMB y
NUMB+1.
Suma de arreglos. Los arreglos de memoria contienen listas de datos. Supongamos que un
arreglo de datos ARRAY contiene 10 byte de datos numerados del elemento 0 al elemento 9.
El ejemplo 4 muestra un programa que suma los contenidos de los elementos 3, 5 y 7. (El
programa y los elementos del arreglo que suma se eligieron para demostrar el uso de algunos
modos de direccionamiento del microprocesador 8088.
U.A.B.C.
Ejemplo 4
MOV AL,0
;limpia suma
MOV SI,3
;direcciona elemento 3
ADD AL,ARRAY[SI] ;suma elemento 3
ADD AL,ARRAY[SI+2]
;suma elemento 5
ADD AL,ARRAY[SI+4]
;suma elemento 7
Este ejemplo limpia el registro AL a cero, de tal forma que pueda ser utilizado como
acumulador. A continuacin se carga el registro SI con un 3 para direccionar inicialmente al
tercer elemento del arreglo. La instruccin ADD AL,ARRAY[SI] suma el contenido del
elemento nmero 3 del arreglo a la suma en el registro AL. Las instrucciones que siguen suman
los elementos 5 y 7 del arreglo a la suma en el registro AL, usando un 3 en SI ms un
desplazamiento de 2 para direccionar el elemento 5 y un desplazamiento de 4 para direccionar
el elemento 7.
10
U.A.B.C.
Ejemplo 5
MOV DI,OFFSET NUMB ;direcciona NUMB
MOV AL,0
;limpia suma
ADD AL,[DI]
;suma NUMB
INC DI
;direcciona NUMB+1
ADD AL,[DI]
;suma NUMB+1
El ejemplo 5 muestra como se puede modificar el programa del ejemplo 3 para usar un
incremento direccionando NUMB y NUMB+1. Aqu, la instruccin INC DI cambia el
contenido del registro DI de la direccin de compensacin NUM a la direccin de
compensacin NUMB+1. Los programas de los ejemplos 3 y 5 suman los contenidos de
NUMB y NUMB+1. La diferencia en los programas es la forma en que esos datos son
direccionados por medio de los contenidos del registro DI.
La instruccin incremento afecta los bits de bandera como lo hacen la mayora de los
operadores aritmticos y lgicos, la nica diferencia es que la instruccin INC no afecta la
bandera de acarreo. La razn es que con frecuencia se usan las instrucciones incremento en
programas que dependen del contenido de la bandera de acarreo.
Suma con acarreo. Una instruccin de suma con acarreo realiza la suma del bit de la bandera
de acarreo C y un dato (operando). Esta instruccin aparece en software en sumas de
nmeros que ocupan ms de 16 bit.
La Tabla 8 lista varias instrucciones de suma con acarreo (ADC) con comentarios que explican
su operacin. Como la instruccin ADD, ADC afecta las banderas despus de la suma.
Tabla 8. Instrucciones Suma con acarreo.
Instrucciones
Comentarios
ADC AL,AH
AL = AL + AH + CF
ADC CX,BX
CX = CX + BX + CF
ADC [BX],DH
DS:[BX]=DS:[BX] + DH + CF
ADC BX,[BP+2]
BX=BX+SS:[BP+2]+CF
Suponga que un nmero de 32 bit contenido en los registros BX y AX se suma a un nmero de
32 bit contenido en los registros DX y CX. La figura 4 muestra esta suma de tal forma que
pueda entenderse la funcin del acarreo. Esta suma no puede llevarse a cabo sin la suma del bit
de acarreo porque el 8088 suma slo nmeros de 8 y 16 bit. El ejemplo 6 muestra cmo
ocurre la suma en un programa. Aqu, el contenido de los registros AX y CX se suma para
formar los 16 bit menos significativos de la suma. Esta suma puede o no generar un acarreo. Si
la suma es mayor que FFFFH aparece un acarreo. Puesto que es imposible predecir un
acarreo, los 16 bit ms significativos de la suma son sumados con la bandera de acarreo usando
11
U.A.B.C.
la instruccin ADC. Este programa suma BX-AX a DX-CX con el resultado de la suma en
BX-AX.
CF
(ADC)
(ADD)
BX
AX
DX
CX
BX
AX
12
U.A.B.C.
Resta de registro. El ejemplo 7 muestra un programa que realiza una resta de registro. Este
programa resta los 16 bit contenidos en CX y DX del contenido del registro BX. Despus de
cada resta, el microprocesador modifica el contenido del registro de banderas. como se
mencion anteriormente, las banderas cambian con la mayora de instrucciones aritmticas y
lgicas.
Ejemplo 7
SUB BX,CX
SUB BX,DX
Resta inmediata. Al igual que la suma, el 8088 tambin permite operandos inmediatos para la
resta. El ejemplo 8 presenta un pequeo programa que resta un 44H de un 22H. Aqu, primero
se carga el 22H en CH usando una instruccin de movimiento (asignacin) inmediato. A
continuacin, la instruccin SUB, usando el dato inmediato 44H, substrae el 44H del 22H.
Despus de la resta la diferencia (DEH) se mueve (asigna) al registro CH. Las banderas
cambian de la siguiente manera para esta resta:
ZF = 0 resultado distinto de cero.
CF = 1 prstamo.
AF = 1 medio prstamo.
SF = 1 resultado negativo.
PF = 1 paridad par.
OF = 0 no hay sobreflujo.
Ejemplo 8
MOV CH,22H
SUB CH,44H
Las dos banderas de acarreo (CF y AF) actan como prstamos despus de una resta, en
lugar de acarreo, como lo hace despus de una suma. Notar en este ejemplo que no hay
sobreflujo. Este ejemplo substrae 44H (+68) de un 22H (+34) resultando un DEH (-34).
Puesto que el resultado correcto con signo de 8 bit es un -34 no hay sobreflujo en este
ejemplo. Un sobreflujo de 8 bit slo ocurre si el resultado con signo es mayor que +127 o
menor que -128.
13
U.A.B.C.
Resta con prstamo. Una instruccin resta con prstamo (SBB) funciona como una resta
regular, excepto que la bandera de acarreo (CF), la cual acta como prstamo tambin se
substrae de la diferencia. El uso ms comn de esta instruccin es en substracciones mayores
de 16 bit. Estas substracciones requieren que el prstamo se propague a travs de la resta, de
la misma forma que con adiciones grandes se requiere que se propague el acarreo. La Tabla 11
lista muchas instrucciones SBB con comentarios que definen su operacin. Al igual que la
instruccin SUB, SBB afecta las banderas. Notar que la instruccin de resta de memoria
inmediata en esta tabla requiere de una directiva ya sea Byte PTR O WORD PTR.
Tabla 11. Instrucciones de Resta con Acarreo.
Instrucciones
Comentarios
SBB AH,AL
AH = AH - AL - CF
SBB AX,BX
AX = AX - BX - CF
SBB CL,3
CL = CL -3 - CF
SBB BYTE PTR[DI],3
DS:[DI]=DS:[I]-3-CF
SBB [DI],AL
DS:[DI]=DS:[DI]-AL-CF
SBB DI,[BP+2]
DI=DI-SS:[BP+2]-CF
Cuando un nmero de 32 bit almacenado en BX y AX se substrae de un nmero de 32 bit
almacenado en SI y DI, la bandera de acarreo propaga el prstamo entre las dos
substracciones de 16 bit requeridas para realizar la operacin. La figura 5 muestra como se
propaga el prstamo por medio de la bandera de acarreo para esta tarea. El ejemplo 9 muestra
como se realiza esta resta por un programa. Con restas grandes, los 16 bit menos significativos
son substrados con la instruccin SUB. Todos los datos siguientes son substrados usando la
instruccin SBB. El ejemplo usa la instruccin SUB para substraer DI de AX, luego SBB para
substraer con prstamo SI de BX.
14
U.A.B.C.
CF
(SBB)
(SUB)
BX
AX
SI
DI
BX
AX
COMPARACION
La instruccin de comparacin (CMP) es una resta que no cambia nada excepto las banderas.
Se emplea una comparacin para verificar el contenido de un registro o de una localidad de
memoria con otro valor. Normalmente despus de un CMP hay una instruccin de salto
condicional, la cual prueba la condicin en las banderas.
La Tabla 12 muestra una variedad de instrucciones de comparacin que usan los mismos
modos de direccionamiento que la suma y resta ya presentadas. De igual forma, la nica forma
de comparacin no permitida es memoria-memoria y registro de segmento.
Ejemplo 10
CMP AL,10h
JAE SUBER
15
U.A.B.C.
MULTIPLICACIN Y DIVISION
Unicamente los microprocesadores ms modernos o anteriormente el 8086/8088 contienen
instrucciones de multiplicacin y divisin. Los microprocesadores anteriores de 8 bit no eran
capaces de multiplicar y dividir directamente. Esas tareas necesitaban de un programa
especfico que multiplicara o dividiera. Debido a que los fabricantes de microprocesadores
notaron esta deficiencia, incorporaron instrucciones de multiplicacin y divisin al juego de
instrucciones de los nuevos microprocesadores.
Multiplicaciones
La multiplicacin, en el microprocesador 8088, se realiza en byte o palabra y puede ser con
signo entero (IMUL) o sin signo (MUL). El resultado despus de la multiplicacin es siempre
un nmero de doble ancho. Si se multiplican dos nmeros de 8 bit se genera un producto de 16
bit, y si multiplicamos dos nmeros de 16 bit se genera un producto de 32 bit.
Algunas banderas (OF o CF) cambian cuando la instruccin multiplicacin se ejecuta y produce
resultados predecibles. Las otras banderas tambin cambian pero sus resultados son
impredecibles y por tanto no son usados. En una multiplicacin de 8 bit los bit ms
significativos del resultado son cero, las banderas CF y OF son igual a cero. Estas banderas
16
U.A.B.C.
U.A.B.C.
del multiplicador se deja a eleccin del programador. La Tabla 14 muestra varias instrucciones
diferentes de 16 bit.
Tabla 14. Instrucciones de Multiplicacin de 16 bits.
Instrucciones
Comentarios
MUL CX
DX-AX = AX * CX
IMUL DI
DX-AX = AX * DI
MUL WORD PTR[SI]
DX-AX=AX*DS:[SI]
Divisin
Cmo en la multiplicacin, la divisin en el 8088 se lleva a cabo con nmeros de 8 y 16 bit que
son nmeros enteros con signo (IDIV) o sin signo (DIV). El dividendo es siempre de doble
ancho, que es dividido por el operando. Esto quiere decir que una divisin de 8 bit, divide un
nmero de 16 bit entre uno de 8 bit, la divisin de 16 bit divide un numero de 32 bit entre uno
de 16 bit. El 8088 no tiene una instruccin de divisin inmediata disponible.
Ninguna de las banderas cambian en forma predecible con una divisin. Una divisin puede
resultar en dos tipos diferentes de errores. Uno de estos es intentar dividir entre cero y el otro
es un sobreflujo por divisin. Un error de sobreflujo por divisin ocurre cuando se divide un
nmero muy pequeo entre uno muy grande. Por ejemplo, supongamos que AX= 3000 y que
lo dividimos entre dos. Puesto que el cociente de una divisin de 8 bit se almacena en AL, y
1500 no cabe, entonces el resultado causa un sobreflujo por divisin. En ambos casos, el
microprocesador genera una interrupcin si ocurre un error por divisin.
Divisin de 8 bit. Una divisin de 8 bit emplea el registro AX para almacenar el dividendo que
ser dividido entre el contenido de un registro de 8 bit o una localidad de memoria. Despus de
la divisin, el cociente se almacena en AL y el residuo en AH. Para una divisin con signo el
cociente es positivo o negativo, pero el residuo siempre es un nmero entero positivo. Por
ejemplo, si AX=0010H (+16) y BL=FDH (-3) y se ejecuta la instruccin IDIV BL, entonces
AX queda AX=01FBH. Esto representa un cociente de -5 con un residuo de 1. La Tabla 15
muestra algunas de las instrucciones de divisin de 8 bit.
Tabla 15. Instrucciones de Divisin de 8 Bits.
Instrucciones
Comentarios
DIV CL
AL= AX / CL,
AH=Residuo
IDIV BL
AL= AX / BL,
AH=Residuo
DIV BYTE PTR[BP]
AX=AX / SS:[BP], AH=Residuo
Con la divisin de 8 bit, normalmente los nmeros son de 8 bit. Esto significa que uno de ellos,
el dividendo, debe convertirse a uno de 16 bit en AX. Esto se realiza en forma diferente para
nmeros con signo y sin signo. Para nmeros sin signo el bit ms significativo se debe de poner
18
U.A.B.C.
a cero (cero extendido). Para los nmeros con signo, los 8 bit menos significativos son con
signo extendidos en los 8 bit ms significativos. En el microprocesador 8088 existe una
instruccin especial que signa nmeros extendidos de AL en AH o convierte un nmero con
signo de 8 bit en AL en uno con signo de 16 bit en AX. La instruccin CBW (Convierte de
Byte a Palabra) realiza esta conversin.
Ejemplo 12
MOV AL NUMB
;obtiene NUMB
MOV AH,0
;cero extendido
DIV NUMB1
;divide entre NUMB1
MOV ANSQ,AL
;Guarda el cociente
MOV ANSR,AH
;Guarda el residuo.
El ejemplo 12 muestra un programa que divide un byte sin signo de 8 bit de la localidad de
memoria NUMB por el contenido sin signo de la localidad NUMB1. Aqu, se almacena el
cociente en la localidad de memoria ANSQ y el residuo en la localidad ANSR. Notar que el
contenido de la localidad NUMB es trado de memoria y luego se extiende a cero para formar
un nmero sin signo de 16 bit para el dividendo.
Ejemplo 13
MOV AL,NUMB
CBW
IDIV NUMB1
MOV ANSQ, AL
MOV ANSR,AH
;obtiene NUMB
;cero extendido
;se divide entre NUMB1
;guarda cociente
;guarda residuo
El ejemplo 13 muestra el mismo programa bsico excepto que los nmeros son nmeros con
signo. Esto quiere decir que en vez de extender a cero AL en AH, nosotros extendemos el
signo usando la instruccin CBW.
Divisin de 16 bit. La divisin de 16 bit es igual que la divisin de 8 bit excepto que en lugar
de dividir en AX se divide en DX-AX, es decir, se tiene un dividendo de 32 bit. Despus de
la divisin de 16 bit, el cociente se guarda en AX y el residuo en DX. La Tabla 16 lista algunas
de las instrucciones de divisin de 16 bit.
Tabla 16.
Instrucciones
DIV CX
IDIV SI
DIV NUMB
Como con la divisin de 8 bit, el dividendo se debe convertir a una forma adecuada. Si se
empieza con un nmero sin signo en AX, entonces DX se debe de poner a ceros. Si AX es un
19
U.A.B.C.
nmero con signo de 16 bit la instruccin CWD (Convierte de Palabra a Doble Palabra)
extiende el signo a un nmero con signo de 32 bit.
Ejemplo 14
MOV AX, -100
MOV CX,9
CWD
IDIV CX
;carga -100
;carga +9
;extiende el signo
El ejemplo 14 muestra la divisin de dos nmeros con signo de 16 bit. Aqu, un -100 en AX se
divide entre +9 en CX. Antes de la divisin, la instruccin CWD convierte el -100 en AX a 100 en DX-AX. Despus de la divisin, los resultados parecen en DX-AX como un cociente
de -11 en DX y un residuo de 1 en DX.
ARITMETICA BCD Y ASCII
El microprocesador permite la manipulacin directa de datos en BCD (Decimal Codificado en
Binario) y ASCII (Cdigo Estndar Americano de Intercambio de Informacin). Esto se realiza
mediante instrucciones que ajustan los nmeros para BCD y ASCII.
Las operaciones en BCD se usan en sistemas tales como cajas registradoras y otros sistemas
que rara vez requieren aritmtica. Las operaciones ASCII se realizan en datos ASCII usados
por algunos programas. Hoy en da rara vez se usa la aritmtica BCD o ASCII.
ARITMETICA BCD
Para la operacin de datos BCD existen dos tcnicas: suma y resta. El juego de instrucciones
del 8088 cuenta con dos instrucciones que corrigen el resultado de una suma o resta BCD. La
instruccin DAA (ajuste decimal despus de suma) sigue a la suma BCD, y DAS (ajuste
decimal despus de resta) sigue a la resta BCD. Ambas instrucciones corrigen el resultado de la
suma y resta de tal forma que sea un nmero en BCD.
Para datos en BCD, el nmero siempre aparece en formato BCD y se almacena con dos
dgitos BCD por byte. Las instrucciones de ajuste slo funcionan en el registro AL despus de
una suma o resta.
Instruccin DAA. La instruccin DAA sigue a las instrucciones ADD o ADC para convertir el
resultado en un resultado en BCD. Supongamos que DX y BX contienen cada uno nmeros de
4 dgitos binarios. El ejemplo 17 proporciona un programa de muestra que suma los nmeros
BCD en DX y BX y almacena el resultado en CX.
Ejemplo 17
MOV DX,1234H
MOV BX,3099H
;carga 1,234
;carga 3,099
20
U.A.B.C.
MOV AL,BL
ADD AL,DL
DAA
MOV CL,AL
MOV AL,BH
ADC AL,DH
DAA
MOV CH,AL
;suma suma BL y DL
;ajusta
;responde a CL
;suma BH con DH y CF
;
;ajusta
;responde a CH
Debido a que la instruccin DAA slo funciona en el registro AL, esta operacin se debe
realizar en 8 bit. Despus de sumar los registros BL y DL, el resultado se ajusta con la
instruccin DAA despus de ser almacenado en CL. A continuacin se suman los registros BH
y DH con el acarreo y el resultado nuevamente se ajusta con DAA despus de almacenarse en
CH. En este ejemplo, 1,234 se suma a 3,099 para generar una suma de 4,333 que se
almacena en CX despus de la suma. Notar que 1,234 BCD es lo mismo que 1234H.
Instruccin DAS. La instruccin DAS funciona de la misma forma que la instruccin DAA,
excepto que sigue a una resta en lugar de una suma. El ejemplo 18 es bsicamente el mismo
que el ejemplo 17, excepto que resta DX y BX en lugar de sumarlos. La diferencia principal en
estos programas es que la instruccin DAA cambia a DAS y las instrucciones ADD y ADC
cambian a SUB y SBB.
Ejemplo 18
MOV DX,1234H
MOV BX,3099H
MOV AL,BL
SUB AL,DL
DAS
MOV CL,AL
MOV AL,BH
SBB AL,DH
DAS
MOV CH,AL
;carga 1,234
;carga 3,099
;resta DL de BL
;ajusta
;responde a CL
;resta DH y CF de BH
;
;ajusta
;responde a CH
ARITMETICA ASCII
Las instrucciones aritmticas en ASCII funcionan con nmeros codificados en ASCII. El rango
de nmeros en valor es de 30H a 39H para los nmeros del 0-9. Hay cuatro operaciones
empleadas con operaciones aritmticas ASCII: AAA (Ajuste a ASCII despus de la suma),
AAD (ajuste a ASCII antes de la divisin), AAM (ajuste a ASCII despus de la
multiplicacin), y AAS (ajusta a ASCII despus de la resta). Estas instrucciones usan el registro
AX como la fuente y como el destino.
21
U.A.B.C.
;carga el ASCII 1
;suma el ASCII 9
;ajusta
;responde en ASCII
;carga el multiplicando
;carga el multiplicador
;ajusta
22
U.A.B.C.
MOV AL,5
MOV CL,5
MUL CL
AAM
;carga el multiplicando
;carga multiplicador
;ajusta
23
U.A.B.C.
Funcin
Realiza la operacin AND a bytes o palabras
Realiza la operacin OR a bytes o palabras
Realiza la operacin XOR a bytes o palabras
Realiza la operacin NOT a un byte o palabra
Verifica bytes o palabras (AND)
Corrimiento lgico/aritmtico a la izquierda
Corrimiento lgico a la derecha
Corrimiento aritmtico a la derecha
Rota un byte o palabra a la izquierda
Rota un byte o palabra a la izquierda a travs del acarreo
Rota un byte o palabra a la derecha
Rota un byte o palabra a la derecha a travs del acarreo
24
U.A.B.C.
AND
La operacin AND realiza una multiplicacin lgica como se ilustra en la tabla de verdad de la
Figura 6. Aqu, dos bit son multiplicados lgicamente para producir el resultado X.
Como es indicado por la tabla de verdad X es un 1 lgico cuando A y B son unos lgicos.
Para cualquier otra combinacin de entrada A y B, el resultado es 0 lgico. Es importante
recordar que 0 AND CUALQUIER-COSA es 0 lgico siempre, y que 1 AND 1 es siempre
1.
A * B = X
00
00
00
00
11
00
11
00
00
11
11
11
X X X X
0 0 0 0
X X X X
1 1 1 1
(Patrn desconocido)
(Mascara)
0 0 0 0
X X X X
(Resultado)
25
U.A.B.C.
;carga un ASCII
;enmascara BX
Un nmero codificado en ASCII puede convertirse a BCD usando la instruccin AND para
"desenmascarar" las cuatro posiciones de bit ms a la izquierda. Esto convierte el ASCII de
30H a 39H en 0 a 9. El ejemplo 22 muestra un programa que el contenido ASCII de BX en
BCD. La instruccin AND en este caso convierte dos dgitos de ASCII a BCD en forma
simultnea.
OR
La operacin OR desempea la suma lgica y frecuentemente se le llama funcin OR inclusiva.
La funcin OR genera un 1 si cualquiera de las entradas es 1. Y aparase un 0 a la salida slo
cuando todas las entradas son 0. La tabla de verdad para la funcin OR aparece en la Figura 8.
Aqu, las entradas A y B se suman lgicamente para producir la salida X. Es importante que
recordemos que 1 sumado lgicamente con cualquier valor resulta un 1.
A + B = X
00
00
00
00
11
10
11
00
10
11
11
11
26
U.A.B.C.
X X X X
1 1 1 1
(Patrn desconocido)
(Patrn de prueba)
X X X X
1 1 1 1
(Resultado)
27
U.A.B.C.
Ejemplo 23
MOV AL,5
MOV BL,7
MUL BL
AAM
OR AX,3030H
;carga dato.
;ajusta
;a ASCII
OR EXCLUSIVA
La instruccin OR EXCLUSIVA (XOR) difiere de la OR inclusiva (OR) en que a una
condicin de 1,1 la funcin OR produce un 1, mientras que la operacin OR EXCLUSIVA
produce un 0. La operacin OR EXCLUSIVA excluye esta condicin mientras la OR
INCLUSIVA la incluye.
La Figura 10 muestra la tabla de verdad de la operacin OR EXCLUSIVA. (Compare esta
figura con la Figura 8 para apreciar la diferencia entre las dos funciones OR). Si las entradas de
la funcin OR EXCLUSIVA son ambas 0 o ambas 1, la salida es cero. Si las entradas son
diferentes la salida es 1. Debido a esto, la funcin OR EXCLUSIVA a veces se llama
comparador.
A + B = X
00
00
00
00
11
10
11
00
10
11
11
01
28
U.A.B.C.
Instrucciones OR Exclusiva
Comentarios
CH = CH XOR DH
SI =SI XOR BX
CH = CH XOR 0EEEH
DI = DI XOR 00DDH
DX = DX XOR DS:[DI]
DATE[DI+2]=DATE[DI+2] XOR AL
Supongamos que los 10 bit de ms a la izquierda del registro BX deben invertirse sin afectar los
6 bit de ms a la derecha. La instruccin XOR BX,OFFC0H desempea esta tarea. La
instruccin AND pone a 0 los bit, la instruccin OR los pone a 1 los bit, y ahora, la operacin
OR EXCLUSIVA invierte los bit.
Estas tres instrucciones permiten a un programa tener control completo sobre cualquier bit
almacenado en cualquier registro o localidad de memoria. Esto es ideal para aplicaciones de
sistemas de control donde el equipo se debe encender (1), apagar (0), y conmutar de 0 a 1
de 1 a 0.
X X X X
0 0 0 0
X X X X
1 1 1 1
(Patrn desconocido)
(Patrn de prueba)
X X X X
X X X X
(Resultado)
29
U.A.B.C.
La instruccin TEST usa los mismos modos de direccionamiento que la instruccin AND. La
Tabla 21 muestra algunas de las formas de la instruccin TEST con comentarios a cerca de su
operacin en cada forma.
Tabla 21. Instrucciones TEST.
Instrucciones
Comentarios
TEST DL,DH
Realiza: DL AND DH
TEST CX,BX
Realiza: CX AND BX
TEST AX,04H
Realiza: AH AND 04
La instruccin TEST funciona de la misma forma que lo hace la instruccin CMP. La diferencia
es que usualmente la instruccin TEST prueba nicamente un bit, mientras que la instruccin
CMP prueba el byte o la palabra entera. La bandera ZF (bandera de cero) es 1 si el bit bajo
prueba es 0 y ZF=0 (indicando un resultado distinto de cero) si el bit bajo prueba es distinto de
cero.
Usualmente la instruccin prueba es seguida ya sea por la instruccin JZ (salta si es cero) o por
JNZ (salta si es distinto de cero). Normalmente el operando destino se prueba contra un dato
inmediato. El valor del dato inmediato es 1, para probar el bit ms a la derecha, 2 para probar
el siguiente bit, 4 para probar el tercer bit, y as sucesivamente.
El ejemplo 24 lista un programa que prueba el bit ms a la derecha y el bit ms a la izquierda
del registro AX. Aqu, 1 selecciona el bit ms a la derecha y 128 selecciona el bit ms a la
izquierda. La instruccin JNZ sigue a cada instruccin de prueba para saltar a diferentes
localidades de memoria dependiendo del resultado de la prueba realizada. La instruccin JNZ
salta a la direccin del operando (RIGHT o LEFT en el ejemplo) si el bit bajo prueba es
distinto de cero.
Ejemplo 24
TEST AL,1
JNZ RIGHT
TEST AL,128
JNZ LEFT
NOT y NEG
La inversin lgica o complemento a unos (NOT) y la inversin de signo aritmtico o
complemento a dos (NEG) son las dos ltimas funciones lgicas presentadas a excepcin de
las instrucciones de desplazamiento y rotacin de la siguiente seccin de este texto. Estas son
de las pocas instrucciones que contienen slo un operando. La Tabla 21 muestra algunas de las
variaciones de las instrucciones NOT y NEG. Como con la mayora de las instrucciones las
instrucciones NOT y NEG pueden usar cualquier modo de direccionamiento excepto el
direccionamiento a registro de segmento.
30
U.A.B.C.
31
U.A.B.C.
CF
SHL
CF
SAL
CF
SHR
0
CF
S
SAR
CF = Bandera de Acarreo
Instrucciones
SHL AX,1
SHR BX,1
SAL DATA1,CL
SAR SI,CL
32
U.A.B.C.
Ejemplo 26
;Multiplica AX por 10 (1010)
SHL AX,1
MOV BX,AX
SHL AX,1
SHL AX,1
ADD AX,BX
;2 veces AX
;4 veces AX
;8 veces AX
;10 veces AX
;2 veces AX
;4 veces AX
;8 veces AX
;16 veces AX
;18 veces AX
Rotaciones
33
U.A.B.C.
CF
ROL
CF
RCL
CF
ROR
CF
RCR
34
U.A.B.C.
Las rotaciones frecuentemente se usan para desplazar nmeros anchos (de ms de 32 bit) de
izquierda a derecha. El programa listado en el ejemplo 27 desplaza el nmero de 48 bit en los
registros DX, BX y AX hacia la izquierda un lugar binario. Notar que los 16 bit menos
significativos (AX) se desplazan primero a la izquierda.
Este Corrimiento, por s mismo, mueve el bit menos significativo de AX a la bandera de acarreo
CF. A continuacin la instruccin de rotacin BX rota CF en BX y su bit de ms a la izquierda
pasa a la bandera CF. La ltima instruccin rota CF en DX y se completa el Corrimiento.
Ejemplo 27.
SHL AX,1
RCL BX,1
RCL DX,1
35
U.A.B.C.