Sunteți pe pagina 1din 7

ASSEMBLER INTERRUPCIONES

Interrupciones
Una interrupcin es una seal (producida por hardware o software) que hace que la CPU suspenda
momentneamente la tarea que est realizando y le transfiera el control a un programa especial que
se encarga de tratar esa interrupcin.
Existen muchas interrupciones, cada una de ellas identificadas con un nmero.
Las posiciones de memoria en la que comienzan cada uno de los programas asociados a las
interrupciones se guardan en una estructura denominada TABLA DE VECTORES DE
INTERRUPCIONES que se localiza al comienzo de la memoria (1024 bytes iniciales de la
memoria).
Tabla de vectores de interrupciones
Nmero de Interrupcin
Ubicacin en memoria de los programas asociados a cada
interrupcin
01
XXXX
02
YYYY
...
...
N
ZZZZ
Cuando en un programa se desea llamar a una determinada interrupcin se debe ejecutar la
instruccin INT. Su sintaxis es INT nmero de interrupcin, donde el nmero es obligatorio y tiene
a lo sumo una longitud de 2 bytes.
La ejecucin de una interrupcin puede necesitar parmetros (datos para la ejecucin de la
interrupcin), los que deben colocarse en los Registros de Trabajo.
Algunas Interrupciones
Interrupcin 20h: Terminacin del programa
Su funcin es informar al sistema operativo que el programa ha terminado y que puede liberar la
memoria que ocupaba.
Interrupcin 21h: Servicios del DOS
Permite acceder a la mayora de los servicios del sistema operativo DOS. Cada uno de estos
servicios se identifica por un nmero.
INT 21h Servicio 02h: Salida de caracteres Este servicio enva el carcter cuyo cdigo
est almacenado en el registro DL a la unidad de salida standard. Al ejecutar la instruccin
INT 21h, el registro AH debe contener el valor 02h (nmero del servicio).
Qu es el registro AH? Todos los registros de trabajo tienen 2 bytes y como el procesador debe ser
capaz de manejar unidades de 1 byte de longitud, los registros se dividen en dos partes: byte alto
(los dos primeros dgitos hexadecimales) y byte bajo (los dos dgitos siguientes). Con AX nos
referimos a la palabra completa (16 bits), con AH nos referimos al byte alto y con AL al byte bajo.
AX=4D1A
AX
AH
AL
0100110100011010
4 D 1 A
Como ejemplo vamos a implementar un cdigo en Assembler para imprimir un carcter en pantalla,
usando las interrupciones descriptas.

Ensamblado del Cdigo con el DEBUG


Para implementar un cdigo en Lenguaje Assembler es necesario usar el comando A (Assemble,
Ensamblar) del DEBUG.
-Aposicin de memoria a partir de la cual se colocan las instrucciones
Por otra parte, es necesario introducir otra instruccin en lenguaje ensamblador que nos simplifique
la introduccin de valores en los registros. Dicha instruccin es MOV.
Para desarrollar nuestro ejemplo es necesario cargar el valor 02h en el registro AH, como sigue:
MOV AH,02
Ejercicio 1: Usando el programa DEBUG desarrollar un cdigo en Assembler que imprima el
carcter * en pantalla. Almacenar el cdigo ejecutable de dicho programa en el disco.
C:\>DEBUG
-A 100
1669:0100 MOV AH,02
1669:0102 MOV DL,2A
1669:0104 INT 21
1669:0106 INT 20
1669:0108 Oprimir <Enter> para finalizar el ingreso del cdigo
PSP
Cdigo de Programa *.COM + DATOS
Pila
Longitud: 256 bytes100h
Mximo 65536-258 Mnimo 2 bytes
El PSP es el denominado Prefijo de Segmento de Programa y es creado y utilizado por el sistema
operativo DOS.
Para ejecutar el cdigo introducido es necesario otro comando del utilitario DEBUG.
Comando G: Este comando permite ejecutar un cdigo cargado en memoria. La sintaxis es:
G direccin
Donde direccin representa la direccin de la primera instruccin a ejecutar. Si se omite este
parmetro, el DEBUG asumir que la direccin viene dada por los registros CS:IP.
-G
*
El programa ha finalizado con normalidad
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1669 ES=1669 SS=1669 CS=1669 IP=0100 NV UP EI PL NZ NA PO NC
1669:0100 B402 MOV AH,02
Almacenamiento del cdigo ejecutable usando el DEBUG
Una vez ensamblado el programa es conveniente guardar las instrucciones en lenguaje de mquina
en un archivo ejecutable, ya que de esta manera queda disponible para reiteradas ejecuciones o para
introducirle modificaciones usando el DEBUG.
Proceso de Ensamblado:
-A 100
1669:0100 MOV AH,02
1669:0102 MOV DL,2A
1669:0104 INT 21
1669:0106 INT 20
1669:0108 Oprimir <Enter> para finalizar el ingreso del cdigo
Para almacenar este cdigo es necesario especificar la cantidad de bytes que ocupa. Esta cantidad se
coloca en los registros BX:CX, siendo BX la parte alta y CX la parte baja.
Clculo de la cantidad de bytes que ocupa nuestro programa:
-H 108 100
0208 0008
2

Como el programa ocupa slo 8 bytes se modifica el contenido del registro CX de la siguiente
manera:
-R CX
CX 0000
:8
y en el registro BX se coloca 0h,
-R BX
BX 0000
:0
-R
AX=0000 BX=0000 CX=0008 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1669 ES=1669 SS=1669 CS=1669 IP=0100 NV UP EI PL NZ NA PO NC
1669:0100 B402 MOV AH,02
Se le asigna el nombre al archivo ejecutable, que debe tener extensin COM, mediante el comando
N (name, nombre) del DEBUG:
-N CARAC.COM
y luego se graban los 8 bytes usando el comando W (write):
-W
Escribiendo 0008 bytes
De aqu en mas el programa CARAC.COM est en el disco y se puede ejecutar desde el sistema
operativo.
Lectura y modificacin de un archivo *.COM usando el DEBUG
Para leer un archivo de disco primero se especifica el nombre correspondiente usando el comando
N del DEBUG y luego se lo carga usando el comando:
L direccin
Donde la direccin especifica el lugar de memoria a partir del cual se lo carga. En nuestro caso ser
siempre L 100.
Para visualizar el cdigo cargado se procede a desensamblarlo con el comando:
U direccin1 direccin2
Donde las direcciones son optativas y especifican el intervalo que se debe desensamblar.
Salida de una cadena de caracteres
Hasta ahora vimos como se escriba un carcter en pantalla. Para sacar una cadena de
caracteres es necesario utilizar otro servicio de la interrupcin 21h. Este servicio es el 09h, el cual
imprime una cadena de caracteres y se detiene cuando encuentra el smbolo $. La direccin en
donde se encuentra la cadena de caracteres se le especifica al DOS en el registro DX.
La cadena de caracteres se introduce a partir de una direccin de memoria mayor a 100h que
es a partir de donde se escribe el cdigo del programa. Para que la zona de cdigo no se mezcle con
la zona de datos, stos se cargan a partir de la direccin 200h con el comando: E 200.
C:\>DEBUG
-E 200
1669:0200 FF.48 (H) FF.4F (O) FF.4C (L) FF.41(A) FF.21(!) FF.24($)
-A 100
1669:0100 MOV AH,09
1669:0102 MOV DX,200
1669:0105 INT 21
1669:0107 INT 20
1669:0109
-U 100 109
1669:0100 B409 MOV AH,09
1669:0102 BA0002 MOV DX,0200
3

1669:0105 CD21 INT 21


1669:0107 CD20 INT 20
1669:0109 FA CLI <<< BASURA
-G
HOLA!
El programa ha finalizado con normalidad
Examen del contenido de un rea de memoria
El programa DEBUG cuenta con un comando que permite visualizar el contenido de un rea
de memoria, es decir los datos (recordar que U es el comando que nos permite desensamblar las
instrucciones almacenadas en un espacio de memoria).
Con el comando D (Dump) podemos hacer un volcado de los datos almacenados a partir de
una dada direccin de memoria.
Ejemplo:
Supongamos que cargamos en la memoria la secuencia de caracteres HOLA!, esto lo hacemos
usando el comando E de la siguiente manera:
-E 200
1C7F:0200 75.48 40.4F B8.4C 01.41 42.21 B9.24
-D 200
1C7F:0200 48 4F 4C 41 21 24 FF FF-8B D1 CD 21 EB 34 2E 8E HOLA!$.....!.4..
1C7F:0210 1E 90 D2 B8 00 42 33 C9-8B D1 CD 21 EB 24 3D 05 .....B3....!.$=.
1C7F:0220 <<<<< BASURA
Bucles y Procedimientos en Assembler
Existe tambin en Assembler la posibilidad de realizar bucles o loops. Los bucles se implementan
por medio de la instruccin:
LOOP direccin
y un contador que se representa en el registro CX
Esquemticamente, el flujo del programa sera as:

Por lo tanto se inicializa el registro CX (contador) con el nmero mximo de bucles a realizar y el
contador se decrementa en 1 a medida que se va realizando cada iteracin. El bucle finaliza cuando
el contador es nulo (CX=0).
Los procedimientos en Assembler se invocan con una instruccin CALL cuya sintaxis es:
CALL direccin
Donde direccin especifica el lugar de memoria a partir del cual se encuentra el procedimiento.
El procedimiento se debe finalizar con una instruccin RET que devuelve el control al cdigo que
lo invoc.
Incrementos
Para incrementar el valor de un registro se dispone de la instruccin INC, cuya sintaxis es:
INC registro
y el resultado incrementado en 1 se almacena en el mismo registro.
4

Ejercicio 2 : Desarrollar un cdigo Assembler que imprima en pantalla las letras maysculas
desde la A a la Z. Usar un procedimiento para imprimir cada uno de los caracteres.
-A 100
1C7F:0100 MOV DL,41 Se coloca el cdigo del carcter A en DL
1C7F:0102 MOV CX,001A Se inicializa el contador en 26 10
1C7F:0105 CALL 0200
1C7F:0108 LOOP 0105
1C7F:010A INT 20
-A 200
1C7F:0200 MOV AH,02
1C7F:0202 INT 21
1C7F:0204 INC DL Se genera el cdigo del prximo carcter
1C7F:0206 RET
1C7F:0207
-G
ABCDEFGHIJKLMNOPQRSTUVWXYZ
El programa ha finalizado con normalidad
Observacin: se coloca en DL el cdigo del carcter a imprimir con el servicio 02h (cargado en el
registro AH) de la interrupcin 21h.
Comparaciones y ruptura de la secuencia de ejecucin (saltos)
El lenguaje Assembler tambin permite realizar comparaciones y rupturas de la secuencias de
ejecucin de un cdigo, en base a los resultados de dichas comparaciones.
CMP valor1,valor2
Esta instruccin compara los dos valores haciendo la diferencia entre el primero y el segundo, tras
lo cual actualizan las banderas o indicadores de estados.
Luego de la comparacin, segn el resultado obtenido, se activa una secuencia de instrucciones u
otra. Para ello se dispone de instrucciones que evalan el resultado de la comparacin desviando el
flujo del programa hacia las direcciones de memoria de las instrucciones a ejecutar en
consecuencia.
Una de estas instrucciones es JLE (saltar si es menor o igual):
JLE direccin
Esta instruccin, como ya dijimos, se ejecuta luego de una instruccin de comparacin CMP.
Desplazamiento de bits
En Assembler existen instrucciones que permiten desplazar los bits de un valor hacia la izquierda o
hacia la derecha. Por ejemplo, la instruccin SHL (shift left) desplaza bits hacia la izquierda
poniendo tantos ceros a la derecha como indiquemos.
Su sintaxis es:
SHL registro1,registro2
donde registro1 es el registro cuyo contenido sufre un desplazamiento hacia la izquierda, mientras
que en registro2 se indica de cuantos bits es dicho desplazamiento.
Por ejemplo, si queremos desplazar el registro DL cuatro bits hacia la izquierda y completar con
ceros por la derecha se hace:
MOV CL,04
SHL DL,CL
A esta instruccin se la conoce como desplazamiento aritmtico ya que es equivalente a multiplicar
el contenido DL por 16 en este caso (si se desplaza en 1 es una multiplicacin por 2, si se desplaza
en 2 es una multiplicacin por 4, y as sucesivamente).
Ejercicio 3 : Usando el servicio 01h de la interrupcin 21h leer dos dgitos hexadecimales e
imprimir el caracter ASCII correspondiente (tener en cuenta que este servicio permite leer un
5

caracter a la vez y lo almacena en el registro AL). Explicar el resultado que se obtiene al introducir
1Z.
A continuacin se muestra un ejemplo a los efectos de entender el desarrollo del programa.
Supongamos que ingreso el caracter * por teclado.
Cdigo hexadecimal del *: 2A (42 10)
Secuencia de conversin del primer dgito:
Oprimo la tecla 2: ingresa el cdigo hexadecimal 32h
Para obtener el dgito hexadecimal le resto 30h: 32h-30h=2h
Necesito averiguar si es un dgito entre 0 y 9 o un caracter A,B,C,D,E,F. Comparo 2h con
09h, como es menor resulta un dgito y ya lo puedo colocar en la posicin que le
corresponde rotando a la izquierda cuatro posiciones, lo que es equivalente a multiplicar
2*16=32 en aritmtica decimal. Resultado: 20h
Secuencia de conversin del segundo dgito:
Oprimo la tecla A: ingresa el cdigo hexadecimal 41h
Para obtener el dgito hexadecimal le resto 30h: 41h-30h=11h
Comparo 11h con 9h para saber si se trata de un dgito decimal o una letra correspondiente a
un dgito hexadecimal.
Como en este caso 11h es mayor que 9h, a 11h le resto 7h para obtener el dgito
correspondiente: 11h-07h=Ah (17 10- 7 10=10 10=Ah)
Finalmente, sumo los dos dgitos hexadecimales obtenidos en el proceso de conversin
(20h+0Ah=2Ah) y muestro en pantalla el caracter ASCII correspondiente usando el servicio 02h de
la interrupcin 21h.
En el programa se usa el registro DL como registro de trabajo en el ingreso y conversin del primer
dgito hexadecimal.
-A 100
1CA8:0100 MOV AH,01 Servicio 01h de la INT 21 (Lectura primer caracter)
1CA8:0102 INT 21 En AL queda almacenado el caracter ledo
1CA8:0104 MOV DL,AL DL se usa como registro de trabajo
1CA8:0106 SUB DL,30 Se resta a DL el valor 30h
1CA8:0109 CMP DL,09 Se verifica si es un dgito entre 0...9
1CA8:010C JLE 0111 Si es un dgito salta a 0111
1CA8:010E SUB DL,07 Determina el caracter decimal
1CA8:0111 MOV CL,04 Corrimiento a realizar sobre DL
1CA8:0113 SHL DL,CL Corrimiento en DL de cuatro dgitos a la izquierda
1CA8:0115 INT 21 Lectura del 2do dgito hexadecimal
1CA8:0117 SUB AL,30
1CA8:0119 CMP AL,09
1CA8:011B JLE 011F
1CA8:011D SUB AL,07
1CA8:011F ADD DL,AL Se suman los dgitos hexadecimales
1CA8:0121 MOV AH,02 Servicio para imprimir el caracter ASCII
1CA8:0123 INT 21 Imprime caracter ASCII almacenado en DL
1CA8:0125 INT 20
1CA8:0127
-G
41A
El programa ha finalizado con normalidad

ASSEMBLER INTERRUPCIONES
Interrupciones
Una interrupcin es una seal (producida por hardware o software) que hace que la CPU suspenda
momentneamente la tarea que est realizando y le transfiera el control a un programa especial que
se encarga de tratar esa interrupcin.
Existen muchas interrupciones, cada una de ellas identificadas con un nmero.
Las posiciones de memoria en la que comienzan cada uno de los programas asociados a las
interrupciones se guardan en una estructura denominada TABLA DE VECTORES DE
INTERRUPCIONES que se localiza al comienzo de la memoria (1024 bytes iniciales de la