《汇编语言程序设计》课程设计报告
一课程设计题目:电话号码本
功能描述:
1 程序能够建立一个可存放30条以上记录的电话号码本;
2 程序能够对记录进行增加、删除、修改操作;
3 记录字段包含序号、姓名、电话、单位内容;
4 能够通过姓名、或电话查询记录并显示查询结果;
5 退出;
二、实验目的:
1.进一步了解和熟悉8086 汇编语言的指令及其用法。
2.进一步学习汇编语言源程序的编写方法和技巧以及运行过程。
3.掌握汇编语言调试(在DEBUG状态下)的过程。
三、分析课题的基本内容及目的
此课题要求用汇编语言写一个可存放30条以上记录的电话号码本的程序,其中每一个记录应该包括四个选项,即序号,电话号码,姓名用公司。对程序中的所有记录能够进行的操作有增加一条记录,删除一条记录,查询一条记录,修改一条记录。增加一条记录就是把记录插入到程序中所有记录的最后面,还要把记录的总个数加1。删除一记录要先通过查询算法,查到删除记录的位置,然后从下一条记录开始,逐个往前面覆盖。查询一条记录有两种方法,通过电话号码或姓名查询,若没有到所要的记录,则返回,并告之该记录不存在。修改一条记录也需要先查该记录,然后进行修改,即重新写入。
四、程序流程图
1.总体流程图:
2.插入算法的程序流程图如下:
五、设计过程中遇到的问题及解决方法
虽然插入算法的流程图比较简单,但也遇到了不少的问题。
1.程序开始运行时,要求用户输入字母以选择要进行的操作。可以用一段选择程序来实现:
w: mov ah,7      ;从键盘输入,但不回显
int 21h
cmp al,'i'    ;将输入值与字母i作比较
jnz w1        ;不相等,转向w1与下一个字母比较
call insert    ;相等,则执行插入操作
jmp  w        ;重新输入进行操作
w1: ……
2.插入的记录中,姓名和公司的长度不一,这样就给记录的查询、删除及修改带来了很大的麻烦。这里,我预先定义了一个数组array来设定记录中电话号码,姓名和公司的长度:
array    db 51 dup(?,16 dup(?),20 dup(?),30 dup(?),0dh,0ah,'$')
并且在输入子程序中,运用了以下程序将剩余的单元用空格符填满:
mov  al,20h        ;用空格填满剩余的单元
sub  ch,ch
mov  cl,numlen    ;实际输入的电话号码的长度
lea  di,numfld    ;输入的电话号码单元的首地址
add  di,cx
neg  cx          ;求补
add  cx,16        ;cx中为剩余的字节数
cld              ;let df=0
rep  stosb        ;把al中的内容(空格)存入di指向的内存单元中
对于姓名和公司也是一样。
如此,每一条记录便有70个字节(包括空格符),这样不仅给程序的查询、删除及修改操作带来了方便,而且也使输出时记录的排序较为美观。
3.插入一条记录时,要把记录插入到末尾,为了能够随时得到末尾的偏移地址,我定义了一个字变量point,用来保存所有记录的的字节数,这样就可以通过代码:
point    dw 0        ;指向记录尾
……
lea  di,array
add  di,point    ;把array中要插入位置的偏移地址赋给di
很容易的到末尾,即要插入记录的位置。再由movsb指令将记录插入末尾(调用stors子程序):
mov  cl,16
lea  si,numfld    ;输入的电话号码的首地址
cld
rep  movsb
mov  cl,20
lea  si,namefld  ;输入的姓名的首地址
cld
rep  movsb
mov  cl,30
lea  si,telfld    ;输入的公司的首地址
cld
rep  movsb
汇编语言如何编程还有一点,之所以将上述代码单独写为一个子程序,也是为了后面删除和修改
记录的方便。删除时用后面的记录覆盖掉待删除的记录可以调用这个子程序来实现,修改记录时,重新写入记录,也可以调用此子程序来实现对原记录的覆盖。
4.程序的输出应该尽量美观,在此定义了一个分隔符:
separate db '*******************************************',0dh,0ah,'$'
将各个操作的结果分隔开来。还专门将定义为一个子程序,需要的时候可以直接调用,很方便:
disply proc near        ;显示输出
mov ah,9
int 21h
ret
disply endp
六、课程设计体会:
汇编语言是一门偏硬件的低级语言,学习起来是有一定难度的。上个学期的汇编课程,我感觉自己有很多都没有听懂,还有很多的指令不会用,通过这一次的课程设计,不仅让我巩固了上学期所学的汇编语言的知识,也让我更深入的了解了汇编语言及其程序设计的方法,比如equ、label、cmpsb、stos
b等指令的运用,分支程序的设计,子程序的调用……我还深刻体会到了结构化程序设计的重要性。
查阅资料也是很重要的。程序设计即要有自己的思想,还要善于借鉴他人所写的好的算法。这些都要求自己能够细心地收集资料,耐心地整理资料,然后巧妙地为己所用。
程序的编译和修改也需要足够的耐心与信心。众所周知,汇编程序的修改是一件比较麻烦的事,尤其在程序很长的时候。我们所写的程序也比较长,在编译和修改的时候也遇到了很多的问题,经过不断的努力,反复的修改,最终做出来了一个比较完整的程序。可见,无论是学习还是实际动手操作,都要有信心,有恒心,敢于面对困难。
当然,我们的程序中还有很多的不足,比如不能显示每一条记录的序号,运行过程中,缓冲区array中虽然能够存储50条记录,但空格符填满剩余的字节,在一定程度上浪费了存储空间,而且退出程序后,缓冲区array中的所有记录都会丢失。如果能够使用磁盘文件操作将所有记录都保存于文件中,则可以避免这一缺点。但这除了涉及文件的读、写操作,还涉及到了文件指针的移动,太繁琐。当然,如果能够使用Win32汇编开发这个电话号码本程序则会更好,以后我还会继续努力学习的。
七、参考文献
IBM-PC汇编语言程序设计(第二版)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。