任务二

一、任务内容

要求:

  1. 在屏幕特定位置显示当前系统日期和时间;
  2. 显示的日期和时间要求即时更新,即设计为跳动的时钟;
  3. 可自定义电子钟的显示区域、显示位置、背景和前景色或以图形化方式显示;
  4. 当按下某个键,如“Q”时,程序返回DOS,数字钟消失。

提高:

再设计一款倒计时,倒计时时间由用户设定(如30分钟),时间到有提示(如时间背景、前景色变化或文本提示等)。

二、设计思路

 三、实现代码(该部分代码来自于一个博主文章)

//文件名2.asm

;===========
;数据段data
;===========
data    segmentcount    dw  1info   db  'Current time is:',0dh,0ah,'$'      ;提示语datestr db  '00-00-0000',0dh,0ah,'$'            ;日期显示信息:month-day-yeartimestr    db  '00:00:00',0dh,0ah,'$'              ;时间显示信息:hour:minute:second
data    ends
;===========
;代码段code
;===========
code    segmentassume   cs:code,ds:data
main    proc    far
start:mov   ax,datamov  ds,ax;调色、位置(时钟日期显示的位置以及背景色、字体颜色)mov ah,0        mov     al,3    int 10hmov  ah,6mov     al,0        ;al=0 全屏幕为空白mov    bh,00000100b    ;背景色0000黑色,0100红色(黑底红字)mov ch,0            ;左上角行号mov   cl,0            ;左上角列号mov   dh,50h          ;右下角行号mov   dl,50h          ;右下角列号int 10h   ;保存原中断向量mov al,1chmov   ah,35hint   21h     ;获取1ch中断向量到es:bxpush     espush  bxpush  ds      ;保存;设置新的中断向量mov dx,offset intpromov ax,seg intpromov    ds,axmov    al,1chmov   ah,25hint   21h                 ;设置中断向量ds:dxpop  dsin    al,21h              ;读中断屏蔽寄存器and    al,11111110b    ;开定时器中断out 21h,al               ;写中断屏蔽寄存器sti                        ;开中断;等待中断
s:mov   ah,1int     21hcmp  al,'q'        ;'q'退出jz  quitjmp     s;恢复1ch原中断向量
quit:   pop     dxpop   dsmov   al,1chmov   ah,25hint   21h;调色、位置(跳出时钟效果后的背景色以及字体颜色)mov   ah,00hmov   al,03hint   10hmov  ah,06hmov   al,00h      ;al=0 全屏幕为空白mov    bh,00000111b    ;背景色0000黑色,
0111白色(黑底白字)mov   ch,0h       ;左上角行号mov   cl,0h       ;左上角列号mov   dh,50h      ;右下角行号mov   dl,50h      ;右下角列号int   10h mov     ax,4c00hint     21hmain     endp
;------------------------------------------------------
;中断处理intpro
;------------------------------------------------------
intpro  proc    near
;保护现场push   dspush  axpush  cxpush  dxmov   ax,datamov  ds,axstidec     countjnz    exit;显示提示("current time is:"的显示位置)mov  ah,02hmov   bh,0h           ;页号mov  dh,0ah          ;行号mov  dl,20h      ;列号int  10hmov   dx,offset infomov  ah,09hint   21hcall     dispdatecall    disptimemov     count,18exit:clipop     dxpop   cxpop   axpop   dsiret
intpro  endp
;----------------------------------------------------------
;显示日期子程序dispdate
;----------------------------------------------------------
dispdate    proc    nearpush    ax      ;al星期push   cx      ;cx年push    dx;     ;dh月  dl日push   si
;获取系统日期:入口:ah<-2ah  出口:cx<-year   dh<-month  dl<-day  mov     ah,2ah      ;2ah取系统日期int    21hmov  ax,cx       ;年份转4为ASCII码mov     bx,10       lea     si,datestr+9   ;指向字符串年份最后一位mov     cx,4        ;年份4位,循环4次push   dx          ;保存月日
y:xor   dx,dx       ;dx清零,保存余数即个位div     bx          ;商存ax,余数存dxadd   dl,30hmov   [si],dldec  siloop  ypop    dx          ;还原dx,处理日mov     al,dlxor    ah,ahdiv    bl          ;求日的个位,存ah,十位存aladd   ax,3030h    ;分别转ASCII码sub   si,2mov     [si],ax     ;存日mov  al,dh       ;处理月xor     ah,ahdiv    bl          ;求月的个位,存ah,十位存aladd   ax,3030h        ;分别转ASCII码sub   si,3mov     [si],ax     ;存日;显示提示(月-日-年显示位置)mov  ah,02hmov   bh,0h           ;页号mov  dh,0bh          ;行号mov  dl,22h      ;列号int  10h
;显示日期字符串    mov     dx,offset datestrmov    ah,09hint   21hpop  sipop   dxpop   cxpop   axret
dispdate    endp
;----------------------------------------------------------
;显示时间子程序disptime
;----------------------------------------------------------
disptime    proc    nearpush    axpush  cxpush  dxpush  si
;获取系统时间:入口:ah<-2ch,出口:ch<-hour,cl<-minute,dh<-secondmov    ah,2chint   21hmov  bl,10lea    si,timestrmov   al,ch       ;处理小时xor    ah,ahdiv    bladd   ax,3030hmov [si],axadd  si,3mov al,cl       ;处理分xor ah,ahdiv    bladd   ax,3030hmov [si],axadd  si,3mov al,dh       ;处理秒xor ah,ahdiv    bladd   ax,3030hmov [si],ax
;显示提示(时:分:秒显示的位置)mov    ah,02hmov   bh,0h           ;页号mov  dh,0ch          ;行号mov  dl,23h      ;列号int  10h
;显示时间字符串        mov dx,offset timestrmov    ah,09hint   21hpop  sipop   dxpop   cxpop   axret
disptime    endp
code    endsend     start

四、调试结果及分析

分析:任务二不管在代码量上还是在思路上都比任务一难很多。还好老师给出了一部分的代码,不然真的不知道怎么下手。根据老师代码只需要将不断输出的时间改为在同一位置输出跳动。比如秒需要在同一位置跳动,就需要不断清空数据,然后输出数据,不断循环从而达到时钟实时跳动的效果。同时设置时钟显示的位置以及颜色。当输入’q’后,就恢复1ch原中断向量,重新设置跳出时钟效果后的背景色以及字体颜色(00000111黑底白字)。

操作指令:

运行结果:

加分题:

倒计时:设计一款倒计时,倒计时时间由用户设定(如30分钟),时间到有提示(如时间背景、前景色变化或文本提示等)。

设计思路:

代码部分(该部分代码来源于一个博主):

;================
;数据段data
;================
data    segmentsinput       db  'Please enter hours, minutes, and seconds : $' soutput        db  'Any key to again and ESC to return.Time is : $' buf      db  20hdb   0db     20h     dup(0)timehour  dw  0   ;时timeminute    dw  0   ;分timesecond    dw  0   ;秒num       dw  ?
data    ends
;===============
;堆栈段stack
;===============
stack   segment para    stackdw 30h dup(0)
stack   ends
;===============
;代码段CODE
;===============
code    segmentassume   cs:code,ds:data,ss:stack
start:mov   ax,datamov  ds,axmov    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的方式3out   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          ;crmov  ah,2            ;显示一个字符int  21h         ;调用系统dos中断mov   dl,0ah          ;lfmov  ah,2            ;显示一个字符int  21h         ;调用系统dos中断mov   ah,09h          ;显示字符串lea   dx,sinput       ;取段内偏移地址int     21h         ;调用系统dos中断mov   ah,0ah          ;键盘输入到缓冲区lea    dx,buf          ;取段内偏移地址int 21h             ;调用系统dos中断call  inputtime   ;调用子程序处理字符串mov  ah,09h      ;显示字符串lea   dx,soutput  ;取段内偏移地址int 21h         ;调用系统dos中断mov   dx,100          ;初始化为0mov   al,11111100b    ;开键盘和定时器中断out   21h,al          ;中断屏蔽寄存器数据传回去re:mov ah,08h      ;无回显键盘输入到alint  21h         ;调用系统dos中断cmp   al,27       ;按键是否ESCje  do_esc      ;是退出 cmp    al,252      ;按键是否是指定字符je    re          ;是循环mov al,11111101b    ;关定时器中断out  21h,al          ;中断屏蔽寄存器数据传回去jmp    timing          ;不是就重新对时
do_esc:mov  al,11111101b    ;关定时器中断out  21h,al          ;中断屏蔽寄存器数据传回去
;退出代码mov    ah,4chint   21h
;----------------------
;输入数字inputtime
;----------------------
inputtime   proc;初始化mov dx,0mov bx,10mov    si,2mov num,0mov    ax,0mov cx,0
lop:mov al,buf[si]  ;寄存器相对寻址,从缓冲区取一个字符cmp    al,0dh      ;是否是crje    final       ;等于就跳转,JNE相反sub  al,30h      ;减30h,从ASCII码转数字cmp  num,0       ;与0比较,相当于判断初始化je do_deal     ;等于就跳转,JNE相反push ax      ;当前数字压入栈中mov    ax,num      ;当前数送入运算寄存器中mul bx          ;隐含寻址,在ax中,相当于num乘以10mov  num,ax      ;运算结果存进num中  pop    ax          ;之前的数据弹出
do_deal:add num,ax      ;加上之前的数据mov ax,0        ;清零inc  si          ;自加1mov al,buf[si]      ;寄存器相对寻址,从缓冲区取一个字符cmp    al,' '        ;是否是空格je    do_space    ;等于就跳转,JNE相反jmp  lop         ;跳转,处理下一个
do_space:inc    si          ;偏移量再自加1,跳过空格mov dx,num      ;把num存起来mov num,0       ;原先数清零inc   cx          ;标志自加1cmp   cx,1        ;与1比较,判断是不是时je   hour        ;等于就跳转,JNE相反cmp  cx,2        ;与2比较,判断是不是分je   minute      ;等于就跳转,JNE相反jmp  lop         ;跳转,处理下一个
hour:mov    timehour,dx ;把时传送到变量jmp lop         ;跳转,处理下一个
minute:mov  timeminute,dx   ;把分钟传送到变量jmp    lop             ;跳转,处理下一个
final:mov   dx,num          ;把num存起来mov timesecond,dx   ;把秒传送到变量
;换行mov  dl,0dh      ;crmov  ah,2        ;显示一个字符int  21h         ;调用系统dos中断mov   dl,0ah      ;lfmov  ah,2        ;显示一个字符int  21h     ;调用系统dos中断ret           ;子程序退出重置堆栈
inputtime   endp
;-----------------------------
;显示数字num shownum
;-----------------------------
shownum proc;第一位mov bl,100      ;%先除100mov  ax,num      ;送入运算寄存器div bl          ;除法,ax隐含寻址add    al,30h      ;商转换为ASCII码push ax      ;将余数先压入栈中cmp    al,30h      ;看一看首位是不是0je    bittwo      ;若是,则不显示直接跳转到下一个mov  dl,al       ;传送字符mov    ah,2        ;显示一个字符int  21h     ;调用系统dos中断
bittwo:pop  ax      ;将余数取出;第二位mov   al,ah       ;送入运算寄存器mov ah,0        ;高位清零mov    bl,10       ;%再除以10div  bl          ;除法,ax隐含寻址add    al,30h      ;商转换为ASCII码push ax      ;将余数先压入栈中mov    dl,al       ;传送字符mov    ah,2        ;显示一个字符int  21h     ;调用系统dos中断pop   ax      ;将余数取出;第三位add   ah,30h      ;余数转换为ASCII码mov dl,ah       ;传送字符mov    ah,2        ;显示一个字符int  21h     ;调用系统dos中断ret           ;子程序退出重置堆栈
shownum endp
;-------------------------
;08h计数器中断 int08h
;------------------------
int08h  proc    near;保护现场push   axpush  bxpush  cxcmp   dx,100      ;计数达到100,执行一次,相当于1s一次jge  count       ;大于等于100就跳转jmp  endint      ;没达到就结束中断响应
count:mov   dx,0        ;计数值清零push  dx      ;保存计数值mov   ah,03h      ;获取光标位置信息int    10h         ;BIOS中断push dx          ;将获得的信息压入栈中mov  ax,timehour     ;传送指令mov    num,ax          ;传送指令call   shownum     ;调用子程序显示数字mov   dl,':'mov ah,2        ;显示一个字符int  21h         ;调用系统dos中断mov   ax,timeminute   ;传送指令mov    num,ax          ;传送指令call   shownum     ;调用子程序显示数字mov   dl,':'mov ah,2        ;显示一个字符int  21h         ;调用系统dos中断mov   ax,timesecond   ;传送指令mov    num,ax          ;传送指令dec    ax              ;秒数自减1mov   timesecond,ax   ;传送指令call   shownum     ;调用子程序显示数字pop   dx          ;将之前的光标信息从栈中取出mov   bh,0        ;显示到第一页mov  ah,02h      ;设置光标位置int  10h         ;BIOS中断pop  dx;进位处理cmp  timesecond,0    ;小于等于0,退一位jle    secondcarry     ;秒数jmp  endint          ;中断返回
secondcarry:mov timesecond,59   ;秒数得到借位dec  timeminute      ;分钟自减1cmp   timeminute,0    ;小于等于0,退一位jle    minutecarry     ;分钟退位jmp    endint          ;中断返回
minutecarry:mov timeminute,59   ;分钟得到借位dec  timehour        ;小时自减1cmp   timehour,0      ;小于等于0,清零退出jle   hourcarry       ;清零退出jmp    endint          ;中断返回
hourcarry:mov   timehour,0  ;清零jmp  endint      ;中断返回
endint:;中断返回mov al,20hout   20h,al      ;发送中断结束指令;恢复现场pop   axpop   bxpop   cxinc   dx          ;计数加一iret           ;中断返回
int08h  endp
code    endsend start

运行结果:

分析:在网上找了很多关于计时器的代码,一个个试,终于找到了一个可以运行成功的计时器,然后通过对代码的理解(有些代码还是不能理解)。之后我直接在计时器代码上修改,只改变了计算时间部分的代码实现了递减的效果。

汇编课程设计——时钟相关推荐

  1. java模拟时钟课程设计_java课程设计-时钟图形模拟

    java课程设计-时钟图形模拟 计算机与信息工程系 <高级语言程序设计>课程设计报告课 程 设 计 任 务 书专 业 通信工程 班 级 13 级四班 姓 名 张凯铭设 计 起 止 日 期设 ...

  2. java时钟课程设计,Java课程设计-时钟图形模拟

    <Java课程设计-时钟图形模拟>由会员分享,可在线阅读,更多相关<Java课程设计-时钟图形模拟(19页珍藏版)>请在人人文库网上搜索. 1.课 程 设 计 任 务 书专 业 ...

  3. 英语字母表计算机,计算机汇编课程设计CCCC.pdf_给定一个英文ascii码文件,统计文件中英文字母的频率,以十进制形式输出。,wwwwwxxxxx...

    1.给定一个英文ASCII码文件,统计文件中英文字母的频率,以十进制形式输出. 2.用递归计算n!(n≥50), 以十进制数输出 输入一个不小于50的整数n,用递归计算n!, 以十进制数输出 3.存储 ...

  4. 小球碰壁反弹加分_汇编课程设计——小球碰壁

    汇编语言程序设计 课程设计说明书 一.需求分析 功能需求: 对小球的描绘. 移动以及碰撞反弹的运动情况. 画球的主要思路是画出圆心 相同. 半径依次递减的圆组合起来即可得到一个球, 其核心算法是 Br ...

  5. android课程设计时钟,单片机制作的电子钟(含闹钟功能)课程设计报告

    #include #include unsigned char code displaywelcome[]={" Welcome To My Lcd Timer"};//欢迎界面 ...

  6. 汇编课程设计:音乐播放器详解

    程序说明: 这是一个音乐程序,按大写字母"A",唱乐曲"玛丽有只小羔羊": 按大写字母"B",唱乐曲"太湖船" 按大写字 ...

  7. 汇编课程设计:汽车小鸟动画

    程序说明: 说明 运行可执行程序CAR.exe,选择1,小鸟飞过:选择2,汽车开过:选择3,退出. 函数图: DATA SEGMENT ;数据段 INFO1 DB 0DH,0AH,'INPUT 1,2 ...

  8. 51单片机课程设计——利用51单片机的定时器设计一个时钟论文

    计科在读,分享自己做过的作业,欢迎指正,有需要课程设计论文的可以私信我 摘要 单片机是一种数字集成电路芯片,是指集成在一块芯片上的微型计算机.一个比较完整的单片机应该包括微处理器(CPU). 存储器( ...

  9. c语言图形时钟编程,C语言图形时钟课程设计实验报告.doc

    C语言图形时钟课程设计实验报告.doc 目录 1.系统功能要求 . 2. 数据结构设计及 说明 . 3.程序结构(画流程图) . 4.各模块的功能 . 5.试验结果(包括输入数据和输出结果) . 6. ...

最新文章

  1. C02-程序设计基础提高班(C++)第9周上机任务-类和对象
  2. H2DBEngine——Driver的设计与实现
  3. 048_String对象
  4. PAT甲级1088 Rational Arithmetic:[C++题解]分数的加减乘除
  5. 服务器系统检测报告自动生成,生成allure测试报告之后,服务器端口无法访问查看生成的report,可能是这样引起的。...
  6. 第一章-从双向链表学习设计
  7. 数据库表的字段中含空格怎么办?
  8. Shiro实战hello
  9. 前5月全国快递业务量累计完成396.5亿件 同比增50.1%
  10. ckeditor 部分保存按钮去除_怎样去除mp4视频中的水印呢
  11. 批处理顺序执行多条命令
  12. python游戏程序代码大全_童年游戏,Python一行代码就能实现!
  13. 微信 openid 变吗?
  14. V2VNet: Vehicle-to-Vehicle Communication for Joint Perception and Prediction
  15. python操作gif 图片拆分
  16. 研究War3编辑器(2):地图编辑器基本操作
  17. python软件是免费的吗-python免费吗
  18. 高中数学知识点:集合知识讲解
  19. linux、centOS虚拟机出现entering emergency mode解决方案
  20. 嵌入式开发 SRAM SROM DRAM DROM DDR NAND FLASH EMMC 区别

热门文章

  1. Tkinter 简介
  2. 怎么查看电脑显卡版本?
  3. 2020年全国职业院校技能大赛改革试点赛样卷三
  4. [5G][NR] BWP (Bandwidth Part)
  5. UML参考手册 第三部分  参 考 资 料 第13章 术 语 大 全 二
  6. No visible constructors in class
  7. GBase 8a Kafka 数据同步
  8. PHPWORD 实现单元格内同一行文字设置不同的样式比如不同颜色不同大小粗细是否斜体等等
  9. 曼哈顿距离与切比雪夫距离的互化
  10. office word使用教程