practica 8 ensamblador 80386 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/computacion5/practicas...

24
LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8 AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS 8-1 PRÁCTICA 8 1. INTRODUCCIÓN Esta práctica está enfocada a la comunicación serial de un PC, interceptando la interrupción de uno de los puertos 2 OBJETIVOS 2.1 El alumno aprenderá a crear rutinas que permitan interceptar una interrupción de hardware del sistema. 2.2 Aprenderá a manipular el almacenamiento circular, es decir, de áreas que están definidas por un apuntador de cola y otro de la cabeza. 2.3 Aprenderá a crear y ensamblar un programa que permita usar la PC como una herramienta de diagnóstico para comunicaciones de tipo serie. 2.4 Se ilustra en ensamblado condicional del ensamblador. 3 DESARROLLO 3.1 Capturar y ensamblar el siguiente módulo con el nombre ASINC.ASM. %TITLE MÓDULO DE COMUNICACIÓN SERIAL ASÍNCRONAIDEAL DOSSEG MODEL small PUBLIC Puerto,Cola Puerto = 1 ;0 = COM1:, 1 = COM2: IF Puerto EQ 0 DirPuerto EQU 03F8H ;Dirección base del UART 8250 VectorNo EQU 0CH ;Número del vector de interrupción COMUNICACIÓN SERIAL DE UNA PC

Upload: duongtuong

Post on 26-Sep-2018

245 views

Category:

Documents


2 download

TRANSCRIPT

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-1

PRÁCTICA 8 1. INTRODUCCIÓN Esta práctica está enfocada a la comunicación serial de un PC, interceptando la interrupción de uno de los puertos 2 OBJETIVOS

2.1 El alumno aprenderá a crear rutinas que permitan interceptar una interrupción de hardware del sistema.

2.2 Aprenderá a manipular el almacenamiento circular, es decir, de áreas que están definidas por un apuntador de cola y otro de la cabeza.

2.3 Aprenderá a crear y ensamblar un programa que permita usar la PC como una herramienta de diagnóstico para comunicaciones de tipo serie.

2.4 Se ilustra en ensamblado condicional del ensamblador. 3 DESARROLLO 3.1 Capturar y ensamblar el siguiente módulo con el nombre ASINC.ASM.

%TITLE “MÓDULO DE COMUNICACIÓN SERIAL ASÍNCRONA”

IDEAL DOSSEG MODEL small PUBLIC Puerto,Cola

Puerto = 1 ;0 = COM1:, 1 = COM2: IF Puerto EQ 0

DirPuerto EQU 03F8H ;Dirección base del UART 8250 VectorNo EQU 0CH ;Número del vector de interrupción

COMUNICACIÓN SERIAL DE UNA PC

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-2

HabilitaIRQ EQU 0EFH ;Máscara para habilitar IRQ4 en el 8259 ImpideIRQ EQU 10H ;Máscara para deshabilitar IRQ4

ELSEIF Puerto EQ 1

DirPuerto EQU 02F8H ;Dirección base del UART VectorNo EQU 0BH ;Número del vector de interrupción HabilitaIRQ EQU 0F7H ;Máscara para habilitar IRQ3 en el 8259 ImpideIRQ EQU 08H ;Máscara para deshabilitar IRQ3

ELSE DISPLAY “Puerto debe ser 0 o 1” ERR ENDIF ; Direcciones de los registros de la tarjeta de comunicación serie RegistroTx = DirPuerto + 0 ;Registro de transmisión RegistroRx = DirPuerto + 0 ;Registro de recepción HabilitaInt = DirPuerto + 1 ;Registro para habilitar interrupciones IdentInt = DirPuerto + 2 ;Identificación de la interrupción ControlLinea = DirPuerto + 3 ;Registro de control de línea ControlModem= DirPuerto + 4 ;Registro de control del modem EdoLinea = DirPuerto + 5 ;Registro del estado de la línea EdoModem = DirPuerto + 6 ;Registro del estado del modem ; Otros EQU EOI EQU 020h ; Cmndo fin de Interrupción C8259_0 EQU 020h ;Dirección del 8259 C8259_1 EQU 021h ;Comando fin de interrupciones para el PIC TamBuff EQU 2048 ;Tamaño del buffer de entrada

DATASEG SegVector DW ? ;Segmento del vector anterior SesVector DW ? ;Sesgo (offset) de vector anterior Cabeza DW ? ;Apuntador a la cabeza del buffer Cola DW ? ;Apuntador a la cola del buffer Buffer DB TamBuff DUP (?) ;Buffer de entrada

CODESEG PUBLIC IniciaAsinc, FinAsinc, EsoAsinc PUBLIC SaleAsinc, LeeAsinc, EdoLeeAsinc

%NEWPAGE

;VaciaBuffer VACÍA EL BUFFER DE ENTRADA ; ; NOTA: Privado del módulo ;Entrada: Ninguna ;Salida: Ninguna ;Registros: Ninguno

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-3

PROC VaciaBuffer

cli ;Impide las interrupciones push ax ;Salva AX mov ax,offset Buffer ;El buffer está vacío si cabeza es mov [Cabeza],ax ;igual a Cola mov [Cola],ax pop ax ;Recupera AX sti ;Habilita interrupciones ret

ENDP VaciaBuffer %NEWPAGE PROC IniciaAsinc

call VaciaBuffer ;Inicializa el buffer

; Salva y redefine el vector de interrupción

push ds ;Salva registros de segmento push es mov ax,3500h + VectorNo ;Trae dirección del vector int 21h ;llama a DOS mov [SegVector],es ;Salvas segmento del vector mov [SesVector],bx ;Salva sesgo del vector push cs ;Dirección de la rutina de servicio pop ds ;En DS:DX mov dx,offset ServIRQ ;Para usar función 25H mov ax,2500h + VectorNo int 21h pop es ;Restaura registros pop ds

; habilita interrupción (IRQ) del 8259 para el adaptador

in al,C8259_1 ;Trae máscara de permiso del 8259 and al,HabilitaIRQ ;Limpia bit de la máscara out C8259_1,al ;Modifica máscara

; Permite que el 8250 interrumpa al recibir un dato

mov dx,ControlLinea ;Apunta al registro de control in al,dx ;de línea, para limpiar el bit

;IniciaAsinc ; ;Entrada: Ninguna ;Salida: Ninguna ;Registros: AX, BX, DX ; NOTA: Invocar a FinAsinc antes de que termine el programa

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-4

and al,07fh ;7 (DLAB) out dx,al ;lo que permite poner mov dx,HabilitaInt ;a “1” el bit de habilitar mov al,1 ;interrupción (bit 0) out dx,al ;del registro de interrupciones

; Limpia el estado del 8250 y los registros de datos Inic5:

mov dx RegistroRx ;Limpia registro de datos in al,dx ;al leerlo mov dx,EdoLinea ;Limpia estado de la línea, in al,dx ;leyéndola mov dx,EdoModem ;Limpia estado del modem, in al,dx ;leyendo dicho puerto mov dx,IdenInt ;Verifica el registro de in al,dx ;identificación de interrupción test al,1 ;bit 0 debe ser “1” jz Inic5 ;Brinca si hay interrupción pendiente

; Pone bit 3 del registro de control del modem

mov dx,ControlModem ;Las interrupciones deben in al,dx ;ser atendidas tan pronto or al,08h ;que siguiente bit se ponga en “1” and al,0efh ;Borra loopback out dx,al ;¡ya!

; Vaciar el buffer de entrada, por precaución

call VaciaBuffer ret

ENDP IniciaAsinc PROC FinAsinc ; Enmascara (deshabilita) IRQ en el PIC

in al,C8259_1 ;Lee máscaras or al,ImpideIRQ ;Enmascara bit IRQ out C8259_1,al ;reescribe máscaras

; Deshabilita interrupción en el 8250

;FinAsinc DESINSTALA RUTINA DE SERVICIO IRQ ; ;Entrada: Ninguna ;Salida: Ninguna ;Registros: AL, DX ; NOTA: Obligatorio su uso antes de terminar el programa

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-5

mov dx,ControlLinea ;Empieza leyendo el registro in al,dx ;de control de línea y limpia and al,07fh ;bit 7 (bit de acceso al divisor) out dx,al ;cuando DLAB = “0” mov dx,HabilitaInc ;Limpia todos los bits para mov al,0 ;deshabilitar todo tipo de interrupción out dx,al ;Reescribe dicho registro

; Pone a “0” el bit 3 del control del modem

mov dx,ControlModem ;Asigna dirección del puerto in al,dx ;Lee tal registro and al,0f7h ;Limpia bit 3 out dx,al ;Saca nuevo valor

; Las interrupciones ya están deshabilitadas. Recuperar vector

push ds ;Salva registro de segmento mov ax,2500h+VectorNo ;pone el vector anterior mov dx,[SesVector] ;Trae sesgo anterior mov ds,[SesVector] ;Trae segmento anterior int 21h ;Repone vector pop ds ret

ENDP FinAsinc %NEWPAGE PROC EdoAsinc

mov ah,3 ;Número de función para traer estado mov dx,Puerto ;de un puerto serie int 14h ;llama al BIOS ret

ENDP EdoAsinc PROC SaleAsinc

;EdoAsinc OBTIENE EL ESTADO DE LA SALIDA ; ;Entrada: Ninguna ;Salida: AH = estado de la línea ; AL = estado del modem ;Registros: AX, DX

;SaleAsinc ENVÍA UN BYTE AL PUERTO DE SALIDA (TRANSMITE) ; ;Entrada: AL = carácter (byte) a enviar ;Salida: Ninguna ;Registros: Ninguno

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-6

push dx ;Va a usar DX, lo salva push ax ;Salva el carácter

@@10:

mov dx,EdoLinea ;Apunta al registro de control in al,dx ;y lo lee and al,020h ;Aísla bit de transmisión lleno jz @@10 ;Brinca si THRE está en “0” pop ax ;Recupera carácter mov dx,RegistroTx ;Apunta a registro de transmisión out dx,al ;Envía byte en AL pop dx ret

ENDP SaleAsinc PROC LeeAsinc

xor al,al ;Por si está vacío el buffer mov bx,[Cola] ;Trae apuntador al final del buffer cmp bx,[Cabeza] ;Prueba si el buffer está vacío je @@99 ;Sale si está vacío (AL = 0) mov al,[byte ptr bx] ;Si no, trae carácter del buffer inc [Cola] ;Avanza apuntador de la cola cmp [Cola],offset buffer+TamBuff ;¿En el extremo? Jb @@99 ;Brinca si no Mov [Cola],offset buffer ;Si sí, reinicia apuntador de cola

@@99:

ret

ENDP LeeAsinc %NEWPAGE PROC EdoLeeAsinc

;LeeAsinc TOMA UN BYTE DEL BUFFER DE MEMORIA ; ;Entrada: Ninguna ;Salida: AL = carácter del buffer: si AL = 0 el buffer está vacío ;Registros: AL, BX

;EdoLeeAsinc OBTIENE ESTADO DEL BUFFER DE ENTRADA ; ;Entrada: Ninguna ;Salida: DX = número de bytes (caracteres) en el buffer ;Registros: Ninguno

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-7

mov dx,[Cabeza] ;Trae apuntador de cabeza del buffer sub dx,[Cola] ;Resta cola de cabeza jge @@99 ;Brinca si el resultado no negativo add dx,TamBuff ;Ajusta el resultado negativo

@@99:

ret

ENDP EdoLeeAsinc PROC ServIRQ

push ax bx ds dx ;Salva todo registro usado mov ax,@@data ;Apunta a los datos locales mov ds,ax mov dx,RegistroRx ;DX = dirección registro de recepción in al,dx ;Lee byte en el puerto mov bx,[Cabeza] ;Trae apuntador de cabeza mov [byte ptr bx],al ;Salva carácter en el buffer inc bx ;Avanza apuntador de cabeza cmp bx,offset Buffer+TamBuff ;Llegó al extremo jne @@10 mov bx,offset Buffer ;Si sí, reinicia la cabeza

@@10:

cmp bx,[Cola] ;Verifica si hay derrame jne @@20 ;Brinca si no mov bx,[Cabeza] ;caso contrario, cancela avance

@@20:

mov [Cabeza],bx ;Salva nuevo apuntador de cabeza mov al,EOI ;Envía comando fin de interrupción out C8259_0,al ;Al controlador de interrupciones pop dx ds bx ax ;Repone registros iret

ENDP ServIRQ

END ;Fin del módulo ASINC.ASM

3.2 Capturar programa y salvarlo como TRM.ASM. Ensamblarlo y hacerlo ejecutable mediante:

;ServIRQ RUTINA DE SERVICIO A LA INTERRUPCIÓN ASÍNCRONA ; ;Entrada: Ninguna ;Salida: Ninguna (El carácter recibido es puesto en buffer de entrada) ;Registros: DX

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-8

C:\SEM386>tasm /zi trm C:\SEM386>tlink /v trm,,,rem

%TITLE “EMULACIÓN DE TERMINAL CON DEPURACIÓN PARA CÓDIGOS DE CONTROL”

IDEAL DOSSEG MODEL small STACK 1024

; De ASINC.OBJ

EXTRN Puerto:abs

rc EQU 13 ;ASCII del retorno de carro nl EQU 10 ;ASCII de nueva línea bd2400 EQU 0A3H ;2400 baud, sin paridad, 1 bit paro, 8 bits TeclaFin EQU 100 ;Código de tecla F10

DATASEG

ClaveFin DB 0 saludo DB rc,nl,”Emulador de terminales con depuración”,rc,nl DB rc,nl,”Configurada para 2400 bauds. Exhibe “ DB rc,nl,”códigos de control en paréntesis para” DB rc,nl,”diagnosticar un puerto serial RS-232” DB rc,nl,”Oprimir F10 para terminar”,rc,nl,nl,0 Cadena DB 80 DUP (0) ;Cadena para diversos usos

CODESEG

; De ASINC.OBJ

EXTRN IniciaAsinc:proc,FinAsinc:proc,EdoAsinc:proc EXTRN SaleAsinc:proc,LeeAsinc:proc,EdoLeeAsinc:proc

; De TECLADO.OBJ

EXTRN EsperaTecla:proc,TraeCar:proc

; De BINASC.OBJ EXTRN BinAscDec:proc

; De CADENAS.OBJ

EXTRN SacaCadena:proc

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-9

Inicia:

mov ax,@data ;Inicializa DS para apuntar al mov ds,ax ;segmento de datos mov es,ax ;Hace ES = DS mov di,offset saludo ;Exhibe bienvenida con explicación call SacaCadena

; Inicializa el baud rate y el resto del puerto asíncrono

mov ah,0 ;Función del BIOS para iniciar puerto mov al,bd2400 ;Trae byte de configuración mov dx,Puerto ;Número de puerto (0 o 1) int 14h ;Servicio par RS-232 call IniciaAsinc ;Inicializa el módulo asíncrono

; Realiza la emulación de una terminal Emula:

call EdoLeeAsinc ;¿Llegó algo al puerto? Or dx,dx ;Verifica si DX>0 Jz Emu5 Call LeeAsinc ;Lee carácter del buffer de recepción Call SacaCar ;Eco local del carácter recibido Jmp Emula

Emu5:

call EsperaTecla ;Verifica si se presionó una tecla jz Emula ;Brinca si no call TraeCar ;Trae carácter de la tecla jnz Emu10 ;Brinca si tecla normal cmp al,TeclaFin ;¿Se oprimió tecla al terminar? Je Salir

Emu10:

push ax call SacaCar pop ax call SaleAsinc ;Manda byte al puerto jmp Emula

; Fin de emulación. Repone módulo asíncrono y regresa a DOS Salir:

call FinAsinc ;Detiene el módulo asíncrono mov ah,04ch ;Función de DOS: Termina el programa mov al,[ClaveFin] ;Regresa código de salida int 21h

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-10

%NEWPAGE PROC SacaCar

cmp al,20h ;¿Es un carácter de control? jc Control ;si, brinca

PROC UnCar

mov dl,sl ;Pone carácter en DL mov ah,2 ;Función de DOS para exhibir carácter int 21h ;Llamado a DOS ret

ENDP UnCar ; Exhibe códigos de control Control:

sub ah,ah ;Convierte AL a un valor de 16 bits mov cx,1 ;Especifica al menos un carácter mov di,offset cadena ;Direcciona la cadena call BinAscDec ;Convierte a decimal en ASCII mov al,’<’ ;Saca < call UnCar ;Exhibe byte en AL call SacaCadena ;Exhibe cadena de códigos de control mov al,’>’ ;Pone > jmp short UnCar

ENDP SacaCar

END Inicia

3.3 Ejecutar el programa TRM en dos máquinas interconectadas por el puerto serie y observar cómo cualquier carácter normal tecleado en una de ellas, se observa en la otra y ver si los caracteres de control se exhiben en la otra PC.

A continuación se ofrecen los datos para conectores de 9 y 25 terminales para los puertos RC-232-C.

;SacaCar,UnCar EXHIBE UN VALOR ASCII ; ;Entrada: AL = valor ASCII (0…255) ;Salida: Ninguna. Exhibe códigos de control como <23>, <10>, etc. ;Registros: AX, CX, DL, DI

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-11

CONECTOR MACHO DEL PUERTO SERIE DE 9 TERMINALES DE LA PC-AT

Núm. de terminal Descripción Señal Dirección

1 Detección de portadora CD 2 Recepción del dato RD Entrada 3 Transmisión del dato TD Salida 4 Terminal lista DTR Salida 5 Tierra de señal SG 6 Datos listos DSR Entrada 7 Petición de envío RTS Salida 8 Activar envío CTS Entrada 9 Indicador de llamada RI Entrada

CONECTOR MACHO DEL PUERTO SERIE DE 25 TERMINALES DE LA PC-XT

Núm. de terminal Descripción Señal Dirección

8 Detección de portadora DCD Entrada 3 Recepción del dato RD Entrada 2 Transmisión del dato TD Salida

20 Terminal lista DTR Salida 7 Tierra de señal SG 6 Datos listos DSR Entrada 4 Petición de envío RTS Salida 5 Activar envío CTS Entrada

22 Indicador RI Entrada 1 Tierra de chasiss Tierra Física

CONEXIONES SUGERIDAS

PC1

TD

RD

RTS

CTS

DSR

DTR

SG

PC2

RD

TD

CTS

RTS

DTR

DSR

SG

PC1

TD

RD

RTS

CTS

DSR

DTR

SG

RETROLAZO

TD

RD

RTS

CTS

DSR

DTR

DSD

PC2

RD

TD

CTS

RTS

DTR

DSR

SG

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-12

CONECTOR DEL PUERTO SERIE DE 25 TERMINALES DE INTERFAZ DCE (MODEM)

Núm. de terminal Descripción Señal Dirección

8 Detección de portadora DCD Salida 3 Recepción del dato RxD (BB) Salida 2 Transmisión del dato TxD (BA) Entrada

20 Terminal lista DTR Entrada 7 Tierra de señal SG Retorno 6 Datos listos DSR Salida 4 Petición de envío RTS Entrada 5 Activar envío CTS Salida

22 Indicador de llamada RI Salida 1 Tierra de Chasiss Tierra Física

4. TAREAS

4.1 Agregar al módulo TRM.ASM lo necesario para que procese los caracteres correspondientes al beep, al retroceso de carro y al salto de línea, de tal manera de emular parcialmente una terminal tonta.

4.2 Modificar TRM.ASM para exhibir continuamente la fecha en el formato:

14 de agosto de 1994 Y la hora en el formato: 17:23:57 NOTA: Usar sólo funciones del BIOS e interceptar el tic del temporizador

4.3 Escribir un programa tipo COM llamándolo GUARDA.ASM que se pueda dejar residente y que salve el contenido de una pantalla alfanumérica en el archivo XX.PRN (sobre escribiéndolo) si se usa la tecla Mayus-Imprn Pant. El programa debe evitar su reinstalación y debe poder ser desinstalado con el comando:

GUARDA /C

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-13

USO DE LOS PUERTOS DEL ADAPTADO ASÍNCRONO COM1: COM2: COM3: COM4: Usado para: Comentarios 3F8H 2F8H 3E8H 2E8H Dato a transmitir 3F8H 2F8H 3E8H 2E8H Dato recibido Si el bit 7 del registro de control de línea es 0

3F8H 2F8H 3E8H 2E8H Byte bajo de divisor 3F9H 2F9H 3E9H 2E9H Byte alto de divisor Si el bit 7 del registro de control de línea es 1

3F9H 2F9H 3E9H 2E9H Registro para habilitar Interrupciones 3FAH 2FAH 3EAH 2EAH Registro de identificación De interrupciones 3FBH 2FBH 3EBH 2EBH Registro de control De línea 3FCH 2FCH 3ECH 2ECH Registro de control De modem 3FDH 2FDH 3EDH 2EDH Registro de estado de La línea 3FEH 2FEH 3EEH 2EEH Registro de estado Del modem

REGISTRO DE CONTROL DE LÍNEA DE COMUNICACIÓN ASÍNCRONA

7 6 5 4 3 2 1 0 Función Inicia Valores posibles Bit de acceso 0 1=accesa divisor baud ـ Pone control rup 0 0=deshabilita 1=manda 0s ـ Fija paridad 0 1= sin paridad ـ Paridad par 0 0= paridad impar 1= par ـ Habilita paridad 0 0= ninguna 1= un bit de par ـ Bits de paro 0 0=1 bit de paro 2=1.5 o 2 ـ Tamaño del dato 00 00=5 bits 01=6 bits ـ ـ

10=7 bits 11= 8 bits

REGISTRO DE ESTADO DE LÍNEA DE LA COMUNICACIÓN ASÍNCRONA

7 6 5 4 3 2 1 0 Función Inicia Valores posibles Siempre cero 0 Sin función ـ Reg transm vacío 1 0 = enviado 1 = desocupado ـ Reg transm vacío 1 0 = listo 1 = ocupado ـ Ind interrupción 0 0 = normal 1 = ruptura ـ Error de marco 0 0 = normal 1 = error ـ Error de paridad 0 0 = normal 1 = error ـ Error de pérdida 0 0 = normal 1 = dato no tomado ـ Dato recibido 0 0 = nada llegó 1 = hay dato ـ

REGISTRO DE HABILITACIÓN DE INTERRUPCIONES DE COMUNICACIÓN ASÍNCRONA

7 6 5 4 3 2 1 0 Función Inicia Valores posibles Siempre cero 0 Sin función ـ ـ ـ ـ Interr. de modem 0 1 = habilita interrupción de modem ـ Interr. de línea 0 1 = habilita interrupción receptor ـ .Interr. de trans. 0 1 = habilita reg Trans. Vacío int ـ Interr. dato listo 0 1 = habilita int. dato recibido ـ

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-14

REGISTRO DE CONTROL DEL MODEM DE COMUNICACIÓN ASÍNCRONA

7 6 5 4 3 2 1 0 Función Inicia Valores posibles Siempre cero 0 Sin función ـ ـ ـ Modo prueba 0 1 = habilita autoconexión ـ Señal –OUT2 (IRQ) 0 1 = -OUT2 habilita 0 = alto ـ Señal –OUT1 0 1 = -OUT1 es bajo 0 = alto ـ Señal –RTS 0 1 = -RTS es positivo 0 = negativo ـ Señal -DTR 0 1 = -DTR es positivo 0 = negativo ـ

REGISTRO DE ESTADO DEL MODEM DE COMUNICACIÓN ASÍNCRONA

7 6 5 4 3 2 1 0 Función Inicia Valores posibles DCD negada ? 1 si entrada RS-232 es un voltaje positivo- ـ RI negada ? 1 si entrada RS-232 es un voltaje positivo- ـ DSR negada ? 1 si entrada RS-232 es un voltaje positivo- ـ CTS negada ? 1 si entrada RS-232 es un voltaje positivo- ـ Delta DCD 0 1 = -DCD cambio de estado ـ Ind de fila negada 0 1 = -RI cambio a OFF ـ Delta DSR 0 1 = -DSR cambio de estado ـ Delta CTS 0 1 = -CTS cambio de estado ـ

1 SOH ☺ 2 STX ☻ 3 ETX ♥ 4 EOT ♦ 13 CR ♪ 5 ENQ ♣ 6 ACK ♠ 16 DEL ► 21 NAK § 27 ESC ← 8 BS ◘ 10 LF ◙ 7 BEL ● 24 CAN ↑ 22 SYN ‗

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-15

PROYECTO Se ofrecen los archivos para recepción y envío del protocolo XMODEM. Ensamblarlos, ligarlos y ejecutar el de recepción en una PC y el de envío en otra PC, conectada a la primera, para enviar archivos menores de 32K. %TITLE “RECIBE UN ARCHIVO USANDO PROTOCOLO XMODEM”

IDEAL DOSSEG MODEL small STACK JUMPS

; De ASINC.OBJ

EXTRN Puerto:abs

rc EQU 13 ;ASCII del retorno de carro nl EQU 10 ;ASCII de nueva línea bd4800 EQU 03ch ;4800 baud, sin paridad, 1 bit paro, 8 bits teclaFin EQU 100 ;Código de tecla F10 soh EQU 01 ;Inicio de cabeza ack EQU 06 ;Respuesta positiva nak EQU 21 ;Respuesta negativa can EQU 18 ;Cancelar eot EQU 04 ;Fin de texto

DATASEG

apronta DB rc,nl,’archivo de salida existe. ¿Sobre escribir? (s/n)’,0 ClaveFin DB 0 saludo DB rc,nl,“┌───────────────────────────────────────────────┐” cade DB rc,nl,”│RECIBE UN ARCHIVO POR PUERTO SERIE USANDO │” DB rc,nl,”│XMODEM. Configuración para 4800 bauds. Usa COM:│” DB rc,nl,”│Oprimir F10 para terminar │” DB rc,nl,”└───────────────────────────────────────────────┘” DB rc,nl,0 pidearch DB rc,nl,”Dar nombre de archivo:”,0 cadena DB 80 dup (0) ;Cadena para diversos usos NomArch DB 35 dup (0) ;Cadena para recibir nombre de archivo HandleA DW 0 ;Handle del archivo de salida Pagina DB 32576 dup (0) ;Buffer para recibir paquet DB 1 ;Número de paquete suma DB 0 ;Suma de cotejo noint DB 0 ;Contador de intentos fallidos contador DB 0 ;Apuntador a Pagina

CODESEG ; De ASINC.OBJ

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-16

EXTRN IniciaAsic:proc,FinAsinc:proc,EdoAsinc:proc EXTRN SaleAsinc:proc,LeeAsinc:proc,EdoLeeAsinc:proc

; De TECLADO,OBJ EXTRN EsperaTecla:proc,TraeCar:proc,CursorDer:proc

; De ERRDISCO EXTRN ErrDisco:proc

; De PARAM EXTRN TraeUnPar:proc,CuentaPar:proc,TraePar:proc

; De BINASC.OBJ EXTRN BinAscDec:proc

; De CADENAS.OBJ EXTRN SacaCadena:proc,LeeCadena:proc

Inicia: mov ax,@data ;inicializa DS para apuntar al mov es,ax call TraePar mov bp,dx ;Salva número de parámetros mov dx,puerto ;Trae número de puerto – 1 add dl,’1’ ;Lo hace ASCII mov [cade+48],dl ;Lo pone en cadena de aviso mov di,offset saludo ;Exhibe bienvenida con explicación call SacaCadena cmp bp,1 ;Recupera número de parámetros je @@10 mov di,offset pidearch ;Exhibe apuntador call SacaCadena mov di,offset NomArch ;Apunta con DI a cadena de nombre mov cl,35 call LeeCadena jmp short @@15

@@10: xor cx,cx call TraeUnPar ;DI apunta a nombre dado en línea de comando

@@15: mov dx,di call ArchExiste ;Para abrir archivo jc @@20 ;Salta si no existe call SacaCadena call Confirma ;Pide confirmación para sobre escribir je @@20 ;Brinca si sí mov ax,4c00h ;Sale si no int 21h

@@20: mov dx,di xor cx,cx mov ah,3ch ;Función de DOS para crear archivo int 21h

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-17

jnc @@30 jmp errores

@@30: mov [HandleA],ax ;Salva andel del archivo destino mov bx,offset Pagina mov di,0 ;Apunta con DI a buffer de salida

; Inicializa el baun rate y el resto del puerto asíncrono

mov ah,0 ;Función del BIOS para iniciar puerto mov al,bd4800 ;Trae byte de configuración mov dx,Puerto ;Número de puerto (0 o 1) int 14h ;Servicio para RS-232 call IniciaAsinc ;Inicializa el modo asíncrono

@@40: mov al,nak ;Empieza el dialogo o rechaza paquete call Zalea zinc ;Pide inicio o retransmisión

@@45: call EdoLeeAsinc or dx,dx ;Verifica si hay dato recibido jz @@50 ;No, salta a revisar teclado call LeeAsinc ;Lee carácter del buffer de recepción cmp al,soh ;¿Llegó inicio de paquete? je @@55 ;Si, salta a recibir el resto cmp al,eot ;¿Fin de la transferencia? jne @@45 ;No, brinca mov al,ack ;Manda OK final call SaleAsinc ;Por el puerto serie jmp salvar

@@50: call EsperaTecla ;¿Hay rechazo? jz @@45 ;No, salta a revisar por dato recibido call TraeCar ;Trae valor de la tecla jnz @@45 ;Salta si no es de función cmp al,TeclaFin ;¿F10? je salir jmp @@45

; Recibe resto del paquete @@55:

mov [suma],soh @@60:

call EdoLeeAsinc or dx,dx ;Verifica si carácter recibido jz @@55 call LeeAsinc ;Lee carácter del buffer de recepción mov [paquet],al ;Salva número de paquete

@@70: mov [contador],di call EdoLeeAsinc or dx,dx ;Verifica si DX > 0 jz @@70

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-18

call LeeAsinc ;Lee carácter del buffer de recepción add al,[paquet] ;¿Llegó completo a unos? cmp al,-1 jne @@45 ;No, salta (tira datos) dec [suma] ;Reduce suma de cotejar

@@80: mov cx,128 ;Para recibir 128 caracteres

@@90: call EdoLeeAsinc ;¿Dato disponible? or dx,dx jz @@90 call LeeAsinc ;Trae el carácter mov [Pagina+di],al ;Lo salva en buffer de salida add [suma[,al ;Actualiza suma de cotejo inc di ;Avanza apuntador loop @@90 ;Sigue hasta acabar

@@100: call EdoLeeAsinc or dx,dx jz @@100 call LeeAsinc ;Trae suma enviada por emisor cmp al,[suma] ;¿Coinciden ambas sumas? je @@110 mov di,[contador] ;Repone apuntador jmp @@40

@@110: mov al,’.’ ;Exhibe “.” call EscrCarX mov al,ack ;Responde que recibió bien call SaleAsinc jmp @@45 ;Sigue por más

salvar:

mov bx,[HandleA] ;Trae handle mov dx,offset Pagina mov ah,40 ;Función de DOS par escribir un archivo mov cx,di int 21h jnc @@120 jmp errores

@@120: mov bx,[HandleA] ;Cierra el archivo mov ah,3eh ;Usando DOS int 21h mov al,eot ;Manda carácter final call SaleAsinc jmp salir

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-19

; Fin de emulación. Repone módulo asíncrono y regresa a DOS Errores:

mov [ClaveFin],al call ErrDisco ;Procesa error de disco

Salir: call FinAsinc ;Detiene el módulo asíncrono mov ah,04ch ;Función de DOS: Termina el programa mov al,0 ;Regresa código de salida int 21h

%NEWPAGE PROC ArchExiste

xor al,al ;Sólo lectura mov ah,3dh ;Para abrir archivo int 21h ;con DOS jc @@99 ;Salta si no existe mov bx,ax ;Recupera handle mov ah,3eh ;Función para cerrar int 221h ;archivo clc ;Limpia acarreo para indicar que existe

@@99: ret

ENDP ArchExiste PROC Confirma

push di ;Salva mov di,offset Apronta ;Apuntador a aprontar call SacaCadena ;De sobre escritura mov ah,1 ;Función de DOS int 21h ;para leer teclazo or al,20h ;Lo hace minúscula cmp al,’s’ ;¿Se dio “S” o “s”? je @@99 ;Si, salta cmp al,’n’ ;¿Se dio “N” o “n”? je @@20 ;Si, salta jmp Confirma

@@20: cmp al,’@’ ;Hace ZF = “0”

@@99: pop di ret

ENDP Confirma PROC EscrCarX

push ax bx cx mov ah,9 ;Llamada para imprimir carácter/atributo mov bh,0 ;Asigna página 0 mov cx,1 ;Escribe solamente un carácter mov bl,1fh int 10h ;Escribe el carácter y el atributo call CursorDer ;Ahora mueve el cursor a la siguiente posición

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-20

pop cx bx ax ret

ENDP EscrCarX

END Inicia (Archivo EXMODEM.ASM) %TITLE “ENVÍA UN ARCHIVO USANDO XMODEM” ; Implementa la transmisión de un archivo usando protocolo de Ward Christensen, de 1979

IDEAL DOSSEG MODEL small SNACK 512 JUMPS

; De ASINC.OBJ EXTRN Puerto:abs ;Especifica puerto COM (0 = COM1)

rc EQU 13 ;ASCII del retorno de carro nl EQU 10 ;ASCII de nueva línea bd4800 EQU 0c3h ;4800 baud, sin paridad, 1 bit de paro, 8 bits TeclaFin EQU 100 ;Código de tecla F10 Soh EQU 01 ;Inicio de encabezado Ack EQU 06 ;Respuesta positiva Nak EQU 21 ;Respuesta negativa Can EQU 18h ;Cancelar Eot EQU 04 ;Fin de texto

DATASEG

ClaveFin DB 0 saludo DB rc,nl,“┌────────────────────────────────────────────────┐”,rc cade DB rc,nl,“│ENVÍA UN ARCHIVO POR PUERTO SERIE USANDO XMODEM │” DB rc,nl,“│Configurada para 4800 bauds. Usa COM : │” DB rc,nl,“│Oprimir F10 para terminar │” DB rc,nl,”└────────────────────────────────────────────────┘” DB rc,nl,nl,0 PideArch DB rc,nl,”Dar nombre de archivo: “,0 Cadena DB 80 dup (0) ;Cadena para diversos usos NomArch DB 30 dup (0) ;Cadena para recibir nombre de archivo HandleA DW 0 ;Handle del archivo Pagina DB 256 dup (0) paquet DB 1 ;Número de paquete suma DB 0 ;Suma para cotejar noint DB 0 ;Número de intentos fallidos

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-21

CODESEG

; De ASINC.OBJ EXTRN IniciaAsic:proc,FinAsinc:proc,EdoAsinc:proc EXTRN SaleAsinc:proc,LeeAsinc:proc,EdoLeeAsinc:proc

; De TECLADO.OBJ EXTRN EsperaTecla:proc,TraeCar:proc,CursorDer:proc

; De ERRDISCO EXTRN ErrDisco:proc

; De PARAM EXTRN TraeUnPar:proc,CuentaPar:proc,TraePar:proc

; De BINASC.OBJ EXTRN BinAscDec:proc

: De CADENAS.OBJ EXTRN SacaCadena:proc,LeeCadena:proc

Inicia: mov ax,@data ;Inicializa DS para apuntar al mov es,ax call TraePar call CuentaPar ;Cuenta parámetros mov bp,dx ;Salva cantidad de parámetros mov dx,puerto ;Informa qué puerto COM usar add dl,’1’ ;Lo hace ASCII mov [cade+40],dl ;Lo inserta en cadena mov di,offset saludo ;Exhibe bienvenida con explicación call SacaCadena cmp bp,1 ;Trae cantidad de parámetros je @@10 mov di,offset pidearch ;Exhibe aprontador que pide archivo call SacaCadena mov di,offset NomArch ;Apunta con DI a cadena de nombre mov cl,30 ;30 caracteres máximo de nombre call LeeCadena jmp short @@15

@@10: xor cx,cx call TraeUnPar ;Apunta a nombre dado en línea de comando

@@15: mov dx,di mov ah,3dh ;Para abrir archivo mov al,0 ;Sólo lectura int 21h jnc @@20 ;Brinca si lo abrió

@@20: mov [HandleA],ax ;Salva andel del archivo fuente

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-22

; Inicializa el baud rate y el resto de puerto asíncrono

mov ah,0 ;Función del BIOS para iniciar puerto mov al,bd4800 ;Trae byte de configuración mov dx,puerto ;Número de puerto (0 o 1) int 14h ;Servicio para RS-232 call IniciaAsinc ;Inicializa el módulo asíncrono

@@30: call EdoLeeAsinc or dx,dx ;Verifica si recibió carácter jz @@40 ;Salta a ver teclado si no call LeeAsinc ;lee carácter del buffer de recepción cmp al,nak ;¿Llegó nak inicial? jne @@30 ;Salta si no jmp short @@50

@@40: call EsperTecla ;Verifica si se presionó una tecla jz @@30 ;Brinca si no call TraeCar ;Trae carácter de la tecla jnz @@30 ;Brinca si tecla normal cmp al,TeclaFin ;¿Se oprimió tecla de terminar? je Salir ;Si, salta jmp @@30 ;Salta a esperar dato serial

@@50: mov ax,0 ;Pone 128 ceros mov cx,64 mov di,offset Pagina ;en buffer de salida rep stow mov bx,[HandleA] ;Trae handle del archivo mov ah,3fh ;Función de DOS para leer un archivo mov cx,128 ;128 bytes mov dx,offset Pagina :Apunta al buffer int 21h jnc @@60 ;Salta si OK jmp errores

@@60: mov [byte ptr noint],0

@@65: mov cx,128 ;Para enviar 128 bytes or ax,ax ;¿Leyó algunos bytes? jz @@90 ;Salta si no mov bx,0 ;Inicia apuntador mov [suma],soh ;inicia suma de cotejar mov al,’.’ ;Exhibe “.” Call EscrCarX

@@70: mov al, ;Envía inicio de paquete call SaleAsinc mov al,[paquet] ;Envía número consecutivo call SaleAsinc mov al,[paquet] ;Trae consecutivo not al ;Lo complementa a unos inc [paquet] ;Lo envía

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-23

call SaleAsinc dec [suma] ;Actualiza suma de cotejar

@@80: mov al,[bl+Pagina] ;Trae un byte del buffer add [suma],al ;Lo agrega call SaleAsinc ;Y lo manda inc bx ;Avanza apuntador dec cx ;Decrementa contador or cx,cx ;¿Acabó con los 128? jz @@100 ;Si, salta jmp short @@80 ;No, envía más

@@90: mov bx,[HandleA] ;Cierra el archivo mov ah,3eh ;Función para cerrar archivo int 21h mov al,eot ;Manda byte final call SaleAsinc jmp salir

@@100: mov al,[suma] ;Envía suma formada call SaleAsinc

@@110: call EdoLeeAsinc ;¿Llegó algo al puerto? or dx,dx ;Verifica si hay dato recibido jz @@160 call LeeAsinc ;Lee carácter del buffer de recepción cmp al,ack ;¿Llegó ACK? jne 120 ;No, salta jmp @@50 ;Si, salta a enviar otro paquete

@@120: cmp al,nak ;¿Llegó respuesta negativa? jne @@140 ;No, salta inc [noint] ;aumenta número de intentos cmp [noint],5 ;¿Llegó a 5? jb @@130 ;No, brinca jmp @@90 ;Salta para salir

@@130: jmp @@65

@@140: cmp al,can ;¿Llegó petición de cancelar? jmp @@90

@@150: jmp @@65

@@160: call EsperaTecla ;Verifica si se presionó una tecla jz @@110 ;Brinca si no call TraeCar ;Trae carácter de la tecla jnz @@170 ;Brinca si tecla normal cmp al,TeclaFin ;¿Se oprimió tecla de terminar? je Salir

@@170: call SaleAsinc ;Manda byte al puerto jmp @@110

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS

8-24

; Fin de emulación. Repone módulo asíncrono y regresa a DOS Errores:

mov [ClaveFin],al call ErrDisco

Salir: call FinAsinc ;Detiene el módulo asíncrono mov ah,04ch ;Función de DOS: Termina el programa mov al,0 ;Regresa código de salida int 21h

%NEWPAGE PROC EscrCarX

push ax bx cx ;Salva registros mov ah,9 ;Llamada para imprimir carácter/atributo mov bh,0 ;Asigna página 0 mov cx,1 ;Escribe solamente un carácter mov bl,1fh int 10h ;Escribe el carácter y el atributo call CursorDer ;Ahora mueve el cursor a la siguiente posición pop cx bx ax ;Recobra registros ret

ENDP EcsrCarX END Inicia