Beruflich Dokumente
Kultur Dokumente
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
;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
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
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
di es [cs:BandInt],0 @@20
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
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
ENDP
;IntImpre
IntReloj
manipula interrupcin 17h.
PROC
cmp jne @@10: jmp @@20: cmp jne cmp ja push push
;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
;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
PRCTICA 16
@@50: mov cmp je @@60: mov pop pop iret @@70: mov pop pop iret
;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.
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
PRCTICA 16
vacia es di
ENDP
[cs:int21h] IntDOS
manipula interrupcin 28h.
; 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
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
PRCTICA 16
[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
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
;Salva registro de banderas ;Brinca si AH tiene el ;nmero ID de multiplexar ;Repone banderas ;Ejecuta la interrupcin
;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
PRCTICA 16
iret
;Funcion 01h reporta el estatus de la redireccin.
;Retorna de la interrupcin
;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
;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
ENDP
IntMplex
PROC
push
vacia ax bx cx dx ds
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
PRCTICA 16
ah,40h cx,[ds:bytes] dx,dx ds,[ds:SegBuf] assume ds:nothing int 21h mov int ah,3Eh 21h
;Cierra archivo
ds dx cx bx ax vacia
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
PRCTICA 16
ENDP
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
Assume
ds:_text inicio
PROC
cld mov call jnc
;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
PRCTICA 16
ah,09h dx,offset ayudar 21h ax,4C00h 21h ah,09h dx,offset derechos 21h
mov mov int cmp jae error: mov int mov int @@20: push call jnc mov mov @@30: pop
;Salva ES ;ver si copia esta instalada ;Brinca si no ;pone bandera si ;tambin salva nmero ID ;Repone ES
@@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
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
16-10
PRCTICA 16
;Halla parmetro ;Brinca si no fin de lnea ;sale del lazo de anlisis ;Brinca si el carcter ;no es una diagonal
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
;Inicia puntero de error ;Error si no es una "C" ;Cancela redireccin ;Retorna a lazo interno
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
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
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
;sale si error
;cierra el archivo
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 16
si,[ds:DirFinL] si @@70
;apunta SI a fin de NomArch ;Avanza tras del byte nulo ;regresa por mas
hecho: cmp jne cmp Jne Inc jmp @@140: cmp je mov mov mov mov int @@150: call mov int
;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
;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
;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
;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
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
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
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
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
;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
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
PRCTICA 16
@@99
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
si
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
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
16-16
PRCTICA 16
si
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
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
ax cx
;Salva AX y CX
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
16-17
PRCTICA 16
;Interrupcin 2Fh ;Brinca si AL = 0 ;Retira AX y CX ;Incrementa numero ID ;sigue hasta acabar ;con CF puesto
x x
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
;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
;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
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIN: PROFESOR PABLO FUENTES RAMOS
16-18
PRCTICA 16
si
ENDP
AscABin
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
;ver si programa ya instalado ;Brinca si no ;Usa la interrupcin multiplex ;(funcin 01h) para hallar ;cul impresora (si hay) est ;redirigida
;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
ENDP
PROC
mov or jz mov int inc jmp
;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
PRCTICA 16
@@99: ret
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
16-20
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
PRCTICA 16
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