Sie sind auf Seite 1von 22

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

PRCTICA 16
PROGRAMA RESIDENTE QUE PUEDE USAR FUNCIONES DE DOS PARA CAPTURAR LA SALIDA A IMPRESORA

1.

INTRODUCCIN
La prctica est dedicada a ilustrar el mtodo para hacer programas residentes en memoria que sean capaces de poder acceder el disco duro a travs de funciones de DOS.

2.

OBJETIVOS
2.1 2.2
El alumno aprender a usar tcnicas muy avanzadas de uso de las funciones de DOS. Aprender a hacer programas que se instalan en memoria para lograr algn fin especfico. Dichos programas impiden su reinstalacin, una vez que ya estn instalados y pueden reconfigurarse a voluntad del usuario. Se examinan algunas tcnicas para cambiar vectores de interrupcin

2.3

3.

DESARROLLO
3.1
Capturar el siguiente mdulo y salvarlo con el nombre DESVIA.ASM. "modulo DESVIA.ASM que captura la salida a impresora"
TASM TLINK /t desvia desvia

%TITLE

;ensamblar con: ;ligar con

;DESVIA.COM captura salida a una impresora hacia un archivo. Su sintaxis es: ; ; DESVIA PRNn[:]=[[d:][ruta]NomArch] [/B=largo] [/C] ; ;donde PRNn especifica la impresora de la PC a enrutar (PRN1, ;PRN2 o PRN3), "NomArch" especifica el nombre del archivo, y "largo" ;especifica el tamao del buffer interno de DESVA (en kilobytes). ;El "largo" por default es de 4K; Los valores aceptables son de 2K a 32K. ;Al correr DESVA sin parmetros en la lnea de comandos, se exhibe (si hay) ;el puerto que es redirigido. Ejecutando con /C cancela la redireccin.

IDEAL MODEL

tiny
16-1

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

CODESEG assume org salto: jmp firma numeroID int08h int13h int17h int21h int25h int26h int28h int2Fh BandError BandInt EnDOS largo mitad puntero SegBuf bytes contador PtoSerie NomArch
LOJ

CS:_text,DS:_text

100h

inicio db db dd dd dd dd dd dd dd dd dd db dd dw dw dw dw db db db 0,1,2,"-DESVIA-",2,1,0 ? ? ? ? ? ? ? ? ? ? 0 ? 4096 2048 0 ? dw ? 91 0FEh,0 128 dup (?)


;firma del programa ;numero para multiplexar ;vector de interrupcin 08h ;vector de interrupcin 13h ;vector de interrupcin 17h ;vector de interrupcin 21h ;vector de interrupcin 25h ;vector de interrupcin 26h ;vector de interrupcin 28h ;vector de interrupcin 2Fh ;direccin de band. de error critico ;bandera interrupcin de disco ;direccin de bandera en DOS ;tamao del buffer interno ;mitad del buffer ;puntero del buffer ;segmento del buffer ;Numero de bytes en buffer ;contador de tiempo descendente ;puerto PRN Redirigido ;especificacin del archivo

manipula interrupcin 08h.

PROC

IntReloj pushf call [cs:int08h] cli cmp je dec jnz cmp jne mov jmp

FAR
;salva banderas ;llama manejador previo ;Deshabilita interrupciones ;Brinca si contador ;llego a cero ;Decrementa contador ;sale si no cero ;Brinca si hay datos ;en el buffer ;Repone el contador y sale ;si no

[cs:contador],0 @@10 [cs:contador] @@99 [cs:puntero],0 @@10 [cs:contador],91 short @@99

@@10: push push cmp jne

di es [cs:BandInt],0 @@20

;Salva ES y DI ;Brinca si hay interrupcin ;de disco 16-2

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

les cmp jne les cmp jne call @@20: pop pop @@99: iret

di,[cs:EnDOS] [byte ptr es:di],0 @@20 di,[cs:BandError] [byte ptr es:di],0 @@20 vacia es di

;Brinca si esta en DOS

;Brinca si el error crtico ;est activo ;Salva buffer en archivo ;Restaura ES y DI

ENDP
;IntImpre

IntReloj
manipula interrupcin 17h.

PROC
cmp jne @@10: jmp @@20: cmp jne cmp ja push push

IntImpre FAR [cs:PtoSerie],0FFh @@20 [cs:int17h]

;Brinca si la redireccin ;est habilitada ;salta a rutina del BIOS

dx,[word ptr cs:PtoSerie] @@10 ah,03h @@10 di es

;sale si este puerto PRN no esta ;actualmente redirigido ;sale si funcin trae cdigo ;mayor que 03h ;Salva ES y DI

;Procesa interrupcin 17h, funcin 00h (transmite carcter a impresora). or jnz mov mov cmp je mov mov inc mov cmp jb @@30: cmp jne les cmp jne ah,ah @@40 [cs:contador],91 di,[cs:puntero] di,[cs:largo] @@70 es,[cs:SegBuf] [es:di],al di [cs:puntero],di di,[cs:mitad] @@60
;Brinca si AH no es 0 ;Repone contador de tics ;apunta con DI al buffer ;Error si el buffer est ;lleno ;apunta con ES al segmento ;pone en buffer al carcter ;Incrementa puntero del buffer ;Salva nuevo apuntador ;sale si el buffer esta menos ;que medio lleno

[cs:BandInt],0 @@60 di,[cs:EnDOS] [byte ptr es:di],0 @@60

;Brinca si bandera de interrupcin ;de disco esta puesta ;Brinca si bandera En DOS ;est puesta

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

16-3

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

les cmp jne call jmp

di,[cs:BandError] [byte ptr es:di],0 @@60 vacia short @@60

;Brinca si error critico ;est activo ;manda buffer al disco ;y sale

Procesa interrupcin 17h, funcin 01h (inicializa impresora).

@@40: cmp jne cmp je jmp

ah,01h @@50 [cs:puntero],0 @@60 @@30

;Brinca si AH no es 1 ;sale si el buffer ;est vaco ;lo manda al disco, si no

;Procesa interrupcin 17h, funcin 02h (trae estado de impresora).

@@50: mov cmp je @@60: mov pop pop iret @@70: mov pop pop iret

di,[cs:puntero] di,[cs:largo] @@70 ah,90h es di

;trae puntero del buffer ;est el buffer lleno? ;Error si as es ;Retorna seal de OK en AH ;Restaura ES y DI ;Retorna de la interrupcin

ah,08h es di IntImpre
manipula interrupcin 21h.

;Retorna error de E/S en AH ;Restaura ES y DI ;Retorna de la interrupcin

ENDP
;INTDOS

PROC

IntDOS pushf cmp [cs:puntero],0 je @@20 push push cmp jne les cmp jne les cmp jne di es [cs:BandInt],0 @@10 di,[cs:EnDOS] [byte ptr es:di],0 @@10 di,[cs:BandError] [byte ptr es:di],0 @@10
;Salva banderas ;salva si el buffer est ;vaco

;Brinca si una interrupcin ;de disco est activa ;Brinca si bandera En DOS ;est activa ;Brinca si error critico ;est vigente

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

16-4

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

call @@10: pop pop @@20: popf jmp

vacia es di

;salva el buffer en archivo ;Restaura registros

ENDP

[cs:int21h] IntDOS
manipula interrupcin 28h.

;Restaura banderas ;sale a manejador original

; INTDOSOCIOSO

PROC

IntDOSOcioso pushf call [cs:int28h] cli cmp je [cs:puntero],0 @@99 [cs:BandInt],0 @@99 di es di,[cs:BandError] [byte ptr es:di],0 es di @@99 vacia

FAR
;salva banderas ;llama manejador previo ;Deshabilita interrupciones ;sale si el buffer ;est vaco ;Brinca si una interrupcin ;de disco esta activa ;Salva ES y DI ;Checa el estado de bandera ;de error critico ;Restaura ES y DI ;sale si la bandera est activa ;si no, salva buffer ;Retorna desde interrupcin

cmp jne push push les cmp pop pop jne call @@99: iret

ENDP
;INTDISCO

IntDOSOcioso
manipula interrupcin 13h.

PROC
pushf or popf pushf call pushf and popf ret

IntDisco

FAR
;Salva banderas ;pone bandera de disco ;Retira banderas ;salva banderas ;llama manejador previo ;Salva banderas ;limpia bandera de disco ;Retira banderas ;Retorno con banderas intactas

[cs:BandInt],02h

[cs:int13h] [cs:BandInt],0FDh 2 IntDisco


manipula interrupcin 25h.

ENDP

;INTLECTURAABS

PROC
pushf or

IntLecturaAbs [cs:BandInt],04h

FAR
;Salva banderas ;pone bandera de disco 16-5

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

popf call pushf and popf ret

[cs:int25h] [cs:BandInt],0FBh

;Retira banderas ;llama manejador previo ;Salva banderas ;limpia bandera de disco ;Retira banderas ;Retorna con banderas en pila

ENDP

IntLecturaAbs

;INTESCRABS manipula interrupcin 26h.

PROC

IntEscrAbs FAR pushf or [cs:BandInt],08h popf call [cs:int26h] pushf and [cs:BandInt],0F7h popf ret ENDP IntEscrAbs

;Salva banderas ;pone bandera de disco ;Retira banderas ;llama manejador previo ;Salva banderas ;limpia bandera de disco ;Retira banderas ;Retorna con banderas en pila

; MPLEX_INT manipula interrupcin 2FH. Si, de entrada, AH esta puesto con el ;numero ID de multiplexaje de DESVIA, MPLEX_INT usa el valor en AL como funcin ;Las funciones soportadas son: ; ; 00h Retorna FFh en AL para indicar que el programa esta instalado ; y retorna la direccin de su firma en ES:DI. ; ; 01h Retorna el numero de impresora actualmente redirigida ; (0, 1, or 2) en AL, o FFh si ninguna lo esta. Si AL ; contiene 0, 1, or 2, entonces ES:DI tiene la direccin del ; nombre del archivo de salida al cual se redirige. ; ; 02h Acepta el numero de la impresora a ser redirigida (0, 1, ; o 2) en BL y la direccin de un nombre de archivo en DS:SI. FFh ; cancela la redireccin. Esta funcin causa que el buffer de salida ; sea vaciado.

PROC

IntMplex far pushf cmp ah,[cs:numeroID] je @@10 popf jmp [cs:int2Fh]

;Salva registro de banderas ;Brinca si AH tiene el ;nmero ID de multiplexar ;Repone banderas ;Ejecuta la interrupcin

;Funcion 00h verifica si el programa est instalado.

@@10: popf or jnz mov push pop mov

al,al @@20 al,0FFh cs es di,offset firma

;Repone banderas ;Brinca si cdigo de funcin ;es diferente a 00h ;pone AL a FFH ;apunta ES:DI a firma ;del programa

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

16-6

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

iret
;Funcion 01h reporta el estatus de la redireccin.

;Retorna de la interrupcin

@@20: cmp jne mov push pop mov iret

al,01h @@30 al,[cs:PtoSerie] cs es di,offset NomArch

;Brinca si cdigo de funcin ;es otro que 01h ;pone nmero de impresora en AL ;apunta con ES al segmento ;apunta DI a nombre de archivo ;Retorna de la interrupcin

;Funcin 02h designa una nueva impresora o nombre de arch. para redireccin.

@@30: cmp je call @@40: mov cmp je push push pop mov cld @@50: movsb cmp jne pop @@99: iret

[cs:puntero],0 @@40 vacia [cs:PtoSerie],bl bl,0FFh @@99 es cs es di,offset NomArch

;Brinca si buffer de ;salida est vaco ;manda buffer al disco ;Salva numero de impresora ;Brinca si la redireccin ;est cancelada ;Salva ES ;apunta con ES a este segmento ;apunta DI a nombre de archivo ;limpia bandera de direccin ;Copia un carcter ;Fue un cero? ;No, entonces salta para atrs ;Restaura ES ;Retorna de la interrupcin

[byte ptr si-1],0 @@50 es

ENDP

IntMplex

;VACIA vacia el buffer.

PROC
push

vacia ax bx cx dx ds

;Salva registros ;apunta con DS al segmento ;de cdigo

mov ax,cs mov ds,ax asume ds:_text mov mov mov mov sti call jc [ds:contador],91 ax,[ds:puntero] [ds:bytes],ax [ds:puntero],0

;Repone el contador ;Retira puntero del buffer ;lo salva para despus ;Repone el puntero ;permite interrupciones ;intenta abrir el archivo ;Brinca si falla 16-7

AbreArch @@99

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

mov mov xor mov int mov mov xor mov

bx,ax ax,4202h cx,cx dx,cx 21h

;Transfiere handle a BX ;Mueve puntero de archivo ;al fin del mismo

ah,40h cx,[ds:bytes] dx,dx ds,[ds:SegBuf] assume ds:nothing int 21h mov int ah,3Eh 21h

;Copia buffer de salida ;al disco

;Cierra archivo

@@99: pop ret

ds dx cx bx ax vacia

;Restaura registros y sale

ENDP

;ABREARCH intenta abrir o crear el archivo de la redireccin. ;De retorno, el acarreo se limpia si el intento fue exitoso y el handle ;del archivo esta en AX. El acarreo en "1" implica que algo fallo. De ;entrada, DS debe apuntar al segmento de cdigo.

PROC
mov mov int jnc mov xor mov int mov mov int jnc mov xor mov int jnc stc ret @@10: clc ret

AbreArch ax,3D01h dx,offset NomArch 21h @@10 ax,4301h cx,cx dx,offset NomArch 21h ax,3D01h dx,offset NomArch 21h @@10 ah,3Ch cx,cx dx,offset NomArch 21h @@10

;intenta abrir el archivo ;para escritura ;Brinca si se pudo ;intenta quitar todos los ;atributos del archivo

;reintenta abrirlo ;para escritura ;Brinca si lo logro ;intenta crear el archivo ;como nuevo

;Brinca si hecho ;pone bandera CF y sale ;retorno ;limpia bandera de acarreo ;y sale 16-8

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

ENDP

AbreArch LABEL FIN

;Datos que se descartan al quedar residente en memoria

derechos

db db db db db db db db db db db db db db db db db db db db db db db db db db db db db db dw

"DESVA 2.1 captura salida a impresora",13,10 "De: Seminario de Lenguaje ensamblador 80386" 13,10,13,10,"$" "Captura salida a impresora en un archivo.",13,10,13,10 "DESVA [PRNn[:]=[[d:][ruta]NomArch]] [/B=largo] " "[/C]",13,10,13,10 Especifica el nmero de impresora.",13,10 " PRNn "/B=largo especifica el tamao del buffer interno " "en kilobytes (default=4K).",13,10 Cancela redireccin.",13,10,13,10 "/C "Al correr DESVA sin parmetros se exhibe " "el estado de la redireccin.",13,10,"$" "Sintaxis: DESVA [PRNn[:]=[[d:][ruta]NomArch]] " "[/B=largo] [/C]",13,10 "o bien:",13,10,13,10 "DESVA [/?]",13,10,13,10,"$" "Requiere DOS 4.0 o superior",13,10,"$" "el largo del buffer permanece fijo una vez instalado" 13,10,"$" " largo de buffer invalido (mnimo = 2, mximo = 32)" 13,10,"$" " numero de impresora invalido (debe ser PRN1, PRN2, PRN3)" 13,10,"$" "El archivo no se pudo abrir",13,10,"$" "El programa no se pudo instalar",13,10,"$" "Memoria insuficiente",13,10,"$" "DESVA instalado",13,10,"$" "Ningn impresora actualmente redirigida",13,10,"$" "PRNn: esta ahora redirigida a $" 0 0
;0 = No instalado

ayudar

msjerr1

msjerr2 msjerr3 Crnl. msjerr4 msjerr5 msjerr6 msjerr7 msjerr8 msg1 msg2 msg3 instalado DirFinL

;direccin de fin de lnea

;INICIO hace al programa residente en memoria.

Assume

ds:_text inicio

PROC
cld mov call jnc

si,81h BuscaAyuda @@10

;limpia bandera de direccin ;apunta SI a lnea de comando ;barre por la opcin /? ;Brinca si no lo halla

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

16-9

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

mov mov int mov int @@10: mov mov int

ah,09h dx,offset ayudar 21h ax,4C00h 21h ah,09h dx,offset derechos 21h

;exhibe mensaje de ayuda ;y sale

;exhibe mensaje de derechos

;Coteja versin de DOS y ve si programa ya esta instalado.

mov mov int cmp jae error: mov int mov int @@20: push call jnc mov mov @@30: pop

dx,offset msjerr2 ah,30h 21h al,4 @@20

;sale si versin de DOS ;es menor que 4.0

ah,09h 21h ax,4C01h 21h

;exhibe mensaje de error y ;sale con ERRORLEVEL=1

es coteja @@30 [ds:instalado],1 [ds:numeroID],ah

;Salva ES ;ver si copia esta instalada ;Brinca si no ;pone bandera si ;tambin salva nmero ID ;Repone ES

;Pasa todo a maysculas en la lnea de comando.

@@40: mov mov xor jcxz @@50: cmp jb cmp ja and @@60: inc loop @@65: mov

si,81h cl,[ds:si-1] ch,ch @@ [byte ptr si],"a" @@60 [byte ptr si],"z" @@60 [byte ptr si],0DFh si @@50 si,81h

;apunta SI a lnea de comando ;CL = Nmero de caracteres ;Convierte byte a palabra CX ;hecho si CX = 0 ;lo deja si menor que "a" ;lo deja si mayor que "z" ;la hace mayscula ;Avanza SI ;sigue hasta terminar ;Repone SI

; analiza la lnea de comando.

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

16-10

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

@@70: call jnc jmp @@75: cmp jne

HallaCar @@75 hecho [byte ptr si],"/" @@100

;Halla parmetro ;Brinca si no fin de lnea ;sale del lazo de anlisis ;Brinca si el carcter ;no es una diagonal

;Procesa la opcin /B.

Inc Lodsb Cmp Jne Cmp Mov Jne lodsb cmp mov jne cal mov jc cmp jb cmp ja xor mov shl or jnz dec @@80: mov shr mov jmp

si al,"B" @@90 [ds:instalado],0 dx,offset msjerr3 error al,"=" dx,offset msjerr1 error AscABin dx,offset msjerr4 error al,2 error al,32 error ah,ah cl,10 ax,cl ax,ax @@80 ax [ds:largo],ax ax,1 [ds:mitad],ax @@70

;Avanza SI ;obtiene carcter ;Brinca si no es una "B" ;Error si /B dado con el ;programa ya instalado ;trae siguiente carcter ;Error si no es "="

;trae el nmero tras el "=" ;sale si hubo error ;en la conversin ;Error si menor que 2 ;Error si mayor que 32 ;Computa largo del buffer ;en bytes corriendo ;AX a la izquierda 10 bits ;Brinca si no igual a 0 ;pone AX a FFFFH ;salva largo del buffer ;Divide largo del buffer por 2 ;lo registra ;Retorna a lazo de anlisis

;Procesa la opcin /C.

@@90: mov cmp jne mov jmp

dx,offset msjerr1 al,"C" error1 [ds:PtoSerie],0FFh @@70

;Inicia puntero de error ;Error si no es una "C" ;Cancela redireccin ;Retorna a lazo interno

;Procesa un numero PRN de puerto.

@@100: mov mov

dx,offset msjerr1 di,offset msjerr1+18

;Inicia puntero de error ;Punto DI a "PRN" 16-11

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

mov repe jne mov lodsb cmp jb cmp ja sub mov mov cmp jne cmp je inc

cx,3 cmpsb error1 dx,offset msjerr5 al,"1" error1 al,"3" error1 al,31h [ds:PtoSerie],al dx,offset msjerr1 [byte ptr si],":" @@110 [byte ptr si],0Dh error1 si

;carga CX con cuenta ;Compara cadenas ;Error si no iguales ;Inicia puntero de error ;trae nmero de puerto ;Error si menor que "1" ;Error si mayor que "3" ;Convierte a nmero de puerto ;lo salva ;Inicia puntero de error ;es siguiente carcter dos puntos? ;No, entonces brinca ;Error si fin de lnea ;Salta dos puntos

@@110: lodsb cmp al,"=" jne error1

;trae siguiente carcter ;Error si no "="

;Procesa nombre de archivo que va con el nmero del puerto.

push call jc mov @@120 mov pop mov mov int jnc error2: mov error1: jmp @@130: call jc mov mov int cmp je

si HallaDelim @@120 [ds:DirFinL],si [byte ptr si],0 si di,offset NomArch ah,60h 21h @@130

;salva direccin de cadena ;halla fin de cadena ;Brinca si fin de lnea ;Salva direccin de fin de lnea ;Convierte a cadena ASCIIZ ;Retira direccin de cadena ;apunta DI a nombre de archivo ;y lo convierte en ;nombre de archivo ;Brinca si no error

dx,offset msjerr6 error

;sale si error

AbreArch error2 bx,ax ah,3Eh 21h [ds:DirFinL],0 hecho

;intenta abrir archivo

;cierra el archivo

;lleg a fin de lnea? ;Si, sale del anlisis 16-12

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

mov inc jmp

si,[ds:DirFinL] si @@70

;apunta SI a fin de NomArch ;Avanza tras del byte nulo ;regresa por mas

; Aqu llega cuando el anlisis termina.

hecho: cmp jne cmp Jne Inc jmp @@140: cmp je mov mov mov mov int @@150: call mov int

[ds:instalado],0 @@140 [ds:PtoSerie],0Feh instala [ds:PtoSerie] short instala

;Brinca si el programa ya ;est instalado ;nmero de puerto igual a FEH? ;No, entonces ir a instalar ;pone nmero de puerto a FFH ;ir instalar

[ds:PtoSerie],0Feh @@150 ah,[ds:numeroID] al,02h bl,[ds:PtoSerie] si,offset NomArch 2Fh

;nmero de puerto igual a FEH? ;si, entonces ya la hicimos ;enva nuevo no. de impresora ;y nombre de archivo a una ;copia instalada del ;programa

SacaEstado ax,4C00h 21h

;exhibe estado de redireccin ;sale con ERRORLEVEL=0

;Instala el programa.

instala: call mov jc mov mov int mov mov push mov int mov mov pop mov jc mov int mov mov mov

mplex_id dx,offset msjerr7 error1 [ds:numeroID],ah ah,34h 21h [word ds:EnDOS],bx [word ds:EnDOS+2],es ds ax,5D06h 21h [word ds:BandError],si [word ds:BandError+2],ds ds dx,offset msjerr7 error1 ax,3508h 21h [word ds:int08h],bx [word ds:int08h+2],es ax,2508h

;Busca nmero mltiplex ID ;Error si ninguno disponible ;Salva numero ID ;Trae y salva la direccin de ;la bandera En DOS

;Salva DS ;Obtiene y salva la direccin ;de bandera de error critico

;Restaura DS ;Error si funcin retorna ;con acarreo en "1" ;Cambia interrupcin 08h ;para IRQ0 (tic del reloj)

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

16-13

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

mov int mov int mov mov mov mov int mov int mov mov mov mov int mov int mov mov mov mov int mov int mov mov mov mov int

dx,offset IntReloj 21h ax,3513h 21h [word int13h],bx [word int13h+2],es ax,2513h dx,offset IntDisco 21h ax,3517h 21h [word int17h],bx [word int17h+2],es ax,2517h dx,offset IntImpre 21h ax,3521h 21h [word int21h],bx [word int21h+2],es ax,2521h dx,offset IntDOS 21h ax,3525h 21h [word int25h],bx [word int25h+2],es ax,2525h dx,offset IntLecturaAbs 21h
;Cambia interrupcin 13h ;de servicios de disco ;del BIOS

;Cambia interrupcin 17h ;de servicios de impresora ;del BIOS

;Cambia interrupcin 21h ;de llamado a DOS

;Cambia interrupcin 25h ;de lectura absoluta ;a disco

mov ax,3526h int 21h mov [word int26h],bx mov [word int26h+2],es mov ax,2526h mov dx,offset IntEscrAbs int 21h mov int mov mov mov mov int mov int mov ax,3528h 21h [word int28h],bx [word int28h+2],es ax,2528h dx,offset IntDOSOcioso 21h ax,352Fh 21h [word int2Fh],bx

;Cambia interrupcin 26h ;de escritura absoluta ;a disco

;Cambia interrupcin 28h ;de manejo de tiempo muerto ;del DOS

;Cambia interrupcin 2Fh ;de manejo de programas ;residentes 16-14

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

mov mov mov int mov mov int mov mov shr inc mov mov int mov mov mov shr inc int mov jnc jmp no_error: mov mov mov int call mov mov shr inc int

[word int2Fh+2],es ax,252Fh dx,offset IntMplex 21h ah,49h es,[ds:2Ch] 21h ah,4Ah bx,offset FIN bx,4 bx cx,cs es,cx 21h ah,48h bx,[largo] cl,4 bx,cl bx 21h dx,offset msjerr8 no_error error [SegBuf],ax ah,09h dx,offset msg1 21h SacaEstado ax,3100h dx,offset FIN dx,4 dx 21h inicio
;trae direccin del segmento del ;bloque de ambiente ;y libera el segmento ;encoge el bloque memoria

;donde el programa est ;cargado

;pide un nuevo bloque ;de memoria para el buffer ;de datos

;Error si no hay ;suficiente memoria

;Salva direccin del segmento ;saca mensaje certificando ;la instalacin ;Saca estado de redireccin ;Termina con funcin 31h

ENDP

;HALLACAR avanza SI al siguiente carcter. Al retornar, el acarreo puesto ;indica que el fin de la lnea fue alcanzado.

PROC
Lodsb cmp je cmp je cmp je dec cmp

HallaCar al,09h HallaCar al,20h HallaCar al,2Ch HallaCar s al,0Dh


;trae el siguiente carcter ;ms si es tabulador ;ms si es espacio ;ms si es coma ;apunta SI al carcter ;sale con acarreo puesto 16-15

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

je clc ret @@99: stc ret

@@99

;si lnea fue alcanzado ;limpia acarreo y sale

;pone acarreo y sale

ENDP

HallaCar

;HALLADELIM avanza SI al siguiente carcter blanco. Al retornar, ;CF = "1" indica que el fin de la lnea fue alcanzado.

PROC
lodsb cmp je cmp je cmp je cmp jne dec stc ret @@99: dec clc ret

HallaDelim al,09h @@99 al,20h @@99 al,2Ch @@99 al,0Dh HallaDelim si


;trae el siguiente carcter ;sale si tabulador ;sale si es espacio ;sale si es coma ;hace ms si fin ;de lnea no alcanzado ;pone acarreo y sale

si

;limpia acarreo y sale

ENDP

HallaDelim

;BUSCAAYUDA barre la lnea de comando por la opcin /?. Si la halla, ;retorna con 1 en CF y SI contiene sesgo de la opcin. Si no lo ;haya, acarreo = "0"

PROC
Push @@10: lodsb cmp je cmp jne cmp jne add sub stc ret

BuscaAyuda si

;Salva SI ;trae un carcter ;sale si fin de lnea ;ms si no "?" ;ms si no "/"

al,0Dh @@99 al,"?" @@10 [byte ptr si-2],"/" @@10 sp,2 si,2

;limpia la pila ;Ajusta SI ;pone acarreo y sale

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

16-16

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

@@99: pop clc ret

si

;Restaura SI ;limpia acarreo y sale

ENDP

BuscaAyuda

;COTEJA retorna acarreo puesto si el programa ya esta instalado, ;o acarreo limpio si no. Si CF retorna en "1", AH tiene el numero ;ID multiplex del programa.

PROC
Mov Mov @@10: push push xor mov int cmp jne mov mov repe jne pop pop stc ret @@20: pop pop inc loop clc ret

coteja ax,0C000h cx,40h

;Inicia AH y AL ;Inicia cuenta

ax cx di,di es,di 2Fh al,0FFh @@20 si,offset firma cx,14 cmpsb @@20 cx ax

;Salva AX y CX ;hace ES y DI cero ;Interrupcin 2Fh ;nada aqu si AL no es ;igual a FFH ;ver si la firma del programa ;aparece en la direccin ;retornada en ES:DI ;Brinca si no est ;limpia la pila y sale ;con acarreo puesto

cx ax ah @@10

;Retira AX y CX ;siguiente ID de multiplex ;sigue hasta terminar ;sale con acarreo limpio

ENDP

coteja

;MPLEX_ID busca un numero ID de multiplex no usado. Si halla uno, ;lo retorna en AH con el acarreo limpio. Acarreo = "1" indica que ;no hay nmeros ID actualmente disponibles.

PROC
Mov Mov @@10 push push

mplex_id ax,0C000h cx,40h

;Inicia AH y AL ;Inicia cuenta

ax cx

;Salva AX y CX

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

16-17

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

int or jz pop pop inc loop tc ret @@20: op op ic ret

2Fh al,al @@20 cx ax ah @@10

;Interrupcin 2Fh ;Brinca si AL = 0 ;Retira AX y CX ;Incrementa numero ID ;sigue hasta acabar ;con CF puesto

x x

;la pila y sale ;acarreo limpio

ENDP

lex_id

;AscABin convierte un numero decimal entrado en forma ASCII en un valor ;binario en AL. El acarreo puesto al retornar indica que hubo error en ;la conversin.

PROC
xor xor mov @@10: mov inc cmp je cmp je cmp je cmp je cmp jb cmp ja mu jc sub add cmp jna @@20: dec stc ret

AscABin ax,ax bh,bh dl,10

;Inicia registros

bl,[si] si al,09h @@99 bl,20h @@99 bl,2Ch @@99 bl,0Dh @@99 bl,"0" @@20 bl,"9" @@20 dl @@20 bl,30h ax,bx ax,255 @@10

;trae un carcter ;sale si es tabulador ;sale si es espacio ;sale si es coma ;sale si es retorno de carro

;Error si carcter no es ;un nmero

;Multiplica valor en AL por ;10 y sale si hay sobre flujo ;ASCII => binario ;suma ltimo valor a AX ;Error si suma > 255 ;ms hasta acabar

;pone acarreo y sale

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

16-18

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

@@99: dec clc ret

si

;limpia acarreo y sale

ENDP

AscABin

;SACAESTADO exhibe el estado actual de redireccin de impresoras.

PROC
Cmp Je mov mov int jmp @@10 mov mov mov mov @@20: cmp jne mov mov int ret @@30: add mov mov mov int call mov mov int ret

SacaEstado [instalado],0 @@10 ah,[numeroID] al,01h 2Fh short @@20

;ver si programa ya instalado ;Brinca si no ;Usa la interrupcin multiplex ;(funcin 01h) para hallar ;cul impresora (si hay) est ;redirigida

al,[PtoSerie] bx,cs es,bx di,offset NomArch

;trae nmero de impresora ;apunta ES a este segmento ;apunta DI a nombre de archivo

al,0FFh @@30 ah,09h dx,offset msg2 21h

;Brinca si una impresora est ;actualmente redirigida ;saca aviso "Ninguna impresora ;redirigida" ;y sale

al,31h [msg3+3],al dx,offset msg3 ah,09h 21h dos_out ah,09h dx,offset rcnl 21h SacaEstado

;Convierte nmero de impresora ;a ASCII y lo salva ;exhibe nombre de impresora

;exhibe nombre de archivo ;fin de lnea

ENDP

;DOS_OUT saca la cadena ASCIIZ apuntada por ES:DI.

PROC
mov or jz mov int inc jmp

dos_out dl,[es:di] dl,dl @@99 ah,02h 21h di dos_out

;trae un carcter ;sale si es cero ;salida usando DOS ;funcin 02h ;Avanza DI al siguiente ;sigue hasta acabar 16-19

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

@@99: ret

ENDP ENDS end 3.2

dos_out

salto

Formar el programa DESVIA.COM con los siguientes comandos: C\SEM386>tasm desvia C\SEM386>tlink /t desvia

3.3

Ejecutar DESVIA enrutando la impresora 1 al archivo SALIDA.PRN mediante: C:\SEM386>desvia prn1=salida.prn /B=8 Mandar ahora un archivo tipo texto a LPT1 o ejecutar ImprPant: y al terminar exhibir SALIDA.PRN en la pantalla.

3.4

Ejecutar el programa DESVIA de nuevo, dando la opcin /C para cancelar la redireccin: C:\SEM386>desvia /C

EJEMPLO DE CORRIDA DE DESVIA CAPTURADA CON EL MISMO DESVIA:


C:\>cd sem386 C:\SEM386>del salida.prn No se encontr el archivo C:\SEM386>desvia prn1=salida.prn DESVIA 2.1 captura salida a impresora De: Seminario de Lenguaje ensamblador 80386 DESVIA instalado PRN1: esta ahora redirigida a C:\SEM386\SALIDA.PRN C:\SEM386>dir *.lib/w El volumen de la unidad C es MS-DOS_6 El nmero de serie del volumen es 15CF-351C Directorio de C:\SEM386 A387.LIB CASIO.LIB MYSTUFF.LIB TAM.LIB REM.LIB 7 archivo(s) 139,046 bytes 129,130,496 bytes libres NOR.LIB PF.LIB

C:\SEM386>desvia DESVIA 2.1 captura salida a impresora


AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

16-20

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

De: Seminario de Lenguaje ensamblador 80386 PRN1: esta ahora redirigida a C:\SEM386\SALIDA.PRN C:\SEM386>desvia /? Captura salida a impresora en un archivo. DESVIA [PRNn[:]=[[d:][ruta]NomArch]] [/B=largo] [/C] PRNn Especifica el nmero de impresora. /B=largo especifica el tamao del buffer interno en kilobytes (default =4 K). /C Cancela redireccin. Al correr DESVIA sin parmetros se exhibe el estado de la redireccin. C:\SEM386>desvia /B=5 DESVIA 2.1 captura salida a impresora De: Seminario de Lenguaje ensamblador 80386 el largo del buffer permanece fijo una vez instalado C:\SEM386>desvia /c DESVIA 2.1 captura salida a impresora De: Seminario de Lenguaje ensamblador 80386 Ninguna impresora actualmente redirigida C:\SEM386>desvia DESVIA 2.1 captura salida a impresora De: Seminario de Lenguaje ensamblador 80386 Ninguna impresora actualmente redirigida C:\SEM386>desvia prn1=salida.prn DESVIA 2.1 captura salida a impresora De: Seminario de Lenguaje ensamblador 80386 PRN1: esta ahora redirigida a C:\SEM386\SALIDA.PRN C:\SEM386> C:\SEM386>desvia /c DESVIA 2.1 captura salida a impresora De: Seminario de Lenguaje ensamblador 80386 Ninguna impresora actualmente redirigida C:\SEM386>desvia DESVIA 2.1 captura salida a impresora De: Seminario de Lenguaje ensamblador 80386 Ninguna impresora actualmente redirigida C:\SEM386>desvia prn1=salida.prn DESVIA 2.1 captura salida a impresora De: Seminario de Lenguaje ensamblador 80386 PRN1: esta ahora redirigida a C:\SEM386\SALIDA.PRN C:\SEM386>desvia prn = aa.txt DESVIA 2.1 captura salida a impresora De: Seminario de Lenguaje ensamblador 80386

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

16-21

LENGUAJE ENSAMBLADOR 80386

PRCTICA 16

numero de impresora invalido (debe ser PRN1, PRN2, o PRN3) C:\SEM386>

4.

TAREAS
4.1
Modificar DESVIA.ASM para que slo pueda salvar la salida a impresora en el archivo MMMDD.PRN; donde MMM es la abreviatura del mes y DD corresponde al da es decir que el nombre del archivo se forme automticamente. Hacer un programa ,TOMA, que sea prcticamente una copia de DESVIA pero que, en vez de capturar la salida a impresora, capture la entrada serial de uno de sus puertos COMx.

4.2

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS

16-22

Das könnte Ihnen auch gefallen