Anda di halaman 1dari 9

Fsica Computacional

Departamento de Fsica | Escuela de Ciencias Exactas y Naturales Facultad de Ciencias Exactas, Ingeniera y Agrimensura Universidad Nacional de Rosario

Unidad N3: Lenguaje Assembler Programa DEBUG El programa DEBUG es una aplicacin que viene incluida con el sistema operativo DOS y permite, entre otras cosas, generar cdigo en Lenguaje Assembler. 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 01 02 ... N Ubicacin en memoria de los programas asociados a cada interrupcin XXXX YYYY ... 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.

1 Fsica Computacional | www.fceia.unr.edu.ar/~fisicomp Hugo Navone ::: hnavone@ifir.edu.ar Laboratorio de Fsica Computacional | Departamento de Fsica | ECEyN | FCEIyA | UNR

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 AH 0100 4 1101 D 0001 1 AL 1010 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. -A posicin 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 U3-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.
2 Fsica Computacional | www.fceia.unr.edu.ar/~fisicomp Hugo Navone ::: hnavone@ifir.edu.ar Laboratorio de Fsica Computacional | Departamento de Fsica | ECEyN | FCEIyA | UNR

C:\>DEBUG -A 100 1669:0100 1669:0102 1669:0104 1669:0106 1669:0108 PSP Longitud: 256 bytes

MOV AH,02 MOV DL,2A INT 21 INT 20 Oprimir <Enter> para finalizar el ingreso del cdigo Cdigo de Programa *.COM + DATOS 100h Mximo 65536-258 Pila 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 primer 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 1669:0102 1669:0104 1669:0106 1669:0108

MOV AH,02 MOV DL,2A INT 21 INT 20 Oprimir <Enter> para finalizar el ingreso del cdigo

3 Fsica Computacional | www.fceia.unr.edu.ar/~fisicomp Hugo Navone ::: hnavone@ifir.edu.ar Laboratorio de Fsica Computacional | Departamento de Fsica | ECEyN | FCEIyA | UNR

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 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:
4 Fsica Computacional | www.fceia.unr.edu.ar/~fisicomp Hugo Navone ::: hnavone@ifir.edu.ar Laboratorio de Fsica Computacional | Departamento de Fsica | ECEyN | FCEIyA | UNR

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 1669:0102 1669:0105 1669:0107 1669:0109

MOV AH,09 MOV DX,200 INT 21 INT 20

-U 100 109 1669:0100 B409 1669:0102 BA0002 1669:0105 CD21 1669:0107 CD20 1669:0109 FA

MOV AH,09 MOV DX,0200 INT 21 INT 20 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.

5 Fsica Computacional | www.fceia.unr.edu.ar/~fisicomp Hugo Navone ::: hnavone@ifir.edu.ar Laboratorio de Fsica Computacional | Departamento de Fsica | ECEyN | FCEIyA | UNR

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:

0106: ... 0XXX:

Instruccin ... LOOP 0106

Decrementa CX

INT 20

Contina cuando CX=0

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.
6 Fsica Computacional | www.fceia.unr.edu.ar/~fisicomp Hugo Navone ::: hnavone@ifir.edu.ar Laboratorio de Fsica Computacional | Departamento de Fsica | ECEyN | FCEIyA | UNR

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. Ejercicio U3-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 1C7F:0102 MOV CX,001A 1C7F:0105 CALL 0200 1C7F:0108 LOOP 0105 1C7F:010A INT 20 1C7F:010C -A 200 1C7F:0200 MOV AH,02 1C7F:0202 INT 21 1C7F:0204 INC DL 1C7F:0206 RET 1C7F:0207

Se coloca el cdigo del caracter A en DL Se inicializa el contador en 2610

Se genera el cdigo del prximo caracter

-G ABCDEFGHIJKLMNOPQRSTUVWXYZ El programa ha finalizado con normalidad

Observacin: Se coloca en DL el cdigo del caracter 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
7 Fsica Computacional | www.fceia.unr.edu.ar/~fisicomp Hugo Navone ::: hnavone@ifir.edu.ar Laboratorio de Fsica Computacional | Departamento de Fsica | ECEyN | FCEIyA | UNR

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 U3-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 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 (4210) 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
8 Fsica Computacional | www.fceia.unr.edu.ar/~fisicomp Hugo Navone ::: hnavone@ifir.edu.ar Laboratorio de Fsica Computacional | Departamento de Fsica | ECEyN | FCEIyA | UNR

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 (1710- 710=1010=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 1CA8:0102 1CA8:0104 1CA8:0106 1CA8:0109 1CA8:010C 1CA8:010E 1CA8:0111 1CA8:0113

MOV INT MOV SUB CMP JLE SUB MOV SHL

AH,01 21 DL,AL DL,30 DL,09 0111 DL,07 CL,04 DL,CL 21 AL,30 AL,09 011F AL,07 DL,AL AH,02 21 20

Servicio 01h de la INT 21 (Lectura primer caracter) En AL queda almacenado el caracter leido DL se usa como registro de trabajo Se resta a DL el valor 30h Se verifica si es un dgito entre 0...9 Si es un dgito salta a 0111 Determina el caracter decimal Corrimiento a realizar sobre DL Corrimiento en DL de cuatro dgitos a la izquierda Lectura del 2do dgito hexadecimal

1CA8:0115 INT 1CA8:0117 SUB 1CA8:0119 CMP 1CA8:011B JLE 1CA8:011D SUB 1CA8:011F ADD 1CA8:0121 MOV 1CA8:0123 INT 1CA8:0125 INT 1CA8:0127

Se suman los dgitos hexadecimales Servicio para imprimir el caracter ASCII Imprime caracter ASCII almacenado en DL

-G 41A El programa ha finalizado con normalidad

9 Fsica Computacional | www.fceia.unr.edu.ar/~fisicomp Hugo Navone ::: hnavone@ifir.edu.ar Laboratorio de Fsica Computacional | Departamento de Fsica | ECEyN | FCEIyA | UNR

Anda mungkin juga menyukai