Red de conocimiento informático - Conocimiento sistemático - Escribir un cronómetro electrónico sencillo en lenguaje ensamblador

Escribir un cronómetro electrónico sencillo en lenguaje ensamblador

S_SEG SEGMENT STACK

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

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

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