Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LAb 3 Sistemas
LAb 3 Sistemas
Instructores:
Br. Luis Herrera.
Br. Christian Tercero.
Catedrático:
Ing. Ricardo E. Cortez
Ciudad Universitaria,9 de abril del 2021
Porcentaje Nota
1- Introducción (máximo una página) 5%
2- Objetivos (1 general, 2 específicos) 5%
3- Marco teórico (máximo 2 páginas) 10%
4- Desarrollo de la practica 10%
5- Asignaciones 40%
a) 8%
b) 8%
c) 8%
d) 8%
e) 8%
6- Conclusiones 30%
Nota final
Introducción
Aunque todos los ensambladores realizan básicamente las mismas tareas, podemos
clasificarlos de acuerdo a características. Así podemos clasificarlos en: ENSAMBLADORES
CRUZADOS (CROSS-ASSEMBLER). Se denominan así los ensambladores que se utilizan en una
computadora que posee un procesador diferente al que tendrán las computadoras donde va a
ejecutarse el programa objeto producido. El empleo de este tipo de traductores permite
aprovechar el soporte de medios físicos (discos, impresoras, pantallas, etc.), y de programación
que ofrecen las máquinas potentes para desarrollar programas que luego los van a ejecutar
sistemas muy especializados en determinados tipos de tareas. ENSAMBLADORES RESIDENTES.
Son aquellos que permanecen en la memoria principal de la computadora y cargan, para su
ejecución, al programa objeto producido. Este tipo de ensamblador tiene la ventaja de que se
puede comprobar inmediatamente el programa sin necesidad de transportarlo de un lugar a
otro, como se hacía en cross-assembler, y sin necesidad de programas simuladores.
MACROENSAMBLADORES. Son ensambladores que permiten el uso de macroinstrucciones
(macros). Debido a su potencia, normalmente son programas robustos que no permanecen en
memoria una vez generado el programa objeto. MICROENSAMBLADORES. El programa que
indica al intérprete de instrucciones de la UCP cómo debe actuar se denomina microprograma.
El programa que ayuda a realizar éste microprograma se llama microensamblador. Existen
procesadores que permiten la modificación de sus microprogramas, para lo cual se utilizan
microensambladores. ENSAMBLADORES DE UNA FASE. Estos ensambladores leen una línea del
programa fuente y la traducen directamente para producir una instrucción en lenguaje
máquina o la ejecuta si se trata de una pseudoinstrucción. También va construyendo la tabla
de símbolos a medida que van apareciendo las definiciones de variables, etiquetas, etc.
ENSAMBLADORES DE DOS FASES. Los ensambladores de dos fases se denominan así debido a
que realizan la traducción en dos etapas. En la primera fase, leen el programa fuente y
construyen una tabla de símbolos; de esta manera, en la segunda fase, vuelven a leer el
programa fuente y pueden ir traduciendo totalmente, puesto que conocen la totalidad de los
símbolos utilizados y las posiciones que se les ha asignado.
Desarrollo de la práctica
La practica nos pide ensamblar los códigos en los apéndices A y B y luego correrlos,
por lo tanto, comenzaremos con el apéndice A.
Primero se crea un archivo .asm
PRIMASM.asm
.8086
DB 64 DUP (?)
CODIGO ENDP
Por ultimo se ejecuta el archivo, pero en este caso el programa no hace nada.
; Apendice.asm
; Programa para desplegar todos los caracteres en pantalla
; El primer paso a dar es definir los segmentos:
; Segmento de pila (STACK) de longitud 256 bytes:
STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP (0)
STACK ENDS
; Segmento de código:
CODE SEGMENT PARA PUBLIC 'CODE'
INICIO PROC FAR
ASSUME CS:CODE,SS:STACK
PUSH DS
MOV AX,0
PUSH AX
; PRIMER PASO: limpiar la pantalla
MOV AX,0B800H ; Dirección del segmento de memoria
; para el adaptador del monitor.
MOV ES,AX ; Fijar a ES como registro base.
MOV DI,0 ; Desplazamiento inicial del segmento ES.
MOV AL,' ' ; Caracter para borrar.
MOV AH,07H ; Byte de atributo para un
; despliegue normal.
MOV CX,2000 ; Número de veces a repetir la
; instrucción que sigue a REP.
CLD ; STOS cargue la memoria y
REP STOSW ; Escribe el caracter contenido en AL
; a la pantalla.
; SEGUNDO PASO: Llenar la pantalla con 256 caracteres
; separados por una fila y una columna c/u.
MOV AL,0 ; AL contiene el caracter a desplegar.
MOV AH,0 ; AH contiene el número de columna.
MOV DI,160 ; DI contiene el desplazamiento y se
; inicia para que apunte al primer
; caracter de la 2a. fila.
; Lazo que llena la pantalla:
LAZO: MOV ES:[DI],AL ; Pone el caracter en la memoria del
; adaptador.
ADD DI,4 ; Apuntar a la próxima posición.
ADD AH,2 ; Actualizar la columna.CMP AH,80 ; Detectar fin de fila.
JB SALTO ; Si no es fin de fila, saltar
; (ir a "SALTO").
ADD DI,160 ; Si es fin de línea, cambiar de fila.
MOV AH,0 ; Volver a primera columna.
SALTO: CMP AL,255 ; ¿Se han desplegado todos los caracteres?
JE FINAL ; Si ya se desplegaron todos los caracteres,
; ir a la salida.
INC AL ; Ir al próximo caracter.
JMP LAZO ; volver al inicio del lazo.
; TERCER PASO: Después de escribir todos los caracteres, esperar,
; borrar la pantalla y volver al DOS.
FINAL:
MOV AX,400H ; Define el tiempo del retardo
; junto con CX.
RETARDO: MOV CX,0A000H ; El retardo variará según la
; velocidad del CPU.
; Aproximadamente 5 seg. en una
; CPU Pentium ® 75 MHz.
RETARDAR: LOOP RETARDAR
INC CX
DEC AX
JNZ RETARDO
MOV DI,0
MOV AL,' '
MOV AH,07H
MOV CX,2000
REP STOSW
RET
INICIO ENDP
CODE ENDS
END INICIO
Escriba el programa del apéndice B como un procedimiento cercano
(denominado
CARACT), el cual debe ser llamado por un programa principal similar a
PRIMASM en cuyo segmento de código se define:
CODIGO PROC FAR
PUSH DS
MOV AX,0
PUSH AX
CALL CARACT
;Aquí escribir instrucciones para leer la tecla "enter". Si es la
;tecla "enter" escribir a continuacion:
RET ;retorno a DOS. Si no es la tecla "enter", esperar hasta que lo
;sea.
CODIGO ENDP
CSEG ENDS
END CODIGO
Asignaciones
Explique el proceso de ensamble de un programa en macro assembler.
1. El programa utiliza un editor de texto para crear un archivo de texto ASCII, conocido como
archivo de código fuente.
2. El ensamblador lee el archivo de código fuete y produce un archivo de código objeto, una
traducción del programa a lenguaje máquina. De manera opcional, produce un archivo de
listado. Si ocurre un error, el programador debe regresar al paso 1 y corregir el programa.
3. El enlazador lee el archivo de código objeto y verifica si el programa contiene alguna
llamada a los procedimientos en una biblioteca de enlace.
4. La herramienta cargadora del sistema operativo lee el archivo ejecutable y lo carga en
memoria, y bifurca la CPU hacia la dirección inicial del programa, para que éste empiece a
ejecutarse.
Edición
Los archivos fuente de código ensamblador deben estar en formato ASCII standard. Para esto
puede usarse cualquier editor que permita crear archivos sin formato.
Ensamblado
El ensamblado se lleva a cabo invocando al MASM. Este puede ser invocado, usando una línea
de comando, de la siguiente manera: MASM archivo [,[objeto][,[listado] [,[cross]]]]][opciones]
[;] Dónde: Objeto.- Es el nombre para el archivo objeto. Listado. - Nombre del archivo de
listado de ensamblado. cross. Es un archivo de referencias cruzadas.
Objeto. - Es el nombre para el archivo .OBJ Ejecutable. - Nombre del archivo .EXE Mapa. -
Nombre del archivo mapa Librería. - Nombre del archivo biblioteca de rutinas
Ejecución
Para la ejecución del programa simplemente basta teclear su nombre en el prompt de MS-DOS
y teclear ENTER. Con esto el programa será cargado en memoria y el sistema procederá a
ejecutarlo.
Para llamar a la interrupción para que realice la lectura, tenemos que incluir el
siguiente código en nuestro programa (veámoslo sobre el ejemplo anterior):
Mov ah,0ah
Mov dx,offset bufnum1
Int 21h
.model small
.stack 100
.code
mov ah, 02h ; funcion para imprimir un caracter
mov dx, 64 ; mover un 64 a Dx para imprimir en pantalla
int 21h ; ejecuta la funcion
.exit
end
Letra Operación
S Suma
R Resta
M Multiplicación
D División
Cualquier otra letra Operación no valida
Sin que haga diferencia entre mayúsculas y minúsculas, es decir si se ingresa “S” o“s” el
programa siempre realice la suma y así con las demás instrucciones.
; Asig5.asm
.8086
.model small ; Directiva para indicar el tamano del programa
.stack 256 ; Directiva para indicar el tamano de pila
.data
CAD_USR DB 10, 13 ,"Introduzca el usuario:",10,13,24h
CAD_PASS DB 10,13,"Introduzca la contrasena:",10,13,24h
USERS DB "USER1",45 DUP(0)
CONTR DB "PASS1",45 DUP(0)
USER_AC DB 5 DUP(?)
CONTR_AC DB 5 DUP(?)
CAN_DATOS DB 1
MSGMD DB "se han superado la cantidad de datos que se pueden
ingresar",10,13,24h
MSGSF DB "Sesion Finalizada, no podra ver ni agregar usuarios hasta
que inicie sesion",10,13,24h,24H
MSGM DB 10,13,"tecla erronea, vuelva a digitarlo",10,13,24h
MSG1 DB "_______________________________________________",10,13
MSG2 DB "|letra | Ingresar nuevo usuario y contrasena | ",10,13
MSG3 DB "|______|_______________________________________|",10,13
MSG4 DB "| N | Ingresar nuevo usuario y contrasena | ",10,13
MSG5 DB "| B | iniciar sesion | ",10,13
MSG6 DB "| I | Imprimir usuario y password | ",10,13
MSG7 DB "| X | cerrar sesion | ",10,13
MSG8 DB "| E | Finalizar programa | ",10,13
msg9 db "|______|_______________________________________|" ,10,13,24h
CMPR_USERAC: ;MACRO
mov dx,0
mov bl,5
prueba:
cmp dx,10
jae errorusuario
mov cx, 5
mov si, offset USER_AC
mov di, offset users
mov ax,dx
mul bl
add di,ax
cld
repe cmpsb
jz password;etiqueta para probar contrasenia
inc dx
jmp prueba
password:
mov di, offset CONTR
mov al,dl
mov si, offset CONTR_AC
mul bl
add di,ax
mov cx,5
repe cmpsb
jz MENU
jmp errorusuario
;CMPR_USERAC ENDM
errorusuario:
jmp inicio2
MENU:
MOV DX, OFFSET MSG1
CALL CAD_IMP
MOV AH,1H
INT 21H
MOV BH,AL
mov ah,2
mov dl,10
int 21h
mov dl,13
int 21h
MOV AL,BH
CMP AL,'N'
JE NUEVO_USR
CMP AL,'B'
JE INICIO2;INICIO_SESION
CMP AL, 'I'
JE IMP_ALL
CMP AL, 'X'
JE CERRAR_SESION
cmp al,'E'
je ed_prog
MOV DX, OFFSET MSGM
call Cad_imp
JMP MENU
menusf:
MOV DX, OFFSET MSG1
CALL CAD_IMP
MOV AH,1H
INT 21H
CMP AL,'B'
JE INICIO2;INICIO_SESION
CMP AL, 'X'
JE CERRAR_SESION
cmp al,'E'
je ed_prog
JMP MENUsf
MOV AX,5
MUL CAN_DATOS
ADD AX,OFFSET USERS
MOV SI,AX ; UBICA EL APUNTADOR SI A LA TABLA USUARIOS EN LA
POSICION 5*CAN_DATOS
CALL IN_A_SI_USER
MOV DX, OFFSET CAD_PASS
CALL CAD_IMP
MOV AX,5
MUL CAN_DATOS
ADD AX,OFFSET CONTR
MOV SI,AX
CALL IN_A_SI_PAS
MOV SI,OFFSET CONTR ; UBICA EL APUNTADOR SI A LA TABLA USUARIOS EN LA
POSICION 5*CAN_DATOS
INC CAN_DATOS
RET
ING_USER ENDP
inicio:
mov ax,@data ;Inicializar los registros.
mov ds,ax
MOV ES,AX
inicio2:
mov dx,offset CAD_USR
CALL CAD_IMP
MOV SI,OFFSET USER_AC
CALL IN_A_SI_USER
MOV DX, OFFSET CAD_PASS
CALL CAD_IMP
MOV SI,OFFSET CONTR_AC
CALL IN_A_SI_PAS
jmp CMPR_USERAC
IMP_ALL:
MOV BL,0; IRA DE 0 A CAN_DATOS (CANTIDAD DE DATOS INTRODUCIDOS)
MOV SI,OFFSET USERS
MOV DI, OFFSET CONTR
MOV BH, CAN_DATOS
CICLO_IMP:
MOV CX,5
POR_USR:
MOV AH,2
MOV DL,[SI]
INT 21H
INC SI
LOOP POR_USR
MOV AH, 2
MOV DL,9
INT 21H
MOV CX,5
POR_PASS:
MOV AH, 2
MOV DL,[DI]
INT 21H
INC DI
LOOP POR_PASS
MOV AH,2
MOV DL,10
INT 21H
MOV DL, 13
INT 21H
INC BL
CMP BL,BH
JB CICLO_IMP
JMP MENU
NUEVO_USR:
; CUANDO CAN_DATOS SEA 10 YA NO SE PODRA METER MAS DATOS
CMP CAN_DATOS,10
Jae NOSEPUEDE
MOV AH,2
MOV DL,10
INT 21H
MOV DL,13
INT 21H
CALL ING_USER
JMP MENU
NOSEPUEDE:
mov dx, offset msgmd
CALL CAD_IMP
JMP MENU
CERRAR_SESION:
ed_PROG:
.exit
end inicio
Conclusiones