Está en la página 1de 6

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
!"isten muchas interrupciones# cada una de ellas identificadas con un n$mero
%as posiciones de memoria en la que comienzan cada uno de los programas asociados a las
interrupciones se guardan en una estructura denominada &'(%' )! *!C&+,!- )!
I.&!,,UPCI+.!- que se localiza al comienzo de la memoria (/012 3ytes iniciales de la
memoria)
&a3la de 4ectores de interrupciones
.$mero de Interrupcin U3icacin en memoria de los programas asociados a cada
interrupcin
0/ 5555
01 6666

. 7777
Cuando en un programa se desea llamar a una determinada interrupcin se de3e e8ecutar la
instruccin I.& -u sinta"is es I.& n$mero de interrupcin# donde el n$mero es o3ligatorio y tiene
a lo sumo una longitud de 1 3ytes
%a e8ecucin de una interrupcin puede necesitar parmetros (datos para la e8ecucin de la
interrupcin)# los que de3en colocarse en los ,egistros de &ra3a8o
Algunas Interrupciones
Interrupcin 20h: &erminacin del programa
-u funcin es informar al sistema operati4o que el programa ha terminado y que puede li3erar la
memoria que ocupa3a
Interrupcin 21h: -er4icios del )+-
Permite acceder a la mayor9a de los ser4icios del sistema operati4o )+- Cada uno de estos
ser4icios se identifica por un n$mero
: INT 21h Servicio 02h; -alida de caracteres !ste ser4icio en49a el carcter cuyo cdigo
est almacenado en el registro )% a la unidad de salida standard 'l e8ecutar la instruccin
I.& 1/h# el registro '< de3e contener el 4alor 01h (n$mero del ser4icio)
Qu es el registro AH? &odos los registros de tra3a8o tienen 1 3ytes y como el procesador de3e ser
capaz de mane8ar unidades de / 3yte de longitud# los registros se di4iden en dos partes; 3yte alto
(los dos primeros d9gitos he"adecimales) y 3yte 3a8o (los dos d9gitos siguientes) Con '5 nos
referimos a la pala3ra completa (/= 3its)# con '< nos referimos al 3yte alto y con '% al 3yte 3a8o
AX=4D1A
'5
'< '%
0/00//0/000//0/0
2 ) / '

Como e8emplo 4amos a implementar un cdigo en 'ssem3ler para imprimir un carcter en pantalla#
usando las interrupciones descriptas
/
nsa!"la#o #el $#igo con el D%&'
Para implementar un cdigo en %engua8e 'ssem3ler es necesario usar el comando ' ('ssem3le#
!nsam3lar) del )!(U>
?Aposicin de memoria a partir de la cual se colocan las instrucciones
Por otra parte# es necesario introducir otra instruccin en lengua8e ensam3lador que nos simplifique
la introduccin de 4alores en los registros )icha instruccin es ()*
Para desarrollar nuestro e8emplo es necesario cargar el 4alor 01h en el registro '<# como sigue;
@+* '<#01
Ejercicio 1: Usando el programa DEBUG desarrollar un cdigo en Assembler que imprima el
carcter * en pantalla. Almacenar el cdigo ejecutable de dico programa en el disco.
$:+,D%&'
?' /00
/==A;0/00 @+* '<#01
/==A;0/01 @+* )%#1'
/==A;0/02 I.& 1/
/==A;0/0= I.& 10
/==A;0/0B +primir C!nterD para finalizar el ingreso del cdigo
P-P Cdigo de Programa EC+@ F )'&+- Pila
%ongitud; 1G= 3ytes/00h @"imo =GGH=?1GB @9nimo 1 3ytes

!l P-P es el denominado Prefi8o de -egmento de Programa y es creado y utilizado por el sistema
operati4o )+-
Para e8ecutar el cdigo introducido es necesario otro comando del utilitario )!(U>
$o!an#o ': !ste comando permite e8ecutar un cdigo cargado en memoria %a sinta"is es;
> direccin
)onde direccin representa la direccin de la primera instruccin a e8ecutar -i se omite este
parmetro# el )!(U> asumir que la direccin 4iene dada por los registros C-;IP
-'
.
!l programa ha finalizado con normalidad
-/
'5I0000 (5I0000 C5I0000 )5I0000 -PIJJ!! (PI0000 -II0000 )II0000
)-I/==A !-I/==A --I/==A $S=1001 I2=0100 .* UP !I P% .7 .' P+ .C
1001:0100 %402 ()* A3402
Al!acena!iento #el c#igo e5ecuta"le usan#o el D%&'

Una 4ez ensam3lado el programa es con4eniente guardar las instrucciones en lengua8e de mquina
en un archi4o e8ecuta3le# ya que de esta manera queda disponi3le para reiteradas e8ecuciones o para
introducirle modificaciones usando el )!(U>
Proceso de !nsam3lado;
?' /00
/==A;0/00 @+* '<#01
/==A;0/01 @+* )%#1'
/==A;0/02 I.& 1/
/==A;0/0= I.& 10
/==A;0/0B +primir !Enter" para #inali$ar el ingreso del cdigo
Para almacenar este cdigo es necesario especificar la cantidad de 3ytes que ocupa !sta cantidad se
coloca en los registros (5;C5# siendo (5 la parte alta y C5 la parte 3a8a
Clculo de la cantidad de 3ytes que ocupa nuestro programa;
?3 /0B /00
010B 000B
1
Como el programa ocupa slo B 3ytes se modifica el contenido del registro C5 de la siguiente
manera;
-/ $X
C5 0000
;B
y en el registro (5 se coloca 0h#
-/ %X
(5 0000
;0
-/
'5I0000 %X=0000 $X=0006 )5I0000 -PIJJ!! (PI0000 -II0000 )II0000
)-I/==A !-I/==A --I/==A C-I/==A IPI0/00 .* UP !I P% .7 .' P+ .C
1001:0100 %402 ()* A3402
-e le asigna el nom3re al archi4o e8ecuta3le# que de3e tener e"tensin C+@# mediante el comando
. (name# nom3re) del )!(U>;
-N $A/A$7$)(
y luego se gra3an los B 3ytes usando el comando K (write);
?8
!scri3iendo 000B 3ytes
)e aqu9 en mas el programa C','CC+@ est en el disco y se puede e8ecutar desde el sistema
operati4o
9ectura : !o#i;icacin #e un archivo .7$)( usan#o el D%&'
Para leer un archi4o de disco primero se especifica el nom3re correspondiente usando el comando
N del )!(U> y luego se lo carga usando el comando;
9 direccin
)onde la direccin especifica el lugar de memoria a partir del cual se lo carga !n nuestro caso ser
siempre 9 1007
Para 4isualizar el cdigo cargado se procede a desensam3larlo con el comando;
& direccin/ direccin1
)onde las direcciones son optati4as y especifican el inter4alo que se de3e desensam3lar
Sali#a #e una ca#ena #e caracteres
<asta ahora 4imos como se escri39a un carcter en pantalla Para sacar una cadena de
caracteres es necesario utilizar otro ser4icio de la interrupcin 21h !ste ser4icio es el 01h# el cual
imprime una cadena de caracteres y se detiene cuando encuentra el s9m3olo < %a direccin en
donde se encuentra la cadena de caracteres se le especifica al D)S en el registro DX7
%a cadena de caracteres se introduce a partir de una direccin de memoria mayor a /00h que
es a partir de donde se escri3e el cdigo del programa Para que la zona de cdigo no se mezcle con
la zona de datos# Lstos se cargan a partir de la direccin 100h con el comando; 2007
$:+,D%&'
- 200
/==A;0100 JJ2B (<) JJ2J (+) JJ2C (%) JJ2/(') JJ1/(M) JJ12(N)
-A 100
/==A;0/00 @+* '<#0A
/==A;0/01 @+* )5#100
/==A;0/0G I.& 1/
/==A;0/0O I.& 10
/==A;0/0A
-& 100 101
/==A;0/00 (20A @+* '<#0A
/==A;0/01 ('0001 @+* )5#0100
H
/==A;0/0G C)1/ I.& 1/
/==A;0/0O C)10 I.& 10
/==A;0/0A J' C%I CCC ('-U,'
-'
<+%'M
!l programa ha finalizado con normalidad
=a!en #el conteni#o #e un >rea #e !e!oria
!l programa )!(U> cuenta con un comando que permite 4isualizar el contenido de un rea
de memoria# es decir los datos (recordar que U es el comando que nos permite desensam3lar las
instrucciones almacenadas en un espacio de memoria)
Con el comando D ()ump) podemos hacer un 4olcado de los datos almacenados a partir de
una dada direccin de memoria
5e!plo:
-upongamos que cargamos en la memoria la secuencia de caracteres <+%'M# esto lo hacemos
usando el comando ! de la siguiente manera;
- 200
/COJ;0100 OG2B 202J (B2C 0/2/ 211/ (A12
-D 200
/COJ;0100 2B 2J 2C 2/ 1/ 12 JJ JJ?B( )/ C) 1/ !( H2 1! B! <+%'MNM2
/COJ;01/0 /! A0 )1 (B 00 21 HH CA?B( )/ C) 1/ !( 12 H) 0G (HMNI
/COJ;0110 CCCCC ('-U,'
%ucles : 2roce#i!ientos en Asse!"ler
!"iste tam3iLn en 'ssem3ler la posi3ilidad de realizar 3ucles o loops %os 3ucles se implementan
por medio de la instruccin;
9))2 direccin
y un contador que se representa en el registro C5
!squemticamente# el flu8o del programa ser9a as9;
Por lo tanto se inicializa el registro C5 (contador) con el n$mero m"imo de 3ucles a realizar y el
contador se decrementa en / a medida que se 4a realizando cada iteracin !l 3ucle finaliza cuando
el contador es nulo (C5I0)
%os procedimientos en 'ssem3ler se in4ocan con una instruccin C'%% cuya sinta"is es;
$A99 direccin
)onde #ireccin especifica el lugar de memoria a partir del cual se encuentra el procedimiento
!l procedimiento se de3e finalizar con una instruccin /T que de4uel4e el control al cdigo que
lo in4oc
Incre!entos
Para incrementar el 4alor de un registro se dispone de la instruccin IN$# cuya sinta"is es;
IN$ registro
y el resultado incrementado en / se almacena en el mismo registro
2
Ejercicio 2 : Desarrollar un cdigo Assembler que imprima en pantalla las letras ma%&sculas
desde la A a la '. Usar un procedimiento para imprimir cada uno de los caracteres.
-A 100
/COJ;0/00 @+* )%#2/ -e coloca el cdigo del carcter A en D9
/COJ;0/01 @+* C5#00/' -e inicializa el contador en 1= /0
/COJ;0/0G C'%% 0100
/COJ;0/0B %++P 0/0G
/COJ;0/0' I.& 10

-A 200
/COJ;0100 @+* '<#01
/COJ;0101 I.& 1/
/COJ;0102 I.C )% -e genera el cdigo del pr"imo carcter
/COJ;010= ,!&
/COJ;010O
-'
'(C)!J><IPQ%@.+PR,-&U*K567
!l programa ha finalizado con normalidad
)"servacin: se coloca en )% el cdigo del carcter a imprimir con el ser4icio 01h (cargado en el
registro '<) de la interrupcin 1/h
$o!paraciones : ruptura #e la secuencia #e e5ecucin ?saltos@
!l lengua8e 'ssem3ler tam3iLn permite realizar comparaciones y rupturas de la secuencias de
e8ecucin de un cdigo# en 3ase a los resultados de dichas comparaciones
$(2 4alor/#4alor1
!sta instruccin compara los dos 4alores haciendo la diferencia entre el primero y el segundo# tras
lo cual actualizan las 3anderas o indicadores de estados
%uego de la comparacin# seg$n el resultado o3tenido# se acti4a una secuencia de instrucciones u
otra Para ello se dispone de instrucciones que e4al$an el resultado de la comparacin des4iando el
flu8o del programa hacia las direcciones de memoria de las instrucciones a e8ecutar en
consecuencia
Una de estas instrucciones es A9 (saltar si es menor o igual);
A9 direccin
!sta instruccin# como ya di8imos# se e8ecuta luego de una instruccin de comparacin $(2
DesplaBa!iento #e "its
!n 'ssem3ler e"isten instrucciones que permiten desplazar los 3its de un 4alor hacia la izquierda o
hacia la derecha Por e8emplo# la instruccin S3% (shift left) desplaza 3its hacia la izquierda
poniendo tantos ceros a la derecha como indiquemos
-u sinta"is es;
S39 registro/#registro1
donde registro/ es el registro cuyo contenido sufre un desplazamiento hacia la izquierda# mientras
que en registro1 se indica de cuantos 3its es dicho desplazamiento
Por e8emplo# si queremos desplazar el registro )% cuatro 3its hacia la izquierda y completar con
ceros por la derecha se hace;
()* C%#02
S39 )%#C%
' esta instruccin se la conoce como desplazamiento aritmLtico ya que es equi4alente a multiplicar
el contenido )% por /= en este caso (si se desplaza en / es una multiplicacin por 1# si se desplaza
en 1 es una multiplicacin por 2# y as9 sucesi4amente)
Ejercicio 3 : Usando el ser(icio )1 de la interrupcin *1 leer dos d+gitos e,adecimales e
imprimir el caracter A-.// correspondiente 0tener en cuenta que este ser(icio permite leer un
G
caracter a la (e$ % lo almacena en el registro A12. E,plicar el resultado que se obtiene al introducir
1'.
' continuacin se muestra un e8emplo a los efectos de entender el desarrollo del programa
-upongamos que ingreso el caracter E por teclado
Cdigo he"adecimal del E; 2A (21 /0)
Secuencia #e conversin #el pri!er #Cgito:
+primo la tecla 1; ingresa el cdigo he"adecimal H1h
Para o3tener el d9gito he"adecimal le resto H0h; H1h?H0hI1h
.ecesito a4eriguar si es un d9gito entre 0 y A o un caracter '#(#C#)#!#J Comparo 1h con
0Ah# como es menor resulta un d9gito y ya lo puedo colocar en la posicin que le
corresponde rotando a la izquierda cuatro posiciones# lo que es equi4alente a multiplicar
1E/=IH1 en aritmLtica decimal ,esultado; 10h
Secuencia #e conversin #el segun#o #Cgito:
+primo la tecla '; ingresa el cdigo he"adecimal 2/h
Para o3tener el d9gito he"adecimal le resto H0h; 2/h?H0hI//h
Comparo //h con Ah para sa3er si se trata de un d9gito decimal o una letra correspondiente a
un d9gito he"adecimal
Como en este caso //h es mayor que Ah# a //h le resto Oh para o3tener el d9gito
correspondiente; 11h-0Dh=Ah (/O /0? O /0I/0 /0I'h)
Jinalmente# sumo los dos d9gitos he"adecimales o3tenidos en el proceso de con4ersin
(10hF0'hI1'h) y muestro en pantalla el caracter '-CII correspondiente usando el ser4icio 01h de
la interrupcin 1/h
!n el programa se usa el registro D9 como registro de tra3a8o en el ingreso y con4ersin del primer
d9gito he"adecimal
-A 100
/C'B;0/00 @+* '<#0/ -er4icio 0/h de la I.& 1/ (%ectura primer caracter)
/C'B;0/01 I.& 1/ !n '% queda almacenado el caracter le9do
/C'B;0/02 @+* )%#'% )% se usa como registro de tra3a8o
/C'B;0/0= -U( )%#H0 -e resta a )% el 4alor H0h
/C'B;0/0A C@P )%#0A -e 4erifica si es un d9gito entre 0A
/C'B;0/0C P%! 0/// -i es un d9gito salta a 0///
/C'B;0/0! -U( )%#0O )etermina el caracter decimal
/C'B;0/// @+* C%#02 Corrimiento a realizar so3re )%
/C'B;0//H -<% )%#C% Corrimiento en )% de cuatro d9gitos a la izquierda
/C'B;0//G I.& 1/ %ectura del 1do d9gito he"adecimal
/C'B;0//O -U( '%#H0
/C'B;0//A C@P '%#0A
/C'B;0//( P%! 0//J
/C'B;0//) -U( '%#0O
/C'B;0//J ')) )%#'% -e suman los d9gitos he"adecimales
/C'B;0/1/ @+* '<#01 -er4icio para imprimir el caracter '-CII
/C'B;0/1H I.& 1/ Imprime caracter '-CII almacenado en )%
/C'B;0/1G I.& 10
/C'B;0/1O
?>
41A
!l programa ha finalizado con normalidad
=

También podría gustarte