|
18鱼币
已知int 21h是DOS中断,当AH=2CH,获取系统的时间,CH=小时CL=分钟DH=秒,DL=百分秒。
例如:
MOV AH,2CH
INT 21H
则指令执行后,则当前时间存放在CH=小时CL=分钟DH=秒,DL=百分秒。
请设计一个电子时钟,实现在终端显示当前时间,显示格式为:HH:MM:SS:us。例如:显示08:01:00:000,然后数字不断变化。
思路:不断的循环中读取系统时间,将时间的CH,CL,DH,DL寄存器在指定显存中按指定格式显示。
基于X86的代码
.model small
.stack 100h
.data
disp_str db "Current time: HH:MM:SS:us$"
time_str db " $"
hour db ?
min db ?
sec db ?
msec db ?
colon db ':'
zero db '0'
.code
main:
mov ax, @data
mov ds, ax
mov ah, 0Ch ; 调用int 21h中断,功能码AH=0Ch,设置文本和背景颜色
mov al, 0Eh ; 黑底白字
int 10h ; 调用int 10h中断,设置屏幕颜色
lea si, disp_str ; 打印显示信息字符串
mov ah, 09h
mov dx, si
int 21h
loop:
mov ah, 2Ch ; 获取当前时间
int 21h
mov hour, ch ; 将当前的小时数保存到变量hour中
mov min, cl ; 将当前的分钟数保存到变量min中
mov sec, dh ; 将当前的秒数保存到变量sec中
mov msec, dl ; 将当前的百分秒数保存到变量msec中
; 将各个时间变量转换为字符串
call convert_hour
call convert_min
call convert_sec
call convert_msec
; 将时间字符串写入指定显存区域
lea si, time_str
mov di, 0B800h ; 显存地址
mov cx, 16 ; 时间字符串长度
rep movsb ; 将字符串写入显存
; 休眠一段时间
mov cx, 12500d ; 大约100ms
call delay
; 跳转回循环开始,继续更新时间
jmp loop
; 在左侧添加0以保持两位数的格式
add_zero:
cmp al, 10 ; 判断是否小于10
jge skip ; 若大于等于10则转到skip
mov ah, 0 ; 使得ah寄存器置0
mov al, zero ; 让al寄存器变成'0'
lea si, time_str[si] ; 增加si的值,使得指向下一个字符
mov [si], al ; 将'0'写入显存中
skip:
ret ; 返回子程序
convert_hour:
mov al, hour ; 取出小时数
div byte ptr 10 ; 将小时数除以10
add al, '0' ; 将商转换为数字字符
mov [time_str+15], al ; 将数字字符写入字符串中
call add_zero ; 将个位数左侧补零
add byte ptr [time_str+14], colon ; 添加冒号
ret
convert_min:
mov al, min ; 取出分钟数
div byte ptr 10 ; 将分钟数除以10
add al, '0' ; 将商转换为数字字符
mov [time_str+12], al ; 将数字字符写入字符串中
call add_zero ; 将个位数左侧补零
add byte ptr [time_str+11], colon ; 添加冒号
ret
convert_sec:
mov al, sec ; 取出秒数
div byte ptr 10 ; 将秒数除以10
add al, '0' ; 将商转换为数字字符
mov [time_str+9], al ; 将数字字符写入字符串中
call add_zero ; 将个位数左侧补零
add byte ptr [time_str+8], colon ; 添加冒号
ret
convert_msec:
mov al, msec ; 取出百分秒数
push ax ; AX寄存器中保存百分秒数
mov al, 10d ; 除数是10
xor ah, ah ; ah寄存器清零
div al ; 将百分秒数除以10
pop ax ; 恢复百分秒数
|
最佳答案
查看完整内容
基于X86的代码
.model small
.stack 100h
.data
disp_str db "Current time: HH:MM:SS:us$"
time_str db " $"
hour db ?
min db ?
sec db ?
msec db ?
colon db ':'
zero db '0'
.code
main:
mov ax, @data
mov ds, ax
mov ah, 0Ch ; 调用int 21h中断,功能码AH=0Ch,设置文本和背景颜色
mov al, 0Eh ; 黑底白字
int 10h ; 调用int 10 ...
|