湖南工程学院课程设计
四.上机调试
1.程序运行结果
如下图:
图4.1 程序运行结果 2.调试过程中遇到的问题
调试过程遇到了一些问题,主要的是显示结果为乱码的情况,通过debug调试,发现原来是把两位数的时间转换为两个对应的字符输出时出现了问题,原来在《汇编语言》---王爽 写得那本书上看到介绍CMOS存取块时说过其中就保存有当前的系统时间,我也自己用代码实现过,应为那里面保存两位的时间是用组合型BCD码来实现的,受它的影响在实现调用系统时间中断功能时也想它是不是也是这样实现的,或者根本就是调用了它的值,后来才发现自己想错了,该过之后就得出了上面真确的结果。 在编写程序过程中也出现一些编译错误,但我认为这些都是最低级的错误,和容易就能通过编译器的提示把它解决,这里就没说了。
6
湖南工程学院课程设计
五.心得体会
在开始写代码前,我首先认真的在网上查找阅读了以前很多人做过的与之类似的程序,有一个它是随机的输出0到9之间的整数。但刚一开始阅读那个源程序我就发现其中有好多的错误,而且程序不完整,所以我决定先把这个示例程序调试出来,然后再写自己的那个程序。刚开始有好多的地方看不懂,有加之有些地方程序本身有问题,所以觉得我做的第三题应该有难度。但有一句说的好:明知山有虎,偏向虎山行,学习最忌讳的就是知难而退,对自己没有信心。学习不能被眼前的一点小小的困难就吓倒,而爬不起来,那么如果一直这样下去你是很难学到有用的东西的,或者说是很难在这方面有一定的成绩的。
学了一学期的汇编,一个这么小小的程序还不能完成那真是白学了,况且平时花在这门课程上的时间也不少。于是,我不断的鼓励自己,一定能做得出来的,看不懂的地方我就到网上去查,问身边的同学,经过一下午的努力终于把那示例程序调试了出来。也大致清楚了我要做的那题的基本思路,后来根据那个示例程序的提示,在晚上就把它弄出来了。
通过这一次的课设练习,对汇编了解了很多,更加的巩固了以前学习的那些基础知识,同时我也发现在写汇编程序中要注意的很多细节:
对重要的语句块,子程序必须记得的写注释,不然很难让人看懂,除非你不想让别人看懂它,上机的过程中,一同学要我帮他去看一下他在网上下载过来的源程序,整个程序下来就没有看到一个注释,300多行的代码,让人怎么看啊~
要合理,真确的利用自定义的堆栈来保护好寄存器的值,只要把入口参数,和子程序中要用到的寄存器的值保护起来就好了,输出参数是不能保护的,在调试程序的过程中我就出现了应为把输出参数也保护起来的低级的错误。
合理的利用debug功能,会是你在调试程序过程中事半功倍。刚开始认为调用系统时间中断,保存在对应寄存器中的值是用组合型BCD码形式保存的(因为CMOS中存取的系统时间就是用组合型BCD码来存取的)。于是我直接通过移位操着得到其高四位,低四位的值,并输出来,发现结果时乱码,后来通过debug功能,查看对应寄存器中的值,发现原来就是用十进制形式保存的,直接除以10 就可以得到其余数和商,输出即可。
7
湖南工程学院课程设计
六.源程序
assume cs:code,ds:code stack segment
db 128 dup(?)
stack ends
code segment start:
showtime proc
push ax push bx push ds push es
8
;ss段寄存器的装入 mov ax,stack mov ss,ax mov sp,128
;重定位中断程序的入口地址 lea dx,showtime mov ax,seg showtime mov ds,ax mov ax,251ch int 21h
;调用21号中断的31h程序结束并驻留功能 mov ax,3100h mov dx,proclen int 21h
湖南工程学院课程设计
mov ax,cs mov ds,ax mov ax,0b800h mov es,ax
mov ax,2c00h ;调用21h号中断的2ch功能 int 21h
;输出时钟 mov bl,':' mov bh,ch call adjust mov es:[120],al mov es:[120+2],ah mov es:[120+4],bl
;输出分钟 mov bh,cl call adjust mov es:[120+6],al mov es:[120+8],ah
;输出秒钟 mov bh,dh call adjust mov es:[120+12],al mov es:[120+14],ah mov es:[120+16],bl
;输出毫秒 mov bh,dl call adjust
9
湖南工程学院课程设计
mov es:[120+18],al mov es:[120+20],ah pop es pop ds pop bx pop ax iret
showtime endp
;入口参数为bh,出口参数为ah,al
;因为调用2ch中断得到的时间是用十六进制表示的,所以直接除以10得到商和余数
adjust proc
mov ah,0 mov al,bh mov bh,10 div bh add ah,30h add al,30h ret
adjust endp
proclen equ $-showtime
code ends end start
另外附上用直接调用70,71号端口显示系统时间的源程序: assume cs:code,ds:code stack segment
db 128 dup(?)
10