字符查找及转换课程设计说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
字符转换及查找汇编语言题目
程序设计
学院自动化
专业自动化
班级
姓名
指导教师
2012 年 1 月13 日
课程设计任务书
学生姓名专业班级
指导教师工作单位
课程设计题目:字符转换及查找汇编语言程序设计
初始条件:
采用16位微处理器 8086 CPU以及86系列微型计算机的指令系统;
软件设计平台为多功能微型计算机实验软件MFS中的微机原理实验集成环境MF2KP,仿真设计平台为Proteus软件。
要求完成的主要任务:
设计汇编语言程序,实现字符转换及查找的功能,具体功能要求如下:(1)屏幕提示输入字符串;
(2)将字符进行大小写变换(全部大写或小写)并显示;
(3)屏幕提示输入待查找字符;
(4)显示查询结果:如果查找到,则显示该字符在字符串中的位置;若没有则显示该字符不存在。
根据功能要求绘制程序流程图、编写完整的汇编语言程序并上机调试: 撰写课程设计说明书。
课程设计说明书的撰写格式如下:
(1)设计说明书包括封面、任务书(指导老师提供)、正文、参考文献(3~5篇)、附录(程序清单,要求有注释)、成绩评定表(指导老师提供)。
(2)说明书正文包含总体方案论证(功能分析、系统连接图设计或算法说明);程序流程图设计及其说明、软件设计关键问题说明;程序调试说
明、结果记录及分析;课程设计收获及心得体会。
(3)同一选题若为合作完成,设计说明书中需注明本人承担的设计部分。
时间安排: (本次课程设计时间:2012年1月4日-13日,历时一周半)
周次具体时间设计内容
第一周
1月4日指导老师就课程设计内容、设计要求、设计进度安排、评分标准等作具体介绍。
强调课程设计期间纪律要求。
学生确定选题,明确设计内容及要求。
1月5日根据选题查阅资料,完成方案的初步设计,包括系统原理及算法。
1月6日绘制系统硬件接线图(接口应用设计题必须)以及程序流程图。
第二周
1月9日学生根据程序流程图,编写程序代码。
1月10日仿真调试、修改。
1月11日
学生结合程序流程图解释说明设计思路与算法;指导老师检查程序
运行效果,并就结果进行评分。
1月12日学生撰写课程设计说明书。
1月13日上交课程设计说明书,以及答辩。
指导教师签名:年月日
系主任(或责任教师)签名:年月日
目录
引言 (1)
1.设计意义及要求 (2)
1.1设计意义 (2)
1.2设计要求 (2)
2.方案分析 (3)
3.程序设计 (4)
3.1数据区定义 (4)
3.2提示语句输出、字符输入及选择部分 (5)
3.21提示语句输出 (5)
3.22 字符及字符串的输入 (5)
3.23 选择部分 (5)
3.3 大小写转换部分 (6)
3.4 查询部分 (8)
3.5 退出部分 (11)
4.运行结果分析 (12)
4.1程序运行结果 (12)
4.2调试过程 (15)
结束语 (16)
参考文献 (17)
附录 (18)
引言
计算机的诞生是人类历史上的一件大事,半个多世纪来计算机得到了巨大的发展,从小型机到巨型机,从台式到手提电脑,从每秒5000次的定点算术运算到每秒几十万亿次的浮点算术运算,计算机实现了一代接一代的跨越性飞跃,微机原理与接口技术让我们更深入了解计算机的内部结构及每一细小组成,汇编语言更让我们对C语言等高级计算机语言有了更为基础的认识,从计算机的基本知识如运算基础和进制转换等到8086的系统结构,再到其指令系统、寻址方式、数据类型以及汇编语言程序设计等等,还有存储器的原理及接口技术和可编程芯片等等,这些都让我们获益匪浅。
而微机原理与接口技术的课程设计则是让我们巩固书本所学知识的重要平台,设计中我们通过对系统方案的整体分析,进而画出流程图,编制对应的程序,在实验平台MF2KP或Emu8086上进行调试,从而得出最终程序,其中我们不仅很好的锻炼了自己的动手操作能力,更对书本所学有了进一步的升华。
设计过程中使用的Emu8086是结合了一个先进的原始编辑器、组译器、反组译器、具除错功能的软件模拟工具,还有一个循序渐进的指导工具,这对刚开始学组合语言的人是一个很有用的工具,它能在模拟器中一步一步的编译程序码并执行,视觉化的工作环境让它的使用变得更为容易,这个软件对汇编语言的学习有很大的帮助,在设计中起到重要作用。
字符转换及查找汇编语言程序设计
1.设计意义及要求
1.1设计意义
本次设计旨在帮助学生进一步巩固书本所学的微机接口及技术的知识,促使其学会分析设计命题,自主思考,独立设计个人方案,以达到强化知识,训练思维,激发创造力,提高实践动手能力的目的。
设计后预期实现字符串的输入,并按照要求转换成大写或者小写,并进行选择是否查询,如若需要查询,则自动查找输入的待查询字母,并显示转换与查询结果,同时能实现多次查询与输入,最后能在不需工作时按Q或q键退出程序运行界面。
1.2设计要求
1)屏幕提示输入字符串;
2)将字符进行大小写变换(全部大写或小写)并显示;
3)屏幕提示输入待查找字符;
4)显示查询结果:如果查找到,则显示该字符在字符串中的位置;若没有则显示该字符不存在。
2.方案分析
首先分析设计要求,要求需要屏幕提示输入字符串,所以首先考虑使用DOS调用中的10号调用,该调用具有多字符输入的功能;而针对第一个功能大小写变换,我们首先考虑字母A-Z的ASCII码为41H到5AH,a-z的ASCII码为61H到7AH,不难发现每个字母的大小写的ASCII码之间相差为20H,所以可以通过对ASCII的值加减20H 来实现大小写的转换;对于第三个功能我们采用DOS调用的1号功能调用,该功能为单字符输入;对于最后一项要求,我们采用CX计数,并用CMP指令对存入数据区的每个字符与要求输入的字符进行比较,若相同则讲此时的CX值储存在另一数据区,不同则继续累加进行下一字符的比较,直至结束,最后输出所存的每一个CX的值,这就实现了查询功能。
针对以上的方案分析,我们可以得到整体程序的流程图如图2-1所示:
图2-1 主程序流程图
3.程序设计
根据图2-1的流程图我们可进行如下的程序设计,首先为了整个程序的清晰明朗,我们考虑将程序分为五大部分:1.数据区定义部分;2.提示语句输出、字符输入及选择部分;3.大小写转换部分;4.查询部分;5.退出部分。
3.1数据区定义
由于设计要求中需要输入字符串、输出提示语句以及转换和查询结果,所以必须事先进行数据区的定义,为程序运行需要的数据开辟存储空间。
其具体程序如下:
data segment
message1 db 0ah,0dh,'please input string',0ah,0dh,'$'
message2 db 0ah,0dh,'conversion for capital?',0ah,0dh,'$'
message3 db 'press ''Y'' or ''N'' to choose',0ah,0dh,'$'
message4 db 0ah,0dh,'conversion to complete',0ah,0dh,'$'
message5 db 0ah,0dh,'to search?',0ah,0dh,'$'
message6 db 0ah,0dh,'please input the letter you want to search',0ah,0dh,'$'
message7 db 0ah,0dh,'the letter does locate in',0ah,0dh,'$'
message8 db 0ah,0dh,'if you want to quit,please hit ''q'' or ''Q''!',0ah,0dh,'$' buffer1 db 55 ;缓冲区第1个字节存放预定字符个数
db ? ;缓冲区第2个字节保留用于存放实际输入字符个数
db 55 dup('$'),;缓冲区第3个字节开始存放输入字符(预先存有$)buffer2 db 55 dup('$') ;定义用于存放转换结果的缓冲区
buffer3 db 10 dup('$'),'$';定义用于存放查询计数结果的缓冲区
data ends
3.2提示语句输出、字符输入及选择部分
3.21提示语句输出
对于程序中用于输出提示语句我们采用DOS调用的9号调用,并使用宏调用实现,其具体程序如下:
print macro string ;变量为字符串
mov ah,09h ;9号DOS调用用于输出制定缓冲区的字符串
lea dx,string ;将输出缓冲区的首地址赋给dx
int 21h
endm
3.22 字符及字符串的输入
对于字符串的输入我们采用DOS调用的10号调用,用于实现对转换字符串的输入,具体程序如下:
lea dx,buffer1 ;设定输入字符串存放位置的偏移地址
mov ah,0ah ;10号调用用于输入多字符
int 21h
对于单字符的输入我们采用DOS调用的1号调用,用于实现对待查询字母的输入,具体程序如下:
mov ah,01h ;1号调用用于单字符输入,输入字符的ASCII码存放于al寄
存器中
int 21h
3.23 选择部分
对于程序中需要选择的部分,如选择大写或小写,选择是否查询,选择是否退出并用Y/N进行选择,我们采用以下程序实现:
choose macro opr1,opr2
mov ah,01h ;1号调用用于输入Y或N
int 21h
cmp al,59h ;将输入的字母的ASCII码与Y的ASCII码比较
jz opr1 ;若输入为Y则跳转到opr1所指的位置
cmp al,79h ;将输入的字母的ASCII码与y的ASCII码比较
jnz opr2 ;若输入的不是y则跳转到opr2所指的位置
endm
3.3 大小写转换部分
对于大写小转换部分,存在许多共性,但在个别语句上稍有不同,转换为大写ASCII 码需要减去20H,而转换为小写A SCII码需要加上20H,所以将整个转换部分分为三个小部分,分别为ready、conversion1、conversion2,其结构图如图3-1所示,其程序具体如下:
1)ready macro
mov ah,00h
mov bx,0000h
mov cx,0000h
mov dx,0000h;以上四句语句用于将ah,bx,cx,dx各寄存器清零
lea bx,buffer1+2 ;将缓冲区buffer1开始存放字符串的偏移地址赋给bx
endm
2)conversion1 macro opr1,opr2,opr3
mov al,[bx];将缓冲区buffer1的字符存入al寄存器中
mov dl,[bx] ;将缓冲区buffer1的字符存入dl寄存器中
cmp al,'$' ;比较输入是否为空字符串
jz result;若为空字符串则调至输出转换结果部分
cmp al,opr1
jc opr3
cmp al,opr2 ;以上三句用于确认是否为大写或小写字母
endm
3)conversion2 macro opr1
mov 37h[bx],al;将转换后的大写或小写字母的ASCII码存入另外定义
的缓冲区
inc cl ;cl自加1,用于计数
inc bl;bl自加1用于指向下一个存储单位的偏移地址
jmp opr1;调回转换大小写的语句
endm
对于大小写的转换我们通过以下语句来进行ASCII码的加减20H:
sub al,20h add al,20h
图3-1 大小写转换模块流程图
3.4 查询部分
对于查询部分,我们采用另外定义一个缓冲区来存放查询的结果,最后则一次性全部输出,输出形式为字符出现的字符串位置,如果输入的字符不存在则查询结果显示为空,并且在每次进行下一轮查询时自动清除缓冲区里的内容,保证下次输出的正确性,其流程图如图3-2所示,其程序如下:
part3:
lea si,buffer3 ;将缓冲区buffer3的偏移地址赋给si
push si ;将si的内容推入堆栈段,保护原数据
mov cl,09h ;设置计数cl的初值,用于清零寄存器
clear:
mov [si],' '
inc si
loop clear ;将缓冲区buffer3中已存的数据清零,用以继续查询pop si ;将存入堆栈段的si的原值出栈
mov cl,00h ;计数重新清零
print message5
print message3
choose next2,exit1
next2:
print message6
mov ah,01h
int 21h
ready
done5:
mov dl,[bx];取已存的字符串的字符存入dl中
cmp dl,'$';判断是否为空字符串或者是否查询完整个字符串
jz done6
cmp dl,al ;判断是否为待查询的字符
jz done7 ;若是待查询的字符则进入done7指向的相关语句inc bl
inc cl
jmp done5;若不是查询字符则进入下一个字符进行下一次查询done6:
print message7
print buffer3;输出查询结果
jmp part3
done7:
inc cl
mov [si],cl;将统计出现待查询字符出现次数存入si中
add [si],30h;将对应内容转化为十进制数字形式输出
inc si
inc si
inc bl
jmp done5;返回进行下一个字符的查询
图3-2 查询模块流程图
3.5 退出部分
当程序执行结束或者用户选择退出程序时需要退出DOS运行环境,对此做如下编程:
exit1:
print message8;提示若要退出请按Q或q键
mov ah,01h
int 21h;用户输入按键确认是否退出
cmp al,'q'
jz exit2
cmp al,'Q'
jz exit2 ;以上四句语句用于判断用户输入的是否为退出键
jmp start;若输入非退出键则再次进入输入字符串阶段exit2:
mov ax,4c00h
int 21h ;用于退出DOS运行界面
4.运行结果分析
4.1程序运行结果
程序运行后的界面图如以下图所示:
下图为程序刚开始运行时提示用户输入字符串的界面截图;
图4-1 运行界面图1
下图为输入字符串aabbCCdd后询问用户是否转换为大写的界面截图;
图4-2 运行界面图2
下图为将输入的字符串aabbCCdd转换为大写字母AABBCCDD后询问用户是否进行查询的截图;
图4-3 运行界面图3
下图为进行查询字符a后显示查询结果并询问是否继续查询的界面截图;
图4-4 运行界面图4
下图为在查询字符a后继续进行查询字符d并输出查询结果的界面截图;
图4-5 运行界面图5
下图为输入字符串AAABBBccdd后转换为小写字符串aaabbbccdd的界面截图;
图4-6 运行界面图6
下图为对字符串AAABBBccdd进行字符x的查询,结果显示查询结果为空,表示没有该字符;
图4-7 运行界面图7
图为当用户选择查询结束后询问用户是否退出,若要退出请按Q或q的界面截图。
图4-8 运行界面图8
通过以上截图我们可以得出结论,所设计的程序已经能正确执行,并实现以下功能:
1)提示用户输入字符串;
2)询问用户是否将字符串转换成大写;
3)根据用户选择进行相应的操作即转换成大写或小写并输出转换结果;
4)询问用户是否对字符串进行查询;
5)根据用户的选择进行查询字符,并将对应相同字符出现的位置显示出来;
6)若所要查询的字符字符串中没有则显示查询结果为空;
7)在用户需要退出时按下Q或q键进行退出。
可见,程序的设计已能很好的完成设计要求。
4.2调试过程
程序在修改调试中分别出现的情况和对应的解决方法如下:
1)现象:在程序开始运行输出的提示语句前出现乱码。
解决方法:由于对ds的赋值语句写在了start前,导致首地址的赋值语句没有执行,将其放在start后既不会出现乱码。
2)现象:再进行第二次查询时显示的查询结果包含上一次查询的结果。
解决方法:在每次查询开始前加上一段语句用于清除存放查询结果的缓冲区buffer3中的数据。
3)现象:在输入字符串没有的字符进行查询时程序一样输出查询结果,且为错误结果。
解决方法:修改程序的查询模块,使得在查询没有的字符时输出结果为空。
结束语
通过本次的课程设计我对本学期所学的知识有了进一步的巩固与理解,特别是DOS 调用方面的相关指令,对其具体的使用条件和方法更为清晰明确,同时对一些基本指令的使用也更为熟练,再有是宏调用的使用也让我学会怎样让程序模块化,使得程序结构更为明朗清晰,同时由于设计的需要,对循环结构和跳转指令的使用也较为频繁,让我对其使用时的注意事项有了进一步的掌握,在程序调试过程中更是让我发现了一些程序书写的常见错误和对应的解决方法,对我以后的程序编写有很大的帮助。
在设计中对软件MF2KP和EMU8086的使用让我对程序的调试过程更为熟练,也让我了解到一些程序编写语句在软件上并不是都能实现,要结合实际编写程序,同时通过几次调试,对这两个软件的使用也更为熟练,对以后的编程与调试起到了奠定基础的作用,让我获益匪浅。
整个设计过程中让我深有体会的是看似一个简单的编程题在实际编写程序并进行调试时往往会遇到许多难题,要关注许多细节,而且对程序一个地方细小的改动对整个程序的影响有可能很大,要学会设置断点并利用软件进行单步运行检查错误,并加以修改。
而课程设计说明书的书写也让我对写说明书和WORD的运用更为巩固。
通过此次课程设计,不仅巩固加深了对书本所学知识的理解,更让我锻炼了实际动手编程调试的能力。
参考文献
[1]彭虎,周佩玲,傅忠谦.微机原理与接口技术(第2版).电子工业出版社,2008
[2]周佩玲,彭虎,傅忠谦.微机原理与接口技术(基于16位机).电子工业出版社,2005
[3]李伯成,侯伯亨,张毅坤.微型计算机原理及应用.西安电子科技大学出版社,2009
[4]李继灿.新编16/32位微型计算机原理及应用(第4版).清华大学出版社,2008
[5]贺建民.微型计算机系统原理及应用.机械工业出版社,2011
附录
程序源码:
print macro string
mov ah,09h
lea dx,string
int 21h
endm
ready macro
mov ah,00h
mov bx,0000h
mov cx,0000h
mov dx,0000h
lea bx,buffer1+2
endm
conversion1 macro opr1,opr2,opr3
mov al,[bx]
mov dl,[bx]
cmp al,'$'
jz result
cmp al,opr1
jc opr3
cmp al,opr2
jnc opr3
endm
conversion2 macro opr1
mov 37h[bx],al
inc cl
inc bl
jmp opr1
endm
choose macro opr1,opr2
mov ah,01h
int 21h
cmp al,59h
jz opr1
cmp al,79h
jnz opr2
endm
data segment
message1 db 0ah,0dh,'please input string',0ah,0dh,'$'
message2 db 0ah,0dh,'conversion for capital?',0ah,0dh,'$'
message3 db 'press ''Y'' or ''N'' to choose',0ah,0dh,'$'
message4 db 0ah,0dh,'conversion to complete',0ah,0dh,'$'
message5 db 0ah,0dh,'to search?',0ah,0dh,'$'
message6 db 0ah,0dh,'please input the letter you want to search',0ah,0dh,'$' message7 db 0ah,0dh,'the letter does locate in',0ah,0dh,'$'
message8 db 0ah,0dh,'if you want to quit,please hit ''q'' or ''Q''!',0ah,0dh,'$' buffer1 db 55
db ?
db 55 dup('$'),
buffer2 db 55 dup('$')
buffer3 db 10 dup('$'),'$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea si,buffer3
print message1
lea dx,buffer1
mov ah,0ah
int 21h
print message2
print message3
choose part1,part2
part1:
ready
done1:
conversion1 60h,7bh,done2
sub al,20h
done2:
conversion2 done1
part2:
ready
done3:
conversion1 40h,5bh,done4
add al,20h
done4:
conversion2 done3 result:
print message4
print buffer2
part3:
lea si,buffer3
push si
mov cl,09h clear:
mov [si],' '
inc si
loop clear
pop si
mov cl,00h
print message5
print message3
choose next2,exit1 next2:
print message6
mov ah,01h
int 21h
ready
done5:
mov dl,[bx]
cmp dl,'$'
jz done6
cmp dl,al
jz done7
inc bl
inc cl
jmp done5
done6:
print message7
print buffer3
jmp part3
武汉理工大学《微机原理与接口技术》课程设计说明书
done7:
inc cl
mov [si],cl
add [si],30h
inc si
inc si
inc bl
jmp done5
exit1:
print message8
mov ah,01h
int 21h
cmp al,'q'
jz exit2
cmp al,'Q'
jz exit2
jmp start
exit2:
mov ax,4c00h
int 21h
code ends
end start。