前言
- 时间:12.1
- 内容:汇编语言课程设计附加题
- 备注:
- 计时器是某位大佬的(或者书上),但是我真的找不到这位大佬(或者书),如有见到比较像的请帮我蟹蟹他!!
- 正所谓病急乱投医,这看起来人畜无害的附加题完全没有她看起来这么平平无奇好不好!!网上现有的资源为什么都答非所问,或者只是本兜兜最近菜吃多了变得更菜了,只能嫖无数资源一个个试。试成功了下方这个计时器,倒计时仅更改了计算时间部分,不用整串操作太香了!!
- 话说.asm格式应该用什么代码块发布呢?没有高亮的代码能逼死小白菜…
题目
- 设计一款倒计时,倒计时时间由用户设定(如30分钟)。
时间到有提示(如时间背景、前景色变化或文本提示等)。
- 打脸来的太快,发现这次课设很多都没有读题按要求来,凑合吧就…
流程图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201201171713931.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h5aWRvbA==,size_16,color_FFFFFF,t_70)
计时器
DATAS SEGMENT
SINPUT DB 'Please enter hours, minutes, and seconds with spaces: $'
SOUTPUT DB 'Any key to again and ESC to return. Now time is : $'
BUF1 DB 20H
DB 0
DB 20H DUP(0)
TIMEHOUR DW 23
TIMEMINUTE DW 56
TIMESECOND DW 45
NUM DW ?
DATAS ENDS
STACKS SEGMENT PARA STACK
DW 30H DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AL,11111101B;关定时器中断
OUT 21H,AL;中断屏蔽寄存器数据传回去
PUSH DS;保存数据段地址
MOV AX,SEG INT08H;SEG取得标号的段地址
MOV DS,AX;获得08H号中断的段地址,放在中断向量中
MOV DX, OFFSET INT08H;获得08H号中断的偏移地址,放在中断向量中
MOV AL,08H;设置中断号
MOV AH,25h;设置中断向量
int 21h;调用系统dos中断
POP DS;恢复数据段地址
MOV AL,00110110B;设置通道0的方式3
OUT 43H,AL;输出控制字,43H是8253定时器芯片的控制寄存器地址
MOV AX,11932;定时器的时钟频率为1.1931817MHz,计数初值=1193182/100,10ms中断一次
OUT 40H,AL;40H为计数器地址
MOV AL,AH;先输出低位,再输出高位
OUT 40H,AL;40H为计数器地址
TIMING:
;换行
MOV DL,0DH;CR
MOV AH,2;显示一个字符
INT 21H;调用系统dos中断
MOV DL,0AH;LF
MOV AH,2;显示一个字符
INT 21H;调用系统dos中断
MOV AH,09H;显示字符串
LEA DX,SINPUT;取段内偏移地址
INT 21H;调用系统dos中断
MOV AH,0AH;键盘输入到缓冲区
LEA DX,BUF1;取段内偏移地址
INT 21H;调用系统dos中断
CALL INPUTTIME;调用子程序处理字符串
MOV AH,09H;显示字符串
LEA DX,SOUTPUT;取段内偏移地址
INT 21H;调用系统dos中断
MOV DX,100;初始化为0
MOV AL,11111100B;开键盘和定时器中断
OUT 21H,AL;中断屏蔽寄存器数据传回去
RE:
MOV AH,08H;无回显键盘输入到AL
INT 21H;调用系统dos中断
;MOV AH,0;
;MOV NUM,AX;
;MOV AH,03H;获取光标位置信息
;INT 10H;BIOS中断
;ADD DL,10;
;MOV BH,0;显示到第一页
;MOV AH,02H;设置光标位置
;INT 10H;BIOS中断
;CALL SHOWNUM
CMP AL,27;按键是否ESC
JE DO_ESC;是退出
CMP AL,252;按键是否是奇怪的那个字符
JE RE;是奇怪的,循环
;MOV AH,0BH;检测键盘状态,有输入AL=00,无输入AL=FF
;INT 21H;调用系统dos中断
;CMP AL,0FFH;判断按键无输入
;JE RE;确实无输入,重复
MOV AL,11111101B;关定时器中断
OUT 21H,AL;中断屏蔽寄存器数据传回去
JMP TIMING;不是就重新对时
DO_ESC:
MOV AL,11111101B;关定时器中断
OUT 21H,AL;中断屏蔽寄存器数据传回去
;退出代码
MOV AH,4CH
INT 21H
;这是一段子程序,用来输入数字
INPUTTIME PROC
;初始化
MOV DX,0
MOV BX,