Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guía #2 Programación Ensamblador
Guía #2 Programación Ensamblador
GUIA PRACTICA Nº 2
2. Objetivos
§ Conocer los requerimientos básicos para codificar un programa en lenguaje ensamblador y
definir sus elementos de datos.
§ Conocer y familiarizarse con el entorno de desarrollo de programas en Lenguaje Assembler
mediante el uso y manejo de un Ensamblador (Turbo Assembler) y un depurador (Turbo
Debugger).
§ Entender el funcionamiento básico de los Procedimientos o Subrutinas y las Macros.
§ Desarrollar programas (.EXE y .COM) empleando llamadas a funciones del DOS y BIOS.
3. Materiales
§ Computadora personal.
§ Set de instrucciones del Microprocesador INTEL 8086.
4. Fundamento teórico
Ø Si se utiliza el punto “.”, éste no debe colocarse como primer carácter de la etiqueta. El
primer carácter tampoco puede ser un dígito.
Ø No se pueden utilizar los nombres de instrucciones o registros como nombres de
etiquetas.
Ø Las etiquetas son de tipo NEAR cuando el campo de etiqueta finaliza con dos puntos (:),
quiere esto decir que la llamada está dentro del mismo segmento de código (llamadas
intrasegmento) y el procesador sólo carga el puntero de instrucciones IP.
Ø Las etiquetas son de tipo FAR si el campo de etiqueta no termina con los dos puntos (:).
En estas etiquetas la instrucción a la que apunta no se encuentra en el mismo segmento
de código sino en otro. Cuando es referenciada en una transferencia de control se carga el
puntero de instrucciones IP y el segmento de código CS (llamadas intersegmento).
Campo de nombre: Contiene el mnemónico de las instrucciones (Ej. MOV, ADD, etc) o
bien una directiva (Ej. EQU, DB, DW, etc) de las que veremos más adelante.
Campo de operandos: Indica cuales son los datos implicados en la operación. Puede haber
0, 1 ó 2; en el caso de que sean dos al 1º se le llama destino y al 2º (separado por una coma)
fuente.
MOV AX, [DI] ; AX à destino y [DI] à origen o fuente
Campo de comentarios: Cuando en una línea hay un punto y coma (;) todo lo que sigue en
la línea es un comentario, resulta de gran utilidad para realizar futuras modificaciones al
mismo. Ejemplo:
; Programa que calcula el promedio aritmético de 20 datos de un Byte
ADD AH, [BX] ; Suma al registro AH el contenido de BX
Sólo es obligatorio el campo «nombre_directiva»; los campos han de estar separados por al
menos un espacio en blanco. La sintaxis de «nombre» es análoga a la de la «etiqueta» de las
líneas de instrucciones. El campo de comentario cumple también las mismas normas.
Con el operando DUP pueden definirse estructuras repetitivas. Por ejemplo, para asignar
100 bytes a cero y 25 palabras de contenido indefinido (no importa lo que el ensamblador
asigne):
ceros DB 100 DUP (0)
matriz DW 25 DUP (?)
Se admiten también los anidamientos. El siguiente ejemplo crea una tabla de bytes donde
se repite 50 veces la secuencia 1,2,3,7,7:
tabla DB 50 DUP (1, 2, 3, 2 DUP (7))
Ø ORG (ORiGin): Puede usarse esta directiva para cambiar el contenido del contador de
localidades de un segmento de datos o código. En los programas COM (que se cargan en
memoria con un OFFSET 100h) es necesario colocar al principio un ORG 100h, y un
ORG 0 en los controladores de dispositivo (aunque si se omite se asume de hecho un
ORG 0).
Ø END [expresión]: indica el final del fichero fuente. Si se incluye, expresión indica el
punto donde arranca el programa. Puede omitirse en los programas EXE si éstos constan
de un sólo módulo. En los COM es preciso indicarla y, además, la expresión (realmente
una etiqueta) debe estar inmediatamente después del ORG 100h.
Segmento de código
Al saltar, el uP sólo
CALL DELAY guarda IP en la pila
Continua el
programa
Inicio del
DELAY PROC NEAR procedimiento
Retorna y recupera
IP de la pila RET
DELAY ENDP
Figura 1. Procedimiento NEAR
Guarda en la
piila CS e IP
DELAY PROC FAR
CALL DELAY
Retorna y RET
recupera CS DELAY ENDP
e IP de la pila
Formato de un Procedimiento
Para escribir un procedimiento o subrutina se sigue los siguientes pasos, considerando que los
nombres no deben ser de las instrucciones ni de las directivas del ensamblador.
Su formato sería:
Nombre PROC [atributo] ; Comienza procedimiento
PUSH AX ; Atributo puede ser NEAR o FAR
PUSH BX ; Se salvan los registros a usarse
......
;-------------------------------------------------------------------------------------------
; programa a ejecutar
;-------------------------------------------------------------------------------------------
......
POP BX
POP AX ; Se recuperan los registros
RET
Nombre ENDP
4.3 Macros
Una “macro” es un conjunto de instrucciones en ensamblador que pueden aparecer varias veces
en un programa con algunas modificaciones cada vez que se usan. Las macros son útiles para los
siguientes propósitos:
§ Simplificar y reducir la cantidad de codificación repetitiva.
§ Reducir errores causados por la codificación repetitiva.
§ Linealizar un programa en lenguaje ensamblador para hacerlo más legible.
La macro se define por medio de la directiva MACRO. Es necesario definir la macro antes de
utilizarla. Una macro puede llamar a otra macro. Con frecuencia, las macros se colocan juntas en
un fichero independiente y luego se mezclan en el programa principal con la directiva INCLUDE:
Conviene hacer hincapié en que la definición de la macro no consume memoria, por lo que en la
práctica es indiferente declarar cientos que ninguna macro.
Su formato es:
Ejemplo 2: Escribir una Macro que compare 2 números y retorne como resultado el menor
La directiva LOCAL dentro de la Macro, permite definir etiquetas propias de la macro y que
pueden tener inclusive el mismo nombre que las etiquetas dentro del programa principal.
Esta directiva pueden ser empleada también sin las macros, aumentando la comodidad de la
programación, aunque abundan especialmente dentro de las macros.
Ø Utilice un editor de textos (por ejemplo EDIT del DOS o NOTEPAD de Windows) para
escribir el programa y grábelo con extensión “.ASM”.
TASM Nombre_Archivo,,,
Si hubo error en la compilación, edite y corrija su código fuente y repita el paso anterior.
De los contrario se habrá creado un archivo con extensión “.OBJ”, el cual deberá enlazar
para generar el ejecutable:
TLINK Nombre_Archivo ; Para un programa .EXE
TLINK /t Nombre_Archivo ; Para un programa .COM
Prog.ASM
Ensamblador
Prog.OBJ
Opcional
Prog.LST Enlaza el programa
Enlace objeto, crea un programa
Prog.CRT ejecutable (.EXE)
Enlazador Prog.EXE
Carga y ejecuta el
Ejecuta programa .EXE
COMPI.BAT
ECHO OFF
CLS
ECHO ENSAMBLANDO %1
TASM –zi %1,,,
IF ERRORLEVEL 1 GOTO ERROR
ECHO ENLAZANDO %1 ...
TLINK –v %1 %2
ECHO ...
GOTO FIN
:ERROR
ECHO ERROR NO ENSAMBLADO - ABORTADO
:FIN
Una herramienta útil para el desarrollo de programas es el Turbo Debugger (TD.EXE) pues
permite hacer un seguimiento a la ejecución del programa.
TD Nombre_Archivo (enter)
Al ejecutar el Turbo Debugger aparecerá una ventana con el listado del programa cargado, luego
presione ALT-V y seleccione las ventanas que UD desea observar durante la ejecución del
programa. Por ejemplo:
Con estas opciones UD puede ejecutar el programa paso a paso y hacer el seguimiento respectivo .
Si su programa incluye MACROS y/o PROCEDIMIENTOS, éstas se ejecutarán como si tratara
de una instrucción más del microprocesador.
Ahora si UD desea analizar internamente cada una de ellas ejecutándolo paso a paso, haga lo
siguiente:
Ø ALT-V-C: Obtiene una ventana con cinco secciones (Usar TAB para moverse entre cada
sección y las flechas dentro de cada sección).
4 Segmento de código: Mostrando las direcciones, códigos hexadecimales e instrucciones del
programa cargado.
4 Registros: Los cuales se pueden ver y modificar directamente.
4 CPU flags: Para modificarlos utilizar CTRL-T para cambiar de 1 a 0 o viceversa.
4 Segmento de pila: Mostrando la dirección, contenido de la pila y la posición actual del stack
pointer.
4 Segmento de datos: mostrando la dirección, contenido y código ASCII del segmento de
datos.
Para iniciar la ejecución y/o depuración del programa utilizar:
Para obtener mayor información sobre el uso de esta herramienta puede hacer uso del Help que viene
dentro del entorno integrado.
5. Procedimiento
Cargue el edit del DOS o el bloc de notas de Windows y escriba los siguientes ejemplos.
5.1 Programa 1:
Escriba un programa que imprima los siguientes mensajes en pantalla: “Hola, bienvenido al
Lenguaje Ensamblador” y “Qué fácil es este lenguaje!!!”.
Modelo .EXE
; **********************************************************************
; G2_E1A.ASM (Tipo EXE)
; Este programa muestra algunas características de un programa en
; Lenguaje Assembler imprimiendo en pantalla 2 mensajes de texto.
; **********************************************************************
CR EQU 13 ; Retorno de carro
LF EQU 10 ; Fin de línea
.Model Small
.Stack 64h ; reserva 100 bytes en la pila
.Data ; inicia segmento de datos
;-----------------------------------------------------------------------
texto1 DB ‘Hola, bienvenidos al Lenguaje Assembler’,LF,CR,‘$’
texto2 DB ‘Que facil es este Lenguaje!!!’,LF,CR,’$’
;-----------------------------------------------------------------------
.Code
MAIN PROC FAR
MOV AX, @Data ; Inicializa segmento de datos
MOV DS, AX ; para que apunte a mi segmento “Data”
Modelo .COM
; **********************************************************************
; G2_E1B.ASM (Tipo COM)
; Este programa muestra algunas características de un programa en
; Lenguaje Assembler imprimiendo en pantalla 2 mensajes de texto.
; **********************************************************************
CR EQU 13 ; Retorno de carro
LF EQU 10 ; Fin de línea
.Model Tiny
.Code ; Inicia segmento de código
ORG 100H ; Inicio al final de PSP
BEGIN: JMP MAIN ; Salto pasando los datos si lo hubiera
;-----------------------------------------------------------------------
texto1 DB ‘Hola, bienvenidos al Lenguaje Assembler’,LF,CR,‘$’
texto2 DB ‘Que facil es este Lenguaje!!!’,LF,CR,’$’
;-----------------------------------------------------------------------
Compare ahora el tamaño de ambos ejecutables (.EXE y .COM), deberá salir como sigue:
G2_E1A EXE 1.226 ; Ocupa 1226 bytes en memoria
G2_E1B COM 93 ; Ocupa 93 bytes en memoria
5.2 Programa 2: (De aquí en adelante todos los programas serán tipo EXE)
Escriba el mismo programa anterior (G2_E1A.ASM), pero ahora usando la librería de macros.
; *********************************************************************************
; G2_E2A.ASM
; Este programa muestra algunas características de un programa en Lenguaje
; Assembler imprimiendo en pantalla 2 mensajes de texto. USO DE MACROS
; *********************************************************************************
JUMPS
INCLUDE LIB_GEN.MAC ; Incluye librería de Macros
.Model Small
.Stack 64h ; reserva 100 bytes en la pila
.Data ; Segmento de datos (no hay datos)
.Code
MAIN PROC FAR
; *********************************************************************************
; G2_E3A.ASM
; Este programa muestra como usar los Macros y procedimientos tipo NEAR
; realizando diversas acciones como borrar pantalla, etc.
; *********************************************************************************
JUMPS
INCLUDE LIB_GEN.MAC
.Model Small
.Stack 64h ; reserva 100 bytes en la pila
.Data ; Segmento de datos (no hay datos)
.Code
MAIN PROC FAR
MOV AX, @Data ; Inicializa segmento de datos
MOV DS, AX ; Para que apunte a mi segmento "Data"
;----------------------------------------------------------------------------------
borra PROC NEAR ; Procedimiento que borra pantalla
MOV AX, 0600H ; Recorrer toda la pantalla
MOV BH, 07H ; Atributo fondo blanco, letra blanca
MOV CX, 0000 ; Posición superior izquierda
MOV DX, 184FH ; Posición inferior derecha
INT 10H
RET
borra ENDP
5.4 Programa 4: Programa que emplea Macros y Procedimientos tipo NEAR y FAR.
; *********************************************************************************
; G2_E4A.ASM
; Este programa muestra como usar los Macros y procedimientos tipo NEAR y FAR
; realizando diversas acciones como borrar pantalla, etc.
; Los procedimientos están en una librería de procedimientos LIBPROC.ASM
; *********************************************************************************
JUMPS
INCLUDE LIB_GEN.MAC
LF EQU 10
CR EQU 13
.Model Small
.Stack 64h ; reserva 100 bytes en la pila
.Data ; Segmento de datos (no hay datos)
;----------------------------------------------------------------------------------
texto DB ‘PROGRAMA QUE ILUSTRA LOS PROCEDIMIENTOS FAR’,LF,CR,’$’
;---------------------------------------------------------------------------------
.Code
MAIN PROC FAR
MOV AX, @Data ; Inicializa segmento de datos
MOV DS, AX ; Para que apunte a mi segmento "Data"
;----------------------------------------------------------------------------------
parpachar PROC NEAR ; Procedimiento parpadeante
MOV AH, 09H ; Petición de despliegue
MOV AL, '*' ; Carácter a imprimir
MOV BH, 0 ; Página 0
MOV BL, 8EH ; Fondo negro, letra amarilla
MOV CX, 79 ; Número de caracteres
INT 10H
RET
parpachar ENDP
;----------------------------------------------------------------------------------
END MAIN ; Fin de programa
;**********************************************************************************
.Model small
.Stack 64H
.Data ; Segmento de datos
EsPrimo DB 0
Nmax DW 0
.Code
MAIN PROC FAR
MOV AX, @Data
MOV DS, AX ; Inicializo DS
;**********************************************************************************
; Procedimiento que verifica si un numero es primo o no.
; Entrada : AX -> Numero a Verificar
; Salida : EsPrimo : 0 -> No es primo ; 1 -> Si es primo
;**********************************************************************************
6. Bibliografía
BREY, Barry (Capítulos 7)
2001 Los Microprocesadores Intel: 8086/8088, 80186, 80286, 80386 y 80486.
Arquitectura, programación e interfaces. 5ta Edición. Ed. Prentice may
(621.3981 BREY)