Sei sulla pagina 1di 13

PRACTICA N°3

OBJETIVOS:

- preparar al alumno en los manejos del programa ensamblador MASM, elensamblador


LINK (para generar programas EXE) y utilizar el depurador DEBUG para rastrear la
secuencia del programa. Generación de un programa con extencion.COM.

- Preparar al alumno sobre la estrategia para desarrollar u programa en lenguaje ensamblador.

FUNDAMENTO TEORICO:

El nivel más bajo de programación es programar en código de maquina como herramientas


depuradoras como el DEBUG, sin embargo, aun con programas pequeños resulta complicado
programar en base a código conformado a unos y otros.

Un nivel más alto de codificación es el nivel ensamblador en el que el programador utiliza


instrucciones simbólicas en lugar de instrucciones de máquinas y nombres descriptivos para los
elementos de datos y localidades de memoria.

ORGANIZACIÓN DE UN PROGRAMA

Los siguientes pasos son comunes para escribir un programa en lenguaje ensamblador:

1.-Tener una idea clara del problema que el programa va a resolver.

2.- Esbozar las ideas en términos generales y planear la lógica general. Por Ejemplo, sin un
problema es examinar las operaciones de movimiento de múltiples bytes, inicie definiendo los
campos que serán movidos. Después planear la estrategia para las instrucciones: rutinas de
inicialización, para uso de salto condicional y para uso de LOOP (ciclos o lazos). Lo siguiente
muestra la lógica principal: codigo que muchos programadores utilizan para planear un programa:

- Inicializar los registros de segmento

- Llamar a la rutina de bifurcación

- Llamar a la rutina del ciclo

- Regresar al DOS

Las rutinas de bifurcación podría ser planeada como:

- Inicializar los registros de conteo, para direcciones de nombres

- Salto 1:

- Mover un carácter del nombre

- Incrementar para parar al siguiente carácter de nombre

- Decrementar el contador si no es cero, Salto 1

- Si es cero, Regresar
La rutina del ciclo podría ser esbozada de una manera semejante.

3.-Organizar el programa en unidades lógicas tales que rutinas relacionadas se sigan una a otra.
Procedimiento de alrededor de 25 líneas (del tamaño de la pantalla) son más fáciles de depurar que
procedimientos más largos.

4.- Utilizar como guías otros programas.

5.- Utilizar los comentarios para clarificar lo que se supone hace un procedimiento, que
operaciones aritméticas y de comparación son realizadas y lo que hace un a instrucción raramente
usada (Ej. LOOPNE:¿el ciclo se efectúa mientras no sea igual o hasta que no sea igual?).

6.- Para teclear el programa, utilizar una estructura de programa que pueda copiar en un archivo
con un nuevo nombre.

Procedimiento:

Ensamblar los siguientes programas que vienen escritos en código fuente posteriormente linkearlos
con DEBUG. Presentar el listado (opción LST) y el programa ejecutable.

EJEMPLO 1:

;HOLA ASM
;Programa clásico ejemplo 1.Despliega una leyenda en pantalla.
STACK SEGMENT STACK ;Segmento de pila
DW 64 DUP(?) ;Define espacio de la pila
STACK ENDS
DATA SEGMENT ;Segmento de datos
SALUDO DB “Hola mundo!!”,13,10,”$”;Cadena
DATA ENDS
CODE SEGMENT ;Segmento de código
ASSUME CS: CODE, DS: DATA, SS: STACK
INICIO: ;Punto de entrada al programa
MOV AX, DATA ;Pone dirección en AX
MOV DS, AX ;Pone la dirección en los registros
MOV DX, OFFSET SALUDO ;Obtiene dirección del mensaje
MOV AH, 09H ;Funcion: Visualizar cadena
INT 21H ;Servicio: Funciones alto nivel DOS
MOV AH, 4CH ;Funcion terminar
INT 21H
CODE ENDS
END INICIO ;Marca fin y define INICIO ;HOLA ASM;
Programa clásico ejemplo 1.Despliega una leyenda en pantalla.
STACK SEGMENT STACK ;Segmento de pila
DW 64 DUP(?) ;Define espacio de la pila
STACK ENDS
DATA SEGMENT ;Segmento de datos
SALUDO DB “Hola mundo!!”,13,10,”$”;Cadena
DATA ENDS
CODE SEGMENT ;Segmento de código
ASSUME CS: CODE, DS: DATA, SS: STACK
INICIO: ;Punto de entrada al programa
MOV AX, DATA ;Pone dirección en AX
MOV DS, AX ;Pone la dirección en los registros
MOV DX, OFFSET SALUDO ;Obtiene dirección del mensaje
MOV AH, 09H ;Función: Visualizar cadena
INT 21H ;Servicio: Funciones alto nivel DOS
MOV AH, 4CH ;Funcion terminar
INT 21H
CODE ENDS
END INICIO ;Marca fin y define INICIO
EJEMPLO 2:

VIDEO EQU 0B800H ;Posición de memoria donde empieza el modo 80x25


stacksg SEGMENT STACK “STACK”
DB 40H DUP(0)
estacksg ends
codesg SEGMENT
assume cs: codesg, DS:codesg, SS: codesg, ES: codesg
CAR DB 02FH, 07CH, 05CH, 02DH
efecto proc far
mov ax,video
mov es, ax
mov bx, 0
call vaciar_buffer
bucle:
INC BX
CMP BX,4
JNE sigue
MOV BX,0
sigue:
MOV AL, CS: CAR [BX+0]
MOV byte ptr ES:[09EH],AL
MOV CX, 25
CALL pausa
MOV AH, 0BH
INT 21H
CMP AL, 0
JE bucle
fin:
CALL vaciar_buffer
MOV AX, 4C00H
INT 21H
efecto endp
vaciar_buffer:
MOV AH, 0CH
MOV AL, 0
INT 21H
RET
pausa:
PUSH CX
MOV CX, 03611H
pausa 100:
LOOP pausa 100
POP CX
LOOP pausa
RET
codesg ends
end efecto
Imagines de la pantalla:

2.-¿Que banderas son afectadas y que contendrán en los sucesos? a) ocurrió un


desbordamiento b) un resultado en negativo c) un resultado en cero d) el procesamiento esta
en modo de avance paso a paso e) una transferencia de cadena se hace de derecha a izquierda

a) ocurrió un desbordamiento

1.- no existe desbordamiento OF=0


2.- sigue sin existir desbordamiento
3.- sigue sin existir desbordamiento
4.- sigue sin existir desbordamiento
b) un resultado en negativo
1.- si es negativo por que la bandera SF=1
2.- sigue existiendo un resultado negativo
3.- sigue siendo negativo
4.- el resultado es positivo porque SF=0
c) un resultado en cero
1.- no es cero porque ZF=0
2.- no es cero
3.- no es cero
4.- el resultado es cero porque la bandera ZF=1
d) el procesamiento esta en modo de avance paso a paso
1.-no porque no esta yendo en modo paso a paso el DF=0
2.-no va hacia adelante
3.- no va hacia adelante
4.- no va hacia adelante
e) una transferencia de cadena se hace de derecha a izquierda
1.- no por no esta activado la bandera IF=1
2.- no porque la transferencia no esta en cadena
3.- no porque la transferencia no esta en cadena
4.-no porque la transferencia no esta en cadena

3.-¿Cuál es la diferencia entre la codificación de un operando PROC con FAR y con NEAR?

R.- La diferencia entre un operando PROC FAR y un operando PROC NEAR es que el operando
PROC FAR(lejano) hace referencia a datos que se encuentran fuera del segmento, en cambio el
operando PROC NEAR(cercano) hace referencia a todos dentro del mismo segmento.

4.-en un programa, EXE, A20 llama a B20 llama a C20 y C20 a D20.¿como resultadode estas
llamadas, cuantas direcciones contiene la pila?
R.- la pila contiene tres direcciones ya que hace tres llamadas.

5.-Realizar la multiplicación por 10 para el contenido de AX, utilizando tan solo instrucciones
de corrimiento, movimiento y suma

mov ax, 05
mov bl, al
shl bl, 1
mov bh, al
shl bh, 3
add bl, bh
mov al, bl

para el numero 5 genera el número 50 en hexadecimal(32h),mostrado en el registro AL

6.-considerando un valor de 32 bits DX:AX en el que los 16 bits menos significativos esta
en AX y los 16 bits mas significativos están en DX, utilizando instrucciones de desplazamiento
y rotación de palabras dobles, efectúa las siguientes operaciones: a) Multiplicación por 2
b)multiplicación por 4 c)división entre 4 d)investigar que instrucciones multiplican por 2 los
48 bits de DX:AX:BX instrucciones utilizadas a partir del procesador 80386)

a) Multiplicación por 2

mov dx,03
mov ax,04
shl dx,1
shl ax,1

b)multiplicación por 4

mov dx,03
mov ax,04
shl dx,2
shl ax,2
c)división entre 4

mov dx,12
mov ax,12
shr dx,2
shr ax,2

d) Investigar que instrucciones multiplican por 2 los 48 bits de DX:AX:BX instrucciones


utilizadas a partir del procesador 80386)

R.-Las instrucciones que multiplican por 2los 48 bits son: SHLD desplaza hacia la izquierda por 2
los 48 bits de forma doble y SHRD desplaza hacia la derecha por 2 los 498 bits de forma doble

7.- Codifique una rutina usando LOOP que calcule la sucesión Fibonacci
1,1,2,3,5,8,13,21….salvo por los dos primeros números en la sucesión cada número es la suma
de los dos números que se precede. Establezca un límite de 12 vueltas. Ensámblela, enlácela y
utilice DEBUG para rastrear la rutina

mov cx,12
mov bx,1
mov ax,1
serie:
mov dx,ax
add ax,bx
mov bx,dx
loop serie

El resultado de la serie se muestra en el registro BL

8.-¿Cuál es el tamaño máximo de un programa . COM?

R.-El tamaño máximo del programa .COM es de 64 Kbytes incluyendo el PSP de 256 byte
9.-para un programa fuente que será convertido a formato .COM ¿Qué segmento se puede
definir?

R.-se puede definir el segmento de código CS.

10.-Codefique, ensamble, enlace y utilice DEBUG para probar el siguiente programa: defina
elementos de byte llamados BYTE1 y BYTE2(con cualquier valor) y una palabra
WORD3(con 0)

- mueva el contenido del BYTE1 al AL


- Sume el contenido del BYTE2 al AL
- Mueva el valor inmediato 37 al BL
- Intercambie los contenidos del AL y BL
- Multiplique el contenido de BL por el de AL (MUL BL)
- Almacene el producto en AX y envíelo a WORD3

Data segment

byte1 db 2h
byte2 db 4h
word3 dw 0
;add your data here!
pkey db “press any key…$”
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
;set segment registers:
mov ax, data
mov ds, ax
mov es, ax
mov al,byte1
add al,byte2
mov l,37
mov dl, bl
mov bl, al
mov al, dl
mul bl
mov word3,ax
11.- Corrija el programa anterior para formato .COM. Ensámblelo, enlácelo y
ejecútelo con DEBUG.
CONCLUSIONES Y RECOMENDACIONES:

Para programar el formato .EXE. es necesario saber los parámetros o condiciones para crear un
archivo con extensión .EXE sin embargo en el emulador 8086 los registros, parámetros son creados
de forma automática.

Para utilizar el lenguaje ensamblador con el emulador 8086 es necesario saber los comandos que
se va a utilizar ya que si nose los escribe de forma correcta el emulador nos dará un mensaje de
error y no podrá ejecutar el código programado en el emulador

Es importante definir las variables o los valores a utilizar, ya sean estos decimales o hexadecimales,
ya que para poner valores decimales solo se coloca el valor, pero el emulador ejecuta el programa
transformado el valor a hexadecimal, y si el valor a declarar se lo hace en hexadecimal es necesario
colocar una “h” después del valor, para especificar que esto es hexadecimal.

Antes de realizar el programa en el emulador 8086 o el DEBUG, primeramente, se debe diseñar el


programa de manera minuciosa para poder obtener los resultados deseados.

Potrebbero piacerti anche