PRÁCTICA 1

PRÁCTICA 1 PRÁCTICA 1

azul2.bnct.ipn.mx
from azul2.bnct.ipn.mx More from this publisher
15.05.2013 Views

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 1 1. INTRODUCCIÓN AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS PRÁCTICA 1 PROGRAMA PARA EXHIBIR EN PANTALLA EL CÓDIGO DE BARRIDO DE LA TECLA OPRIMIDA Mediante el desarrollo de esta práctica se realizará un programa que exhiba en pantalla el código de barrido de la tecla oprimida. El valor se exhibirá en decimal tanto para las teclas tipo normal como para las de tipo función. La tecla ESCAPE termina el programa. En general, cualquier programa puede requerir de algunos de los siguientes operadores y directivas: %TITLE Nos sirve para poner un titulo, por ejemplo: %TITLE "TITULO DE PROGRAMA" IDEAL Modo de ensamblado. DOSSEG Esta directiva se usa al principio de cualquier programa para especificar el orden de los segmentos del programa. MODEL Especifica el tamaño de la memoria. Ejemplo: MODEL small ;para programas *.EXE MODEL tiny ;para programas *.COM STACK Define el comienzo y tamaño del segmento de la pila. EQU Sirve para definir el nombre de la cadena. Numéricamente contiene el resultado de la evaluación de dicha expresión. DATASEG Define la inicialización del segmento de datos. CODESEG Define el comienzo del segmento de código que es usado en el programa. EXTRN Se usa para definir las rutinas que se usarán, definidas en otros módulos. DB Se usa para definir una variable tipo byte. Ejemplo: Nombre DB Expresión Donde: Nombre = Nombre de la expresión a usar. Expresión = Constante, carácter o cadena. 1-1

LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

1. INTRODUCCIÓN<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

<strong>PRÁCTICA</strong> 1<br />

PROGRAMA PARA EXHIBIR EN PANTALLA<br />

EL CÓDIGO DE BARRIDO DE LA TECLA OPRIMIDA<br />

Mediante el desarrollo de esta práctica se realizará un programa que exhiba en pantalla el<br />

código de barrido de la tecla oprimida. El valor se exhibirá en decimal tanto para las teclas tipo<br />

normal como para las de tipo función. La tecla ESCAPE termina el programa.<br />

En general, cualquier programa puede requerir de algunos de los siguientes operadores y<br />

directivas:<br />

%TITLE Nos sirve para poner un titulo, por ejemplo:<br />

%TITLE "TITULO DE PROGRAMA"<br />

IDEAL Modo de ensamblado.<br />

DOSSEG Esta directiva se usa al principio de cualquier programa para especificar el<br />

orden de los segmentos del programa.<br />

MODEL Especifica el tamaño de la memoria. Ejemplo:<br />

MODEL small ;para programas *.EXE<br />

MODEL tiny ;para programas *.COM<br />

STACK Define el comienzo y tamaño del segmento de la pila.<br />

EQU Sirve para definir el nombre de la cadena. Numéricamente contiene el<br />

resultado de la evaluación de dicha expresión.<br />

DATASEG Define la inicialización del segmento de datos.<br />

CODESEG Define el comienzo del segmento de código que es usado en el<br />

programa.<br />

EXTRN Se usa para definir las rutinas que se usarán, definidas en otros módulos.<br />

DB Se usa para definir una variable tipo byte. Ejemplo:<br />

Nombre DB Expresión<br />

Donde:<br />

Nombre = Nombre de la expresión a usar.<br />

Expresión = Constante, carácter o cadena.<br />

1-1


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

2. OBJETIVOS<br />

El alumno aprenderá a:<br />

2.1 Crear una biblioteca, ensamblar programas y crear un programa ejecutable.<br />

2.2 Exhibir letreros en la pantalla.<br />

2.3 Recibir e interpretar cualquier teclazo.<br />

2.4 Convertir valores binarios a ASCII y viceversa.<br />

2.5 Exhibirá el valor del código de barrido de la tecla oprimida.<br />

2.6 Hacer más amigable el programa.<br />

2.7 Depurar un programa con Turbo Debugger.<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

1-2


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

3. DESARROLLO<br />

3.1 Procedimientos para empezar una nueva línea y exhibir una cadena de caracteres.<br />

%TITLE "RUTINAS DE ENTRADA/SALIDA DE CADENAS”<br />

IDEAL<br />

DOSSEG<br />

MODEL small<br />

; EQUs<br />

TamBuff EQU 255 ;Máxima longitud de cadena<br />

ASCnulo EQU 0 ;ASCII nulo<br />

rc EQU 13 ;ASCII de retorno de carro<br />

nl EQU 10 ;Ídem para nueva línea<br />

; Estructura del buffer para la cadena en función 0AH de DOS<br />

STRUC EstrBuff<br />

maxlon DB TamBuff ;Máximo tamaño del buffer<br />

cadlon DB 0 ;Largo de cadena<br />

Carac DB TamBuff DUP (?) ;Buffer para LeeCadena<br />

ENDS EstrBuff<br />

DATASEG<br />

Buffer EstrBuff ; Buffer variable para LeeCadena<br />

CODESEG<br />

; De MANCADE.OBJ<br />

%NEWPAG<br />

EXTRN LargoCad:proc<br />

PUBLIC SacaCadena,SacaCadena2,NuevaLinea<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

1-3


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

;SacaCadena/SacaCadena2 ESCRIBE CADENA A SALIDA ESTÁNDAR<br />

;<br />

;Entrada: DI = dirección de cadena(s)<br />

; CX = número de caracteres a escribir (sólo SacaCadena2)<br />

;Salida: Cadena cad copiadas al dispositivo de salida estándar<br />

;Registros: CX (sólo para SacaCadena2)<br />

PROC SacaCadena<br />

call LargoCad ;Pone CX = largo de cadena<br />

PROC SacaCadena2 ;Punto alternativo de entrada<br />

@@10:<br />

push ax bx di ;Salva registros a usar<br />

mov bx,07 ;Handle para salida estándar<br />

mov al,[di] ;DS:DX apunta a dirección de cadena<br />

mov ah,0eh ;BIOS escribe a "teletipo"<br />

in 10h ;Llama a DOS (retorna con AX = bytes<br />

inc di<br />

loop @@10 ;escritos)<br />

pop di bx ax ;Repone registros<br />

ENDP SacaCadena2 ;Fin de rutina alternativa<br />

ENDP SacaCadena ;Fin de rutina normal<br />

;NuevaLinea EMPIEZA OTRA LÍNEA EN DISPOSITIVO ESTÁNDAR<br />

;<br />

;Entrada: Ninguna<br />

;Salida: Retorno de carro y nueva línea a la salida<br />

;Registros: AH y DL<br />

PROC NuevaLinea<br />

mov ah,2 ;Rutina de DOS para sacar un carácter<br />

mov dl,rc ;Pone retorno de carro en DL<br />

int 21h ;Manda y exhibe retorno de carro<br />

mov dl,nl ;Pone salta línea en DL<br />

int 21h ;Manda a nueva línea<br />

ENDP NuevaLinea<br />

END ;fin de módulo CADENAS.ASM<br />

El procedimiento SacaCadena llama a otro procedimiento para contar los caracteres de la<br />

cadena a exhibir, este procedimiento nos regresa en CX el número de caracteres a exhibir.<br />

Mediante la interrupción 10H servicio 0EH exhibimos letra por letra. La instrucción LOOP<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

1-4


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

regresa a @@10 hasta que el contador CX sea cero.<br />

Con el procedimiento NuevaLinea se exhibe en pantalla un retorno de carro con una<br />

nueva línea. Esto se logra mediante la interrupción 21H, servicio 2.<br />

3.2 Capturar el módulo anterior con el nombre CADENAS.ASM y crear el programa objeto<br />

mediante el siguiente comando.<br />

C>TASM /zi CADENAS<br />

3.3 Crear la biblioteca REM con el programa anterior mediante los comandos siguientes:<br />

C>TLIB /E REM -+CADENAS<br />

3.4 Procedimiento para contar caracteres no nulos en una cadena.<br />

%TITLE "RUTINAS PARA MANIPULAR CADENAS”<br />

IDEAL<br />

DOSSEG<br />

MODEL small<br />

CODESEG<br />

PUBLIC LargoCad<br />

; Hacer ES = DS antes de llamar a estas rutinas.<br />

ASCnulo EQU 0 ;ASCII para terminador<br />

;LargoCad CUENTA CARACTERES NO NULOS EN UNA CADENA<br />

;<br />

;Entrada: DI = dirección de la cadena<br />

;Salida: CX = número de caracteres no nulos en la cadena<br />

;Registros: CX<br />

PROC LargoCad<br />

ENDP LargoCad<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

push ax di ;Salva registros que usa<br />

xor al,a ;Carácter a buscar (nulo)<br />

mov cx,0ffffh ;Máximo 65,535 caracteres<br />

cld ;Auto incrementa DI<br />

repnz scasb ;Barre mientras [DI] 0 y CX0<br />

not cx ;Complemento a 1 de CX<br />

dec cx ;Menos 1, igual a largo de cadena<br />

pop di ax ;Repone registros<br />

ret<br />

END ;Fin de módulo MANCADE.ASM<br />

1-5


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

Hacemos el registro AL igual a cero (carácter nulo); en el registro CX colocamos el número<br />

máximo de caracteres. Borramos señalizador de dirección para auto incrementar los<br />

registros SI y DI. Con las instrucciones REPNZ SCASB barremos la cadena hasta encontrar<br />

el carácter nulo, mientras CX irá decrementando, posteriormente decrementamos CX en<br />

uno para que el carácter nulo no se exhiba en pantalla.<br />

3.5 Capturar el módulo con el nombre MANCADE.ASM y ensamblarlo mediante:<br />

C>TASM /zi MANCADE<br />

3.6 Poner en librería el módulo anterior con:<br />

C>TLIB /E REM -+MANCADE<br />

3.7 Procedimientos para verificar y retornar el valor de la tecla oprimida.<br />

%TITLE "RUTINA DE ENTRADA POR EL TECLADO"<br />

; EQUs<br />

IDEAL<br />

DOSSEG<br />

MODEL small<br />

rc EQU 13 ;ASCII del retorno de carro<br />

nl EQU 10 ;ASCII de nueva línea<br />

CODESEG<br />

PUBLIC EsperaTecla, TraeCar<br />

;EsperaTecla VERIFICA SI UNA TECLA HA SIDO OPRIMIDA<br />

;<br />

;Entrada: Ninguna<br />

;Salida: ZF = 0 si hay un carácter para ser leído<br />

; ZF = 1 en caso contrario<br />

;Registros: Sólo el de bandera<br />

PROC EsperaTecla<br />

push ax ;Salva el registro modificar<br />

mov ah,1 ;Función BIOS para verificar<br />

in 16h ;Invoca rutina del BIOS<br />

pop ax ;Repone registro<br />

ENDP EsperaTecla<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

1-6


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

;TraeCar RETORNA EL VALOR DE LA TECLA<br />

;<br />

;Entrada: Ninguna<br />

;Salida: ZF = 0 (y AH = 1): AL = carácter ASCII normal<br />

; ZF = 1 (y AH = 0): AL = carácter de control o función<br />

;Registros: AX<br />

PROC TraeCar<br />

xor ah,ah ;Función de BIOS para leer teclazo<br />

in 16h ;Llama al BIOS<br />

or al,al ;El código ASCII es 0 ?<br />

jnz @@10 ;no, brinca fue normal<br />

xchg ah,a ;Hace AH = 0 y AL = código barrido<br />

add al,32 ;Ajusta código a ≥32<br />

jmp short @@20 ;Brinca para salir<br />

@@10:<br />

xor ah,ah ;Inicia AH = 0<br />

cmp al,32 ;El código ASCII es 32 (p.e. Ctrl-A)?<br />

jb @@20 ;sí, brinca<br />

inc ah ;Pone AH = 1, caso normal<br />

@@20:<br />

or ah,ah ;Pone a "0" o "1" en ZF<br />

ret<br />

ENDP TraeCar<br />

END ;Fin del módulo TECLADO.ASM<br />

Con la interrupción 16H, servicio 1, obtenemos el código ASCII de la tecla oprimida, en caso<br />

de no digitar tecla la bandera de 0 se pone a 1.<br />

En el procedimiento TraeCar utilizamos el servicio 0 de la interrupción 16H para obtener en<br />

AX el código de barrido de la tecla oprimida.<br />

3.8 Capturar el módulo anterior con el nombre TECLADO.ASM y ensamblarlo:<br />

C>TASM /zi TECLADO<br />

3.9 Guardarlo en la librería con el comando siguiente:<br />

C>TLIB /E REM -+TECLADO<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

1-7


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

3.10 Procedimientos para conversiones.<br />

%TITLE "RUTINAS DE CONVERSIÓN DE BINARIO A ASCII Y VICEVERSA"<br />

; EQUs<br />

IDEAL<br />

DOSSEG<br />

MODEL small<br />

ASCnulo EQU 0 ;ASCII de carácter nulo<br />

%NEWPAG<br />

CODESEG<br />

PUBLIC DigitoHex, NumAsc, BinAscDec<br />

;DigitoHex CONVIERTE VALOR DE 4 BITS A DÍGITO HEXADECIMAL ASCII<br />

;<br />

;Entrada: DL = valor binario (nibble alto = 0)<br />

;Salida: DL = ASCII del dígito hexadecimal equivalente)<br />

;Registros: DL<br />

PROC DigitoHex<br />

@@5:<br />

cmp dl,10 ;DL < 10 (es decir hex 'A')?<br />

jb @@5 ;Sí, brinca<br />

add dl, 'A'-10 ;No, convertir A, B, C, D, E o F<br />

ret<br />

add dl,'0' ;Convierte a dígitos 0 a 9<br />

ret ;Retorna<br />

ENDP DigitoHex<br />

;NumAscr CONVIERTE BINARIO NO SIGNADO A ASCII<br />

;<br />

;Entrada: AX = valor de 16 bits a convertir<br />

; BX = base del resultado (2 = binario, 10 = decimal, 16 = hexadecimal)<br />

; CX = número mínimo de dígitos de salida<br />

; DI = dirección de cadena para resultados<br />

; Si CX = 0 y AX = 0, largo de la cadena es cero<br />

; Si CX = 1 y AX = 0, la cadena tendrá ‘0’<br />

;Salida: Ninguna<br />

;Registros: AX, CX<br />

PROC NumAsc<br />

push dx ;Entrada normal<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

1-8


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

push di ;Salva registros<br />

push si<br />

; SI controla los dígitos guardados en la pila<br />

@@10:<br />

@@20:<br />

@@30:<br />

@@40:<br />

xor si,si ;Contador de dígitos a cero<br />

jcxz @@20 ;Si CX = 0 brinca a ponerlo a 1<br />

xor dx,dx ;Extiende AX a 32 bits<br />

div bx ;AX = DX. AX/BX, DX = residuo<br />

call DigitoHex ;Convierte DL a dígito hexadecimal<br />

push dx ;Salva dígito en la pila<br />

inc si ;Cuenta dígitos salvados<br />

loop @@10<br />

inc cx ;Pone CX = 1 por si no se hizo<br />

or ax,ax ;AX = 0? (todos los dígitos)<br />

jnz @@10 ;Si AX > 0 continua la conversión<br />

mov cx,s ;CX = contador de caracteres en pila<br />

jcxz @@40 ;Omite sgte bucle si CX=0000<br />

cld ;Autoincrementa DI en STOSB<br />

pop ax ;Trae siguiente dígito en AL<br />

stosb ;Pone dígito en cadena y avanza DI<br />

loop @@30 ;Repite el bucle<br />

mov [byte di],ASCnulo ;Pone cero al fin de cadena<br />

pop si di dx ;Repone registros<br />

ret ;Regresa<br />

ENDP NumAsc<br />

;BinAscDec CONVIERTE VALOR BINARIO A CADENA ASCII DECIMAL<br />

;<br />

;Entrada: Misma que BinAscHex<br />

;Salida: Ninguna<br />

;Registros: AX, CX (indirectamente)<br />

PROC BinAscDec<br />

push bx ;Salva BX en la pila<br />

mov bx,10 ;Base para conversión<br />

call NumAsc ;Pasa a ASCII<br />

pop bx ;Repone BX<br />

ret ;Regresa a programa fuente<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

1-9


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

ENDP BinAscDec<br />

END ; fin de módulo BINASC.ASM<br />

El procedimiento BinAscDec coloca en BX la base de conversión y llama a la subrutina<br />

para hacer la conversión.<br />

El procedimiento NumAsc se encarga de hacer la conversión binaria a decimal.<br />

El contador de dígitos salvados será SI, inicializamos este registro a cero, verificamos que<br />

el registro CX tenga el valor de uno. Limpiamos el registro DX, hacemos la división AX/BX.<br />

En el registro AL se deposita el cociente y en el registro DX el residuo, llamamos al<br />

procedimiento DigitoHex, el cual nos compara el registro DL con el valor 10, si este valor<br />

es menor le añadimos al registro DL 30 (en hexadecimal) para convertirlo en un carácter<br />

numérico ASCII y poder visualizarlo en pantalla, regresamos al procedimiento NumAsc y<br />

salvamos el dígito en la pila, incrementamos registro SI. Con la instrucción LOOP @@10 se<br />

decrementa CX haciéndose cero, incrementamos otra vez CX, verificamos que el registro<br />

AX sea mayor que cero para continuar la conversión.<br />

Cuando el registro AX sea cero movemos lo que hay en el registro SI al contador CX,<br />

borramos la bandera de dirección para autoincrementar registro DI con la instrucción<br />

STOSB salvando dígito por dígito en el registro DI y al final introducimos el carácter nulo.<br />

3.11 Capturar y ensamblar los módulos anteriores con el nombre BINASC.ASM<br />

C>TASM /zi BINASC<br />

3.12 Introducir a la librería los módulos anteriores:<br />

C>TLIB /E REM -+BINASC<br />

3.13 Verificar que los procedimientos anteriores se encuentren en la librería REM mediante el<br />

siguiente comando:<br />

C>TLIB REM,CON<br />

3.14 Capturar el programa fuente. Este programa despliega un saludo y exhibe el valor<br />

decimal de la tecla oprimida.<br />

%TITLE "EXHIBE VALOR DE LAS TECLAS"<br />

; EQUs<br />

IDEAL<br />

DOSSEG<br />

MODEL small<br />

STACK 256<br />

rc EQU 13 ;ASCII del retorno de carro<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

1-10


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

nl EQU 10 ;ASCII de nueva línea<br />

DATASEG<br />

ClaveFin DB 0<br />

TeclaNor DB rc,nl," Tecla tipo normal (DEC) : ",0<br />

TeclaFun DB rc,nl," Tecla de función (DEC) : ",0<br />

CadenaNum DB 7 dup (0)<br />

saludo DB rc,nl,"Exhibe valores de las teclas"<br />

DB rc,nl,"Presionar cualquier tecla, o ESC para salir"<br />

DB rc,nl,nl,0<br />

CODESEG<br />

; De BINASC.OBJ<br />

EXTRN BinAscDec:proc<br />

; De CADENAS.OBJ<br />

EXTRN SacaCadena:proc, NuevaLinea:proc<br />

; De TECLADO.OBJ<br />

Inicia:<br />

Repite:<br />

@@10:<br />

EXTRN EsperaTecla:proc, TraeCar:proc<br />

mov ax,@data ;Inicializa DS con<br />

mov ds,ax ;segmento de datos<br />

mov es,ax ;Hace ES = DS<br />

mov di, offset saludo ;Exhibe mensaje de bienvenida<br />

call SacaCadena ;en pantalla<br />

call EsperaTecla ;Espera cualquier teclazo,<br />

jz Repite ;no se oprimió regresa<br />

call TraeCar ;Lee la tecla oprimida<br />

mov di,offset TeclaNor ;Carga sesgo de cadena normal<br />

jnz @@10 ;Brincar si carácter normal<br />

cmp al,27 ;Fue tecla ESCape (1Bh)?<br />

je Salir ;Sí, brinca a la salida<br />

mov di,offset TeclaFun ;Carga sesgo de cadena función<br />

call SacaCadena ;Exhibe tipo de cadena<br />

sub ah,ah ;Convierte AL a valor de 16 bits<br />

mov cx,1<br />

mov di,offset CadenaNum ;Apunta a cadena numérica<br />

call BinAscDec ;Convierte número a cadena<br />

call SacaCadena ;y exhíbelo<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

1-11


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

Salir:<br />

call NuevaLinea ;Exhibe línea en pantalla<br />

jmp Repite ;Procesa otra tecla<br />

mov ah,04ch ;Función DOS: Termina programa<br />

mov al,[ClaveFin] ;Regresa código de salida<br />

int 21h<br />

END inicia ;Fin de módulo TECLAS.ASM<br />

3.15 Ensamblar y crear el programa ejecutable mediante los comandos:<br />

C>TASM /zi TECLAS<br />

C>TLINK /v TECLAS,,,REM<br />

Si no se tiene el archivo TLINK, se puede teclear:<br />

C>LINK TECLAS,,,REM<br />

3.16 Ejecutar el programa con el comando.<br />

C>TECLAS<br />

3.17 Este programa se puede depurar con Turbo Debugger mediante el siguiente comando:<br />

C>TD TECLAS.EXE<br />

3.18 Ir a la ventana VIEW, en la opción CPU oprimir enter, hacer más chica la ventana con el<br />

ratón. Con F8 correr un procedimiento, con F7 va paso a paso y con F9 correr el programa.<br />

Analizar la conversión de binario a ASCII decimal, en especial.<br />

4. TAREAS<br />

4.1 Colocar en un cuadro los mensajes.<br />

4.2 Obtener el código ASCII de la tecla oprimida y visualizarlo en pantalla en<br />

hexadecimal. Hacer esto mediante el procedimiento BinAscHex y capturarlo en el<br />

módulo BINASC.ASM.<br />

4.3 Hacer un programa que exhiba en pantalla el juego completo de caracteres ASCII<br />

de IBM (ver página 16).<br />

4.4 Mediante un procedimiento CONFIRMA exhibir un letrero con opción de salida<br />

cuando se oprima la tecla ESC. Guardar el procedimiento en TECLADO.ASM.<br />

4.5 Crear un procedimiento llamado BORRAPAN para borrar la pantalla, guardarlo en<br />

el módulo CADENAS.ASM. Llamar a este procedimiento al salir del programa<br />

TECLAS.<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

1-12


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

NOTA: Cuando se hagan modificaciones en un programa hay que ensamblarlo, meterlo a la librería o<br />

crear el ejecutable, según sea el caso.<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

CÓDIGO QUE DEBE REPORTAR EL PROGRAMA<br />

TECLA SOLA + MAYÚS + CTRL + ATL + ALTG<br />

F1<br />

F2<br />

:<br />

F9<br />

F10<br />

Ins<br />

Del<br />

Home<br />

RePag<br />

AvPag<br />

↑<br />

↓<br />

←<br />

→<br />

Fin<br />

Esc<br />

A<br />

B<br />

C<br />

D<br />

E<br />

F<br />

G<br />

H<br />

I<br />

J<br />

K<br />

L<br />

M<br />

N<br />

O<br />

P<br />

Q<br />

R<br />

S<br />

T<br />

U<br />

V<br />

W<br />

Z<br />

Y<br />

Z<br />

0<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

8<br />

9<br />

]<br />

[<br />

ENTER<br />

<<br />

ESPACIO<br />

TAB<br />

RETROCESO<br />

91<br />

92<br />

:<br />

99<br />

100<br />

114<br />

115<br />

103<br />

105<br />

113<br />

104<br />

112<br />

107<br />

109<br />

111<br />

27<br />

97<br />

98<br />

99<br />

100<br />

101<br />

102<br />

103<br />

104<br />

105<br />

106<br />

107<br />

108<br />

109<br />

110<br />

111<br />

112<br />

113<br />

114<br />

115<br />

116<br />

117<br />

118<br />

119<br />

120<br />

121<br />

122<br />

48<br />

49<br />

50<br />

51<br />

52<br />

53<br />

54<br />

55<br />

56<br />

57<br />

93<br />

45<br />

13<br />

60<br />

32<br />

9<br />

8<br />

116<br />

117<br />

:<br />

124<br />

125<br />

(114)<br />

(115)<br />

(103)<br />

(105)<br />

(113)<br />

(104)<br />

(112)<br />

(107)<br />

(109)<br />

(111)<br />

(27)<br />

65<br />

66<br />

67<br />

68<br />

69<br />

70<br />

71<br />

72<br />

73<br />

74<br />

75<br />

76<br />

77<br />

78<br />

79<br />

80<br />

81<br />

82<br />

83<br />

84<br />

85<br />

86<br />

87<br />

88<br />

89<br />

90<br />

41<br />

33 ¡<br />

64 “<br />

35 .<br />

36 $<br />

37 %<br />

94 &<br />

38 /<br />

42 (<br />

40 )<br />

125<br />

95<br />

126<br />

127<br />

:<br />

134<br />

135<br />

-<br />

-<br />

151<br />

164<br />

150<br />

-<br />

-<br />

147<br />

148<br />

149<br />

(27)<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

8<br />

9<br />

10<br />

11<br />

12<br />

13<br />

14<br />

15<br />

16<br />

17<br />

18<br />

19<br />

20<br />

21<br />

22<br />

23<br />

24<br />

25<br />

26<br />

-<br />

-<br />

-<br />

-<br />

-<br />

-<br />

-<br />

-<br />

-<br />

-<br />

29<br />

31<br />

136<br />

137<br />

:<br />

144<br />

145<br />

-<br />

-<br />

-<br />

-<br />

-<br />

-<br />

-<br />

-<br />

-<br />

-<br />

-<br />

62<br />

80<br />

78<br />

64<br />

50<br />

65<br />

66<br />

67<br />

55<br />

68<br />

69<br />

70<br />

82<br />

81<br />

56<br />

57<br />

48<br />

51<br />

63<br />

52<br />

54<br />

79<br />

49<br />

77<br />

53<br />

76<br />

161<br />

152<br />

153<br />

154<br />

155<br />

156<br />

157<br />

158<br />

159<br />

160<br />

-<br />

162<br />

124 ⏐<br />

64 @<br />

35 #<br />

170 ¬<br />

1-13


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

EJEMPLO DE CORRIDA<br />

Se corrió el programa TECLAS, para cotejar la tabla, dando las siguientes teclas:<br />

a, A, F1, FIN, INS, 8, ↑, ALT-U, #, @, +, CTRL-G, ñ, ), ?, teclas<br />

Exhibe valores de las teclas. Presionar cualquier tecla, o ESC para salir<br />

Tecla tipo normal: 97<br />

Tecla tipo normal: 65<br />

Tecla de función: 91<br />

Tecla de función: 111<br />

Tecla de función: 114<br />

Tecla tipo normal: 56<br />

Tecla de función: 104<br />

Tecla de función: 54<br />

Tecla tipo normal: 35<br />

Tecla tipo normal: 64<br />

Tecla tipo normal: 43<br />

Tecla de función: 7<br />

Tecla tipo normal: 164<br />

Tecla tipo normal: 41<br />

Tecla tipo normal: 63<br />

Tecla tipo normal: 60<br />

Tecla tipo normal: 32<br />

Tecla de función: 13<br />

Tecla de función: 9<br />

Tecla de función: 8<br />

Tecla de función: 10<br />

Tecla de función: 151<br />

Tecla de función: 149<br />

Tecla de función: 152<br />

Tecla de función: 153<br />

Tecla de función: 13<br />

Tecla de función: 8<br />

Tecla de función: 161<br />

Tecla tipo normal: 46<br />

Tecla tipo normal: 44<br />

Tecla tipo normal: 45<br />

Tecla de función: 115<br />

Tecla tipo normal: 38<br />

C:\SEM386><br />

1-14


LENGUAJE ENSAMBLADOR 80386 <strong>PRÁCTICA</strong> 1<br />

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES<br />

EDICIÓN: PROFESOR PABLO FUENTES RAMOS<br />

JUEGO DE CARACTERES ASCII DE IBM<br />

H 0 1 2 3 4 5 6 7 8 9 A B C D E F<br />

0 ☺ ☻ ♥ ♦ ♣ ♠ ● ◘ ○ ◙ ♂ ♀ ♪ ♫ ☼<br />

1 ► ◄ ↕ !! § ▬ ↨ ↑ ↓ → ← ⌐ ↔ ▲ ▼<br />

2 ! " # $ % & ' ( ) * + , - . /<br />

3 0 1 2 3 4 5 6 7 8 9 : ; < = > ?<br />

4 @ A B C D E F G H I J K L M N O<br />

5 P Q R S T U V W X Y Z [ \ ] ^ _<br />

6 ` a b c d e f g h i j k l m n o<br />

7 p q r s t u v w x y z { | } ~ ⌂<br />

8 Ç ü é â ä à å ç ê ë è ï î ì Ä Å<br />

9 É ǽ Ǽ ô ö ò û ù ij Ö Ü Φ £ Ф ƒ<br />

A á í ó ú ñ Ñ ª º ¿ ® ¬ ½ ¼ ¡ « »<br />

B ░ ± ▓ │ ┤ Á Â À © ╣ ║ ╗ ` ¢ ¥ ┐<br />

C └ ┴ ┬ ├ ─ ┼ ã ¤ ╚ ╔ ╩ ╦ ╠ ═ ╬ ¤<br />

D ŏ Đ Ê Ë È ¹ Í Î Ï ┘ ┌ █ ▄ │ Ì ▀<br />

E Ó ß ô ò õ Ô μ þ þ Ú Û Ù ý Ý ¨ ´<br />

F - ± = ¾ § ÷ ¸ º ¨ . ¹ ³ ² ■<br />

1-15


Nombre de archivo: practica 1 ensamblador 80386<br />

Directorio: C:\Computacion V\practicas 80386<br />

Plantilla: C:\WINDOWS\Application<br />

Data\Microsoft\Plantillas\Normal.dot<br />

Título: <strong>PRÁCTICA</strong> 1<br />

Asunto: Prácticas de laboratorio de Computación V<br />

Autor: M. en C. Salvador Saucedo Flores<br />

Palabras clave:<br />

Comentarios:<br />

Fecha de creación: 29/07/02 12:20 P.M.<br />

Cambio número: 13<br />

Guardado el: 31/07/02 10:33 A.M.<br />

Guardado por: Pablo Fuentes Ramos<br />

Tiempo de edición: 392 minutos<br />

Impreso el: 31/07/02 10:33 A.M.<br />

Última impresión completa<br />

Número de páginas: 15<br />

Número de palabras: 2,283 (aprox.)<br />

Número de caracteres: 13,016 (aprox.)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!