代码转换程序设计Word下载.docx
《代码转换程序设计Word下载.docx》由会员分享,可在线阅读,更多相关《代码转换程序设计Word下载.docx(30页珍藏版)》请在冰点文库上搜索。
指导教师签名:
年月日
系主任(或责任教师)签名:
摘要
汇编语言是直接面向处理器(Processor)的程序设计语言。
处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。
每一种处理器都有自己可以识别的一整套指令,称为指令集。
处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。
汇编语言的主要特点是可以使用助记符来表示机器指令的操作码和操作数,可以用标号和符号来代替地址、常量和变量。
这次课程设计的任务是用汇编语言进行一个数制转换,从键盘输入一串字符(非字符则不接受),通过屏幕提示菜单选择转换成ASCII码,或者进行大小写转换(原来是大写转换成小写,小写则转换为大写)并显示。
先输入要转换的数据,再对数据进行检验判断其合法性,对不合法的数据进行警报并重新输入数据,对合法的数据按照要求进行大小写转换或者转换成ASCII,码,最后显示转换后的字符串。
关键词:
DOS功能调用大小写转换ASCII码
1设计任务及分析
1.1设计任务要求
(1)用汇编语言编写一个字母和数制之间的转换程序,设计出友好的交互界面;
(2)实现小写字母和大写字母之间的相互转换;
(3)撰写课程设计说明书。
1.2设计系统分析
DOS是一个磁盘操作系统,也称为IBM-DOS或者MS-DOS。
DOS不仅为用户提供了许多使用命令,而且还有用户可以直接调用的上百个子程序。
对这些子程序的调用,称为系统功能调用。
这些子程序主要完成一系列的管理功能。
在使用时,用户不需要了解各种I/O接口硬件的详细情况,就能完成对I/O接口的控制和管理。
为了使用方便,将所有子程序从1号开始顺序编号,这些编号称为DOS功能调用号。
所以在进行设计之前,先要弄清楚DOS功能调用。
1.3方案比较及认证
方案一:
通过运用汇编语言提供的基本指令,加上运用适当的循环方式,按照要求设计指令来达到满足要求的目的。
这种方式比较容易理解和编程,是考虑到程序可能有许多重复的地方,运用这种直接的方法就可能造成代码很多的结果。
方案二:
通过运用DOS函数调用,运用汇编语言提供的各种现成的函数来满足要求,也可以自己定义函数来达到某种要求,在重复使用时不用造重新编写,只需一个调用,大大简化了程序,这种方法更加简洁方便,所以选用这种方法。
2方案设计
2.1方案原理
本次课程设计的要求是:
从键盘输入一串字符,通过屏幕提示菜单选则进行大小写转换或者转换成相应的ASCII码并显示。
设计的基本思路:
首先要先完成字符串的输入并存在buf1中,然后输入一个字符通过检验字符来选择跳转到相应的子程序中去进行ASCII码转换或者进行大小写转换,将转换后的字符串存放到buf2中;
转换完成后跳转到输出部分即可完成程序功能;
为了程序能重复运行,在代码段末尾加一条强制跳转语句跳到开头部分。
2.2指令功能
(1)键盘输入并显示(1号功能调用)
格式:
INT21H
功能:
按下任何键,将其对应字符的ASCII码送入AL中,并在屏幕上显示该字符。
如果按下的是Ctrl+Break组合键,则终止程序执行。
1号功能调用无须入口参数,出口参数在AL中
(2)键盘输入但不显示
MOVAH,08H
同1号功能调用,但字符不在屏幕上显示。
(3)屏幕显示一个字符(2号功能调用)
MOVDL,‘字符’
MOVAH,02H
将置入DL寄存器中的字符在屏幕上显示输出。
(4)打印输出(5号功能调用)
MOVAH,05H
INT21H
将置入DL寄存器中的字符送打印机接口,打印输出。
(5)屏幕显示
格式:
LEADX,字符串的偏移地址
MOVAH,09H
INT21H
功能:
在屏幕上显示字符串。
在使用9号功能调用时,应当注意以下问题。
1)待显示的字符串必须先放在内存一数据区(DS段)中,且以‘$’符号作为结束标志。
2)应当将字符串首地址的段基址和偏移地址分别存入DS和DX寄存器中。
(6)字符串输入功能调用(0AH号功能调用)
LEADX,已定义缓冲区的偏移地址
MOVAH,0AH
从键盘接收字符,并存放到内存缓冲区。
在使用0AH号功能调用时,应当注意以下问题。
1)执行前先定义一个输入缓冲区,缓冲区内第一个字节定义为允许最多输入的字符个数,字符个数应包括回车符0DH在内,不能为“0”值。
第二个字节保留,在执行程序完毕后存入输入的实际字符个数。
从第三个字节开始存入从键盘上接收字符的ASCII码。
若实际输入的字符个数少于定义的
2)应当将缓冲区首地址的段基址和偏移地址分别存入DS和DX寄存器中。
(7)返回DOS操作系统(4CH号功能调用)
MOVAH,4CH
INT21H
终止当前程序的运行,并把控制权交给调用的程序,即返回DOS系统,屏幕出现DOS提示符,如“C:
\>
”,等待DOS命令。
(8)直接输入、输出单字符(6号功能调用)
MOVDL,输入/输出标志
MOVAH,06H
执行键盘输入操作或屏幕显示输出操作,但不检查Ctrl+Break组合键是否按下。
执行这两种操作的选择由DL寄存器中的内容决定。
1)当(DL)=0FFH时,执行键盘输入操作。
若标志ZF=0,AL中放入字符的ASCII码;
若标志ZF=1,表示无键按下。
这种调用用来检测键盘是否有键按下,但不等待键盘输入。
2)当(DL)≠0FFH时,表示将DL中内容送屏幕显示输出。
(9)检查键盘的工作状态(0BH号功能调用)
MOVAH,0BH
检查是否有键盘输入,若有键按下,则使AL=0FFH,若无键按下,则AL=00H。
对于利用键盘操作退出循环或使程序结束之类的操作来说,这种调用是很方便实用的。
2.3主程序流程图
远程转移是段间的转移,目的地址与JMP指令所在地址不在同一段内。
执行该指令时要修改CS和IP的内容。
间接转移指令的目的地址可以由存储器或寄存器给出。
段内间接转移JMPWORDPTROPRD;
IP=[EA](由OPRD的寻址方式确定)。
JMPWORDPTR[BX]IP=((DS)*16+(BX))
JMPWORDPTRBXIP=(BX)
段间间接转移JMPDOWRDPTROPRD;
IP=[EA],CS=[EA+2]
该指令指定的双字节指针的第一个字单元内容送IP,第二个字单元内容送CS。
JMPDWORDPTR[BX+SI]
根据题目的要求和选择的指令,首先设计出主程序,其流程图如图2-1:
NY
Y
N
N
图2-1主程序的流程图
3源程序
3.1主程序设计
根据课题的要求,首先设计友好的人机交互页面,编辑提示语,然后编辑自己所需的函数,通过DOS调用现成的以及自己编辑的函数,来满足题目要求。
主程序如下:
;
*输入一串字符(非字符则不接受)*
*原字符存放在buf1中,转换后的字符存放在buf2中*
*按照屏幕菜单选择进行ASCII码转换*
*或者进行大小写转换*
*----------------------------------------------------------*
DATASEGMENT;
数据段
inputdb0ah,0dh,'
ifyouwanttoquit,pleasepressQ/q!
'
db0ah,0dh,'
pressotherkeytozhuanhuan'
0ah,0dh,'
$'
;
输入提示
inputmessdb0ah,0dh,'
pleaseinputbuf1:
'
bufdb100
db'
db100dup(0);
字符缓冲区
ZHUANHUANdb0ah,0dh,'
ifyouwanttochangecasepressA/a!
ifyouwanttotransformtoasciipressB/b!
转换提示
outputmessdb0ah,0dh,'
aftertransformCharacterStringBUF2:
BUF1:
输出提示
BUF1DB100dup(0)
chglinedb0ah,0dh,'
BUF2:
BUF2DB100DUP('
)
BUF3db0ah,'
DATAENDS
STACK1SEGMENTSTACK
DB20DUP('
STACK1ENDS
CODE;
代码段
SEGMENT
ASSUMEDS:
DATA,SS:
STACK1,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
AP:
LEADX,input;
输入提示
MOVAH,9
INT21h
MOVAH,08h
INT21h
CMPAL,'
Q'
JEexit
q'
PA:
LEADX,inputmess
INT21h
LEADX,buf
MOVAH,10;
输入字符
LEAdi,buf+2;
将字符存入缓冲区buf中
LEAsi,buf1
MOVCX,0
next:
MOVDL,[di]
INCdi
CMPDL,0dh;
判断是否传送完毕
JNEaa
JMPend0
aa:
MOV[si],DL;
将缓冲区buf中的内容存入buf1中
INCsi
INCCX
JMPnext
exit:
MOVAH,4CH
end0:
MOVbyteptr[si],'
MOVBP,CX
MOVSI,OFFSETBUF1;
建立源地址指针
MOVDI,OFFSETBUF2;
建立目标地址指针
MOVCX,BP;
字节数送入CX寄存器
LEADX,ZHUANHUAN;
输出转换信息,进行转换选择
MOVAH,08
A'
检验输入的字符,输入A/a跳到AB进行大小:
JEAB
a'
JEAB
B'
JEBA
b'
AB:
CALLABC;
调用子程序ABC
JMPL1
BA:
CALLCBA;
调用子程序CBA
ABCPROC;
子程序ABC
AC:
PUSHSI;
进栈
PUSHDI
PUSHCX
PUSHAX
MOVAL,[SI]
JEL1;
判断大小写并进行大小写转换
JLDBA
z'
JLJK
JMPPA
JK:
SUBAL,20H
MOV[DI],AL
JMPAA0
DBA:
CMPAL,'
Z'
JLKK
KK:
JGLL
LL:
ADDAL,20H
AA0:
INCSI
INCDI
DECCX
JNZAC
POPCX;
出栈
POPDI
POPSI
POPAX
RET
ABCENDP
CBAPROC;
完成字符转换成ASCII的子程序
AD:
PUSHAX
JEL1
JLABD
JLEHW
HW:
CBW
MOVBL,10H;
将小写字母转换成ASCII
DIVBL
ADDAL,30H
ADDAH,30H
MOV[DI],AH
JMPBB0
ABD:
CMPAL,'
JLEHO
HO:
JGEMO
MO:
CBW
将大写字母转换成ASCII码
BB0:
INCSI
JNZAD
POPSI
POPAX
RET
CBAENDP
L1:
LEADX,OUTPUTMESS;
实现输出
LEADX,buf1
LEADX,chgline
MOVAH,9
LEAdx,BUF3
MOVah,9
movcl,100
movsi,0
qinlin:
moval,'
movBUF2[si],al
incsi
loopqinlin
JMPAP
CODEENDS
ENDSTART
把程序输入到emu8086中去,运行程序,打开屏幕界面,按照提示语的要求,输入相应的字符,按字母A/a或B/b来达到不同的目的。
3.2子程序大小写字母转换及流程图
首先在屏幕上输出显示字符串输入提示符,再进行字符串的输入,输入字符串完成后在屏幕上输出转换信息:
(选择输入A/a进行大小写转换或者输入B/b进行ASCII转换),接着输入一个字符,判断输入字符A/a还是B/b跳转到进行相应的转换(在子程序中判断是否有非字符,若有非字符则重新输入,没有则进行转换),转换完成后跳转到输出部分进行输出,程序结束。
程序开始先取buf1中的字符,判断是否为字符,如果不是字符则不符合要求就不进行转换直接跳转到PA重新输入字符buf1;
如果是字符则进行大小写转换,转换后的字符存储在字符串buf2中;
之后SI、DI加1,CX减1,判断CX是否为零;
如果CX为零说明完成转换,此时可以将SI、DI、CX、AX出栈,子程序结束;
跳转到L1进行输出。
否则继续取下一个字符进行转换,直至转换完成。
JEL1;
POPDI
ABCENDP
大小写字母转换流程图如图3-1:
N
Y
图3-1大小写字母转换流程图
3.3子程序ASCII码转换CBA及流程图
CBAPROC;
PUSHSI;
PUSHDI
MOVBL,10H;
DIVBL
INCSI
JNZAD
ASCII码转换子程序CBA流程图如图3-2:
NN
NY
图3-2ASCII码转换子程序CBA流程图
4程序运行及调试
根据题目要求:
键盘输入一串字符(非字符则不接受),通过屏幕提示菜单选择转换成ASCII码,或者进行大小写转换(原来是大写转换成小写,小写则转换为大写)并显示。
所以可能有三种处理结果:
(1)输入字符串后进行大小写转换后输出显示在屏幕上;
(2)输入字符串后将字符串转换成ASCII码输出显示在屏幕上;
(3)输入的串中含有非字符,则不进行转换输出,跳到程序PA处重新输入字符。
4.1大小写转换
当输入字符串为:
’WEIJIyuanli’并且输入字符A/a进行大小写转换时得出结果如图4-1:
图4-1字母大小写转换图
4.2ASCII码转换
‘daXUE’,并且在下一步输入B/b将输入的字符转换成ASCII码输出得到的结果如图4-2:
图4-2字母转换为ASCII码
4.3输入非字符
当输入的字符串为’WUHAN888’含有非字符时,字符串不进行转换,直接跳转到程序PA处,提示重新输入字符buf1,结果如图4-3:
图4-3出入非法字符
4.4调试中出现的错误
(1)当判断字符串含有非字符时,直接跳转到重新输入的PA处,程序会发生如下错误:
跳转时相对跳出范围N字节;
所以要使用无条件转移指令JMP来解决这个问题;
在其他处发生此类错误也是用同样的的解决方法。
错误程序:
ABD:
JGPA
修改后的程序:
(2)在实现输出L1部分处,输出buf1和转换后的buf2后,程序会输出处会有一小段乱码;
解决的办法是:
在输出结尾处增加输出换行buf3即可解决。
L1:
LEADX,OUTPUTMESS;
(3)调用子程序ABC或者CBA后已经完成了一种转换,需要跳转到输出部分L1实现输出,所以在调用完子程序后必须加一条无条件转换语句JMP,否则程序会继续执行到其他部分。
AB:
CALLABC;
(4)在输入字符是,输入的字符长度小于前面所输的字符长度时,会出现错误,即结果会显示上一次字符输入的部分结果,原因是buf2没有清空。
如图4-4:
解决方法是加一个buf2的指令段,如下所示:
图4-4第二次结果出错
4.5结果分析
通过对程序的修改,在最初设计的程序上加上一部分指令,解决初始程序中的bug即不足,从而完善了程序,满足了要求。
5心得体会
经过了将近两周的时间,我终于能写心得体会了,这也意味着我的课程设计基本结束了。
在这两周的时间里,刚开始几天有3门专业课要考试,期间有一门自控要考试,都