摘要 (1)数制转换 (2)1 DOS功能调用介绍 (2)2 设计方案 (5)3 总程序 (6)4 程序流程图及程序设计分析 (13)4.1主程序流程图 (13)4.2主程序流程图分析 (14)4.3大小写转换子程序ABC (14)4.3.1 子程序ABC (14)4.3.2 子程序ABC的流程图 (16)4.3.3 子程序ABC流程图分析 (16)4.4ASCII码转换子程序CBA (17)4.4.1 子程序CBA (17)4.4.2 子程序CBA的流程图 (18)4.4.3 子程序ABC流程图分析 (18)5 程序运行实例 (19)5.1大小写转换 (20)5.2ASCII码转换 (20)5.3输入非字符 (21)5.4调试中出现的错误 (21)6 心得体会 (23)参考文献 (24)摘要汇编语言是直接面向处理器(Processor)的程序设计语言。
处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。
每一种处理器都有自己可以识别的一整套指令,称为指令集。
处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。
汇编语言的主要特点是可以使用助记符来表示机器指令的操作码和操作数,可以用标号和符号来代替地址、常量和变量。
这次课程设计的任务是用汇编语言进行一个数制转换,从键盘输入一串字符(非字符则不接受),通过屏幕提示菜单选择转换成ASCII码,或者进行大小写转换(原来是大写转换成小写,小写则转换为大写)并显示。
先输入要转换的数据,再对数据进行检验判断其合法性,对不合法的数据进行警报并重新输入数据,对合法的数据按照要求进行大小写转换或者转换成ASCII,码,最后显示转换后的字符串。
关键词:DOS功能调用 ASCII码大小写转换数制转换1 DOS功能调用介绍DOS是一个磁盘操作系统,也称为IBM-DOS或者MS-DOS。
DOS不仅为用户提供了许多使用命令,而且还有用户可以直接调用的上百个子程序。
对这些子程序的调用,称为系统功能调用。
这些子程序主要完成一系列的管理功能。
在使用时,用户不需要了解各种I/O接口硬件的详细情况,就能完成对I/O接口的控制和管理。
为了使用方便,将所有子程序从1号开始顺序编号,这些编号称为DOS 功能调用号。
所以在进行设计之前,先要弄清楚DOS 功能调用。
常用的DOS功能调用:1.键盘输入并显示(1号功能调用)格式: INT 21H功能:按下任何键,将其对应字符的ASCII码送入AL中,并在屏幕上显示该字符。
如果按下的是Ctrl+Break组合键,则终止程序执行。
1号功能调用无须入口参数,出口参数在AL中2.键盘输入但不显示格式: MOV AH, 08HINT 21H功能:同1号功能调用,但字符不在屏幕上显示。
3.屏幕显示一个字符(2号功能调用)格式: MOV DL, ‘字符’MOV AH, 02HINT 21H功能:将置入DL寄存器中的字符在屏幕上显示输出。
4.打印输出(5号功能调用)格式: MOV DL, ‘字符’MOV AH, 05HINT 21H功能:将置入DL寄存器中的字符送打印机接口,打印输出。
5.屏幕显示格式: LEA DX, 字符串的偏移地址MOV AH, 09HINT 21H功能:在屏幕上显示字符串。
在使用9号功能调用时,应当注意以下问题。
(1)待显示的字符串必须先放在内存一数据区(DS段)中,且以‘$’符号作为结束标志。
(2)应当将字符串首地址的段基址和偏移地址分别存入DS和DX寄存器中。
6.字符串输入功能调用(0AH号功能调用)格式: LEA DX, 已定义缓冲区的偏移地址MOV AH, 0AHINT 21H功能:从键盘接收字符,并存放到内存缓冲区。
在使用0AH号功能调用时,应当注意以下问题。
(1)执行前先定义一个输入缓冲区,缓冲区内第一个字节定义为允许最多输入的字符个数,字符个数应包括回车符0DH在内,不能为“0”值。
第二个字节保留,在执行程序完毕后存入输入的实际字符个数。
从第三个字节开始存入从键盘上接收字符的ASCII码。
若实际输入的字符个数少于定义的(2)应当将缓冲区首地址的段基址和偏移地址分别存入DS和DX寄存器中。
7.返回DOS操作系统(4CH号功能调用)格式: MOV AH, 4CHINT 21H功能:终止当前程序的运行,并把控制权交给调用的程序,即返回DOS系统,屏幕出现DOS提示符,如“C: \ >”,等待DOS命令。
8.直接输入、输出单字符(6号功能调用)格式: MOV DL, 输入/输出标志MOV AH, 06HINT 21H功能:执行键盘输入操作或屏幕显示输出操作,但不检查Ctrl+Break组合键是否按下。
执行这两种操作的选择由DL寄存器中的内容决定。
(1)当(DL)=0FFH时,执行键盘输入操作。
若标志ZF=0,AL中放入字符的ASCII码;若标志ZF=1,表示无键按下。
这种调用用来检测键盘是否有键按下,但不等待键盘输入。
(2)当(DL)≠0FFH时,表示将DL中内容送屏幕显示输出。
9.检查键盘的工作状态(0BH号功能调用)格式: MOV AH, 0BHINT 21H功能:检查是否有键盘输入,若有键按下,则使AL=0FFH,若无键按下,则AL=00H。
对于利用键盘操作退出循环或使程序结束之类的操作来说,这种调用是很方便实用的。
2 设计方案本次课程设计的要求是:从键盘输入一串字符,通过屏幕提示菜单选择转换成ASCII码,或者进行大小写转换并显示。
设计的基本思路:首先要先完成字符串的输入并存在buf1中,然后输入一个字符通过检验字符来选择跳转到相应的子程序中去进行ASCII码转换或者进行大小写转换,将转换后的字符串存放到buf2中;转换完成后跳转到输出部分即可完成程序功能;为了程序能重复运行,在代码段末尾加一条强制跳转语句跳到开头部分。
3 总程序;*----------------------------------------------------------*;* 输入一串字符(非字符则不接受) *;* 原字符存放在buf1中 ,转换后的字符存放在buf2中 *;* 按照屏幕菜单选择进行ASCII码转换 *;* 或者进行大小写转换 *;*----------------------------------------------------------*DATA SEGMENT ;数据段input db 0ah,0dh,'if you want to quit ,please press Q/q! 'db 0ah,0dh,'press other key to zhuanhuan',0ah,0dh,'$';输入提示inputmess db 0ah,0dh,'please input buf1:',0ah,0dh,'$' buf db 100db ?db 100 dup(0) ;字符缓冲区ZHUANHUAN db 0ah,0dh,'if you want to change case press A/a! 'db 0ah,0dh,'if you want to transform to ascii pressB/b!',0ah,0dh,'$' ;转换提示outputmess db 0ah,0dh,'after transform Character String BUF2 :'db 0ah,0dh,'BUF1:$' ;输出提示BUF1 DB 100 dup(0)chgline db 0ah,0dh,'BUF2:'BUF2 DB 100 DUP(0)BUF3 db 0ah,'$'DATA ENDSSTACK1 SEGMENT STACKDB 20 DUP(?)STACK1 ENDSCODESEGMENT ;代码段ASSUME DS:DATA,SS:STACK1,CS:CODESTART:MOV AX,DATAMOV DS,AXAP: LEA DX,input ;输入提示MOV AH,9INT 21hMOV AH,08hINT 21hCMP AL,'Q'JE exitCMP AL,'q'JE exitPA: LEA DX,inputmessMOV AH,9INT 21hLEA DX,bufMOV AH,10 ;输入字符INT 21hLEA di,buf+2 ;将字符存入缓冲区buf中LEA si,buf1MOV CX,0next: MOV DL,[di]INC diCMP DL,0dh ;判断是否传送完毕JNE aaJMP end0aa: MOV [si],DL ;将缓冲区buf中的内容存入buf1中INC siINC CXJMP nextexit: MOV AH,4CHINT 21Hend0: MOV byte ptr [si],'$'INC CXMOV BP,CXMOV SI,OFFSET BUF1 ;建立源地址指针MOV DI,OFFSET BUF2 ;建立目标地址指针MOV CX,BP ;字节数送入CX寄存器LEA DX, ZHUANHUAN ;输出转换信息,进行转换选择MOV AH,9INT 21HMOV AH,08INT 21HCMP AL,'A' ;检验输入的字符,输入A/a跳到AB进行大小:;写转换,是B/b跳到BA进行ASCII转换JE ABCMP AL,'a'JE ABCMP AL,'B'JE BACMP AL,'b'JE BAAB: CALL ABC ;调用子程序ABCJMP L1BA: CALL CBA ;调用子程序CBAJMP L1ABC PROC ;子程序ABCAC: PUSH SI ;进栈PUSH DIPUSH CXPUSH AXMOV AL,[SI]CMP AL,'$'JE L1 ;判断大小写并进行大小写转换 CMP AL,'a'JL DBACMP AL,'z'JL JKJMP PAJK: SUB AL,20HMOV [DI],ALJMP AA0DBA: CMP AL, 'Z'JL KKJMP PAKK: CMP AL,'A'JG LLJMP PALL:ADD AL,20HMOV [DI],ALAA0: INC SIINC DIDEC CXJNZ ACPOP CX ;出栈POP DIPOP SIPOP AXRETABC ENDPCBA PROC ;完成字符转换成ASCII的子程序 AD: PUSH SI ;进栈PUSH DIPUSH CXPUSH AXMOV AL,[SI]CMP AL,'$'JE L1CMP AL,'a'JL ABDCMP AL,'z'JLE HWJMP PAHW: CBWMOV BL,10H ;将小写字母转换成ASCIIDIV BLADD AL,30HMOV [DI],ALINC DIADD AH,30HMOV [DI],AHJMP BB0ABD: CMP AL ,'Z'JLE HOJMP PAHO: CMP AL,'A'JGE MOJMP PAMO: CBWMOV BL,10H ;将大写字母转换成ASCII码 DIV BLADD AL,30HMOV [DI],ALINC DIADD AH,30HMOV [DI],AHBB0: INC SI ;SI+1,DI+1INC DIDEC CXJNZ ADPOP CX ;出栈POP DIPOP SIPOP AXRETCBA ENDPL1: LEA DX,OUTPUTMESS ;实现输出MOV AH,9INT 21HLEA DX,buf1MOV AH,9INT 21hLEA DX,chgline MOV AH ,9INT 21hLEA dx,BUF3MOV ah,9INT 21hJMP APCODE ENDSEND START4 程序流程图及程序设计分析4.2 主程序流程图分析首先在屏幕上输出显示字符串输入提示符,再进行字符串的输入,输入字符串完成后在屏幕上输出转换信息:(选择输入A/a进行大小写转换或者输入B/b 进行ASCII转换),接着输入一个字符,判断输入字符A/a还是B/b跳转到进行相应的转换(在子程序中判断是否有非字符,若有非字符则重新输入,没有则进行转换),转换完成后跳转到输出部分进行输出,程序结束。