8086汇编加DOS中断,按4键显示时间 首先提示用户对时,即用户输入时,分,秒(以空格或冒号分隔,以回车结束),然后,在屏幕上不断显示时间,格式为:××(时):××(分):××(秒),最好定点显示。用户按任一键,重新对时,按ESC键,返回主菜单。
时间: 2024-05-12 09:12:47 浏览: 30
以下是一个示例程序,它演示了如何使用8086汇编和DOS中断来实现上述功能:
```
.MODEL SMALL
.STACK 100H
.DATA
hour DB 0
minute DB 0
second DB 0
timeMsg DB 'Current time: $'
setMsg DB 'Please set the time (HH:MM:SS): $'
invalidMsg DB 'Invalid input. Please try again. $'
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
CALL ResetTime
CALL DisplayTime
LOOP:
MOV AH, 01H ; 检测键盘按键
INT 21H
CMP AL, '4'
JE SET_TIME
CMP AL, ESC
JE QUIT
JMP LOOP
SET_TIME:
CALL InputTime
CALL DisplayTime
JMP LOOP
QUIT:
MOV AH, 4CH ; 返回DOS
INT 21H
MAIN ENDP
; 重置时间为系统时间
ResetTime PROC
MOV AH, 2CH ; 获取系统时间
INT 21H
MOV hour, CH
MOV minute, CL
MOV second, DH
RET
ResetTime ENDP
; 显示当前时间
DisplayTime PROC
MOV AH, 2 ; 显示字符串
MOV DX, OFFSET timeMsg
INT 21H
MOV AH, 2 ; 显示小时
MOV DL, hour
CALL DisplayNumber
MOV AH, 2 ; 显示分
MOV DL, minute
CALL DisplayNumber
MOV AH, 2 ; 显示秒
MOV DL, second
CALL DisplayNumber
MOV AH, 2 ; 显示定点
MOV DL, ':'
INT 21H
MOV AH, 2 ; 显示定点
MOV DL, ':'
INT 21H
RET
DisplayTime ENDP
; 输入时间
InputTime PROC
MOV AH, 9 ; 显示字符串
MOV DX, OFFSET setMsg
INT 21H
MOV CX, 6 ; 读取6个字符
MOV SI, OFFSET hour
MOV AH, 0AH ; 读取字符串
INT 21H
CMP BYTE PTR [SI], '0'
JB InvalidInput
MOV SI, OFFSET minute
MOV AH, 0AH ; 读取字符串
INT 21H
CMP BYTE PTR [SI], '0'
JB InvalidInput
MOV SI, OFFSET second
MOV AH, 0AH ; 读取字符串
INT 21H
CMP BYTE PTR [SI], '0'
JB InvalidInput
RET
InvalidInput:
MOV AH, 9 ; 显示字符串
MOV DX, OFFSET invalidMsg
INT 21H
JMP InputTime
InputTime ENDP
; 显示一个十进制数
DisplayNumber PROC
PUSH AX
PUSH BX
MOV BX, 10 ; 除数为10
DIV BX ; AX = DX:AX / BX
ADD DL, '0' ; 将余数转换为字符
MOV AH, 2 ; 显示字符
INT 21H
POP BX
POP AX
RET
DisplayNumber ENDP
END MAIN
```
该程序首先调用ResetTime过程来将时间重置为系统时间。然后,它进入一个循环,不断检测键盘按键。如果用户按下4键,则调用InputTime过程来让用户输入新的时间。否则,程序调用DisplayTime过程来显示当前时间。
InputTime过程使用DOS中断21H来显示提示消息和读取用户输入。它首先显示一个提示消息,然后使用DOS中断0AH来读取用户输入的字符串。输入的字符串被存储在hour、minute和second变量中。如果用户输入的不是有效的时间格式,则显示一个错误消息并要求用户重新输入。
DisplayTime过程使用DOS中断21H来显示当前时间。它首先显示一个固定的消息“Current time:”,然后显示小时、分钟和秒数。它还在每两个数字之间显示一个冒号,以便将它们分隔开来。
在显示数字时,DisplayNumber过程被调用。它使用除法和模运算将数字分解为两个单独的数字,并将它们转换为ASCII字符。然后,它使用DOS中断21H来显示这两个字符。
最后,如果用户按下ESC键,则程序返回到DOS。否则,它继续循环等待用户的输入。