发的第二篇文章,尽管技术不牛,但还是希望给大家一些帮助。
大致讲一下内容,就是微机原理结课的一个课程设计,使用8086模拟器做一个数字时钟。也没有使用什么比较牛的技术,就是不停的用DOS中断(系统函数)去获取系统时钟,然后对获取的数据转换为对应的ACSII值,然后显示。(这里有初始化一个简单的提示信息)
代码如下:
datas segment
STR DB ‘2021/’
STR1 DB ‘present time:
′
S
T
R
2
D
B
′
e
x
i
t
:
p
l
e
a
s
e
e
s
c
!
' STR2 DB 'exit:please esc!
′STR2DB′exit:pleaseesc!’
datas ends
stacks segment;此处输入堆栈段代码
stacks ends
codes segment
assume cs:codes,ds:datas,ss:stacks
start:mov ax,datas
mov ds,ax
ready1:mov dh,00h;行数
mov dl,0 ;列数
mov bh,0 ;页数
mov ah,2
int 10h ;确定光标位置,使其居中
mov cx,2000h
mov ah,01h
int 10h ;设置光标类型,隐藏光标
;显示日期2021/
mov ax,datas
mov ds,ax
LEA bx, str
mov cx,5
llp:mov ah,02h
mov dl,[bx]
inc bx
int 21h
loop llp
;显示月份、日
ready2:
mov ah,2ah
int 21h
mov ax,dx
push ax
pop cx
push cx
xor ax,ax
mov al,ch
mov bl,10
div bl
mov bx,ax
mov dl,bl
add dl,30h
mov ah,02h
int 21h
mov dl,bh
add dl,30h;
int 21h
mov dl,’/’
int 21h
pop cx
xor ax,ax
mov al,cl
xor bx,bx
mov bl,10
div bl
mov bx,ax
mov dl,bl
add dl,30h
mov ah,02h
int 21h
mov dl,bh
add dl,30h
int 21h
;显示提示词
ready3:
mov dh,08h;行数
mov dl,35 ;列数
mov bh,0 ;页数
mov ah,2
int 10h ;确定光标位置,使其居中
mov cx,2000h
mov ah,01h
int 10h ;设置光标类型,隐藏光标
mov ah,9
LEA dx,STR1
int 21h
mov dh,0ch;行数
mov dl,35 ;列数
mov bh,0 ;页数
mov ah,2
int 10h ;确定光标位置,使其居中
mov cx,2000h
mov ah,01h
int 10h ;设置光标类型,隐藏光标
mov ah,9
LEA dx,STR2
int 21h
ready4:
;打印小时
mov dh,0ah;行数
mov dl,35 ;列数
mov bh,0 ;页数
mov ah,2
int 10h ;确定光标位置,使其居中
mov cx,2000h
mov ah,01h
int 10h ;设置光标类型,隐藏光标
mov ah,2ch
int 21h
;push dx
push cx
;xor dl,dl
pop cx
;push cx
xor ax,ax
;mov ax,ch
mov al,ch
mov bl,10
div bl
;mov bx,ax
mov dx,ax
;mov dl,bl
add dl,30h
mov ah,02h
int 21h
mov dl,dh
add dl,30h
int 21h
mov dl,':'
int 21h
go:
mov dh,0ah;行数
mov dl,38 ;列数
mov bh,0 ;页数
mov ah,2
int 10h ;确定光标位置,使其居中
mov cx,2000h
mov ah,01h
int 10h ;设置光标类型,隐藏光标
mov ah,2ch
int 21h
push dx
push cx
;打印分
pop cx
xor ah,ah
mov al,cl
mov bl,10
div bl
;mov bx,ax
mov dx,ax
;mov dl,bl
add dl,30h
mov ah,02h
int 21h
mov dl,dh
add dl,30h
int 21h
mov dl,':'
int 21h
;打印秒
;xor dx,dx
pop cx
xor ax,ax
mov al,ch
mov bl,10
div bl
mov dx,ax
add dl,30h
mov ah,02h
int 21h
mov dl,dh
add dl,30h
int 21h
a1: mov ah,0bh ;调用dos功能0bh检测键盘是否有输入
int 21h
cmp al,00h
jne a2 ;如果有输入,则跳转到a2
jmp go ;如果没有输入,则跳转到go
a2: mov ah, 08h
int 21h ;调用dos功能08h判断键盘输入的字母
cmp al,1bh ;判断键盘是否输入esc
je exit ;如果输入esc跳转到exit
jmp go ;重新跳回开头
exit:mov ah, 4ch
int 21h
codes ends
end start
运行结果如下:
如果在emu8086模拟器上运行时有跳秒的现象请看一下心得。(最后答辩的时候老师解释是模拟器上就这样,用DOSBox就好很多)
一,理论不等于实践。以我们起初的想法,利用cpu的高速性不停的读取系统时钟然后转换,显示时钟理论上我们认为cpu的速度足够快,只要读取系统时钟的时间间隔足够小就可以很准确的显示时钟,可是事实并不如我们猜想的那样。最开始的代码我们希望能够对年,月份,日期,小时,分钟,秒都进行实时显示,可是我们在实现的时候发现循环体内的代码量很大,读取系统时间的时间间隔太长,最后的结果就是年份,月份,日期,小时都能正常显示,因为这些属性的时间跨度大,但是对分钟的显示就没有那么准确了,秒数的显示更是离谱,跳秒的现象严重。后来我们分析原因,尽可能的减小读取系统时钟的时间间隔,可是效果并不明显,后来我们妥协了,我们选择对非重要信息作一次性初始化显示,对重要信息作实时性显示,我们显示时钟的准确度大大提高。
二,如何阅读他人的代码。和很多人一样,我们最开始也是希望能够通过网络参考一些别人的代码,甚至有现成的更好,但是当我们去尝试阅读别人的代码时,就发现读不懂,一方面是自己的知识掌握不牢阅读起来吃力,另一方面是难以静下心来,内心浮躁。最好的是要在内心上接受这段代码,先跟着作者的思路尝试理解作者的代码,不懂得地方可以网上检索一些信息,然后去论证自己思路的可行性。
三,检索信息。网上的信息多而繁,如何快速筛选有用信息就显得很重要了,这个需要自己通过大量的实践总结自己的索引方式,比如收藏一些优质的网站,优秀的博主。四,对开发环境的学习,在实践的过程中我们不仅需要学习编程更要熟悉你所使用的编程软件,因为这有可能让你事半功倍,这点我深有体味,这里不再赘述。以上就是我们小组对这次课程设计的总结和体会吧,我们也确实学习到了很多东西。