Escribir un cronómetro electrónico sencillo en lenguaje ensamblador
DB 256 DUP(?)
S_SEG ENDS
D_SEG SEGMENT
COUNT DB 0; Es 0
TENM DB '0' ;Unidad de cronometraje de 10 minutos, el valor inicial es 0
MINUTE DB '0:' ;Unidad de cronometraje de minutos, el valor inicial es 0
TENS DB '0' ;Unidad de cronometraje de 10 segundos, el valor inicial es 0
SECOND DB '0.' ;Segunda unidad de cronometraje, el valor inicial es 0
HAOM DB ' 0' ;Unidad de tiempo de 10 milisegundos, el valor inicial es 0
HAO DB '8', '$' ;Unidad de tiempo de milisegundos, el valor inicial es 0
HAO DB ' 8', '$' ;Unidad de tiempo de milisegundos, el valor inicial es 8
D_SEG ENDS
C_SEG SEGMENT
ASSUME CS:C_SEG ,SS:S_SEG p>
INICIO: MOV AX,D_SEG
MOV DS:D_SEG
MOV DS:D_SEG
MOV DS:D_SEG
MOV DS :D_SEG
MOV DS,AX
CLI; primero apague la interrupción y obtenga INT1CH
MOV AX,351CH Llame al número de función del sistema; 35H
INT 21H ;Regresar ES:BX=Vector de interrupción (Segmento:Desplazamiento)
PUSH BX ;Guardar el vector de interrupción original INT1CH en la pila
PUSH BX ; Guarde el vector de interrupción original INT1CH en la pila.p>
PUSH ES
STI ;Active las interrupciones y haga que el teclado funcione
MOV AH,1 ;Esperar pulsaciones de teclas
INT 16H
CLI ;Desactivar interrupciones
MOV DX,SEG TIMER ;Establecer nuevo vector de interrupción
MOV DS, DX
MOV DX,OFFSET TIMER ;DS.DX= nuevo vector de interrupción
MOV DS.DX= nuevo vector de interrupción DX= nuevo vector de interrupción (segmento: offset)
MOV AX,251CH
INT 21H
STI ; Enciende la interrupción nuevamente para que el teclado y INT1CH funcionen
COMPROBAR: MOV AH ,1 ; Verifique el código de clave
INT 16H
JZ DISPLAY1 ;Si no se puede leer ningún código, salte a la pantalla (sistema DISPLAY reservado)]
MOV AH ,0 ;Si ningún código es legible, debe Leer
INT 16H
CMP AL ,51H ;Es 'Q '
JE OVER ;Sí, regresar a DOS
DISPLAY1: MOV AX, D_SEG ;No, mostrar
MOV DS , AX
ASUMIR DS: D_SEG
LEA DX , TENM ;DS: DX= Mostrar dirección de cadena
MOV AH , 9 ;Mostrar mm : ss.msms
INT 21H
JMP CHECK ;Ret
urn para VERIFICAR, el bucle continúa
OVER: CLI
POP DS Recupera el vector INT1CH original de la pila
POP DX<
MOV AX, 251CH; configura INT1CH y restaura el vector original
INT 21H
STI; activa la interrupción
MOV AX, 4C00H; regresa a DOS
INT 21H
;La siguiente es la subrutina del servicio de interrupción usando INT 1CH
TIMER PROC FAR
PUSH AX
MOV AX, D_SEG
MOV DS, AX
ASUME DS: D_SEG
INC COUNT La unidad de tiempo aumenta en 1
CMP COUNT, ' 2 ' ;Si alcanza los 110 milisegundos
JL EXIT ;Si no, regresa
MOV COUNT,'0' ;Si es así, borre la unidad de tiempo 0 p>
INC HAOM ;La unidad de tiempo de 10 milisegundos se incrementa en 1
CMP HAOM ,'9' ;Si llega a 1 segundo
JLE EXIT ;Si no, regresa
INC SECOND ; Si es así, el segundo contador se incrementa en 1
MOV HAOM ,'0' ;Se borra una unidad de 10 milisegundos
CMP SECOND ,'9 ' ;A 10 segundos o no
p>
JLE EXIT ;Si es menor, regresa
MOV SECOND ,'0' ;Si llega, el segundo tiempo la unidad se borrará
INC TENS ;incremento de unidad de 10 segundos 1
CMP TENS ,'6' ;a 60 segundos o no
JL EXIT ;menos de , luego regresa
MOV TENS ,'0 ' ;a , luego la unidad de 10 segundos se borra a 0
INC MINUTE ;la unidad de minutos se borra a 0
CMP MINUTE ,'9' ;a 10 minutos no es
JLE EXIT ;Si es menor, regresará
MOV MINUTE ,'0' ;Cuando llegue, el La unidad del temporizador de minutos se borrará
INC TENM ;La unidad del temporizador de 10 minutos aumentará en 1
CMP TENM ,'6' ;No a 60 minutos
JL EXIT ;Si no, regresa
MOV TENM ,'0' ;Si es así, cuenta 10 minutos Borra el cronómetro y reinicia el cronómetro
SALIDA: POP AX
IRET
TIMER FINALIZAR
C_SEG FINALIZA
END INICIO