汇编语言代码转换程序设计.docx

上传人:b****2 文档编号:17208231 上传时间:2023-07-23 格式:DOCX 页数:19 大小:89.76KB
下载 相关 举报
汇编语言代码转换程序设计.docx_第1页
第1页 / 共19页
汇编语言代码转换程序设计.docx_第2页
第2页 / 共19页
汇编语言代码转换程序设计.docx_第3页
第3页 / 共19页
汇编语言代码转换程序设计.docx_第4页
第4页 / 共19页
汇编语言代码转换程序设计.docx_第5页
第5页 / 共19页
汇编语言代码转换程序设计.docx_第6页
第6页 / 共19页
汇编语言代码转换程序设计.docx_第7页
第7页 / 共19页
汇编语言代码转换程序设计.docx_第8页
第8页 / 共19页
汇编语言代码转换程序设计.docx_第9页
第9页 / 共19页
汇编语言代码转换程序设计.docx_第10页
第10页 / 共19页
汇编语言代码转换程序设计.docx_第11页
第11页 / 共19页
汇编语言代码转换程序设计.docx_第12页
第12页 / 共19页
汇编语言代码转换程序设计.docx_第13页
第13页 / 共19页
汇编语言代码转换程序设计.docx_第14页
第14页 / 共19页
汇编语言代码转换程序设计.docx_第15页
第15页 / 共19页
汇编语言代码转换程序设计.docx_第16页
第16页 / 共19页
汇编语言代码转换程序设计.docx_第17页
第17页 / 共19页
汇编语言代码转换程序设计.docx_第18页
第18页 / 共19页
汇编语言代码转换程序设计.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

汇编语言代码转换程序设计.docx

《汇编语言代码转换程序设计.docx》由会员分享,可在线阅读,更多相关《汇编语言代码转换程序设计.docx(19页珍藏版)》请在冰点文库上搜索。

汇编语言代码转换程序设计.docx

汇编语言代码转换程序设计

信息工程学院

课程设计报告

设计题目:

______代码转换程序设计______

名称:

微机原理与接口课程设计

班级:

_______通信工程1002班______

姓名:

_______卓自强_王可______

学号:

____20100135442010013524__

设计时间:

指导教师:

__________卢清平____________

 

评语:

评阅成绩:

评阅教师:

一、程设计的性质和目的

通过课程设计,进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关软件程序设计的基本知识和基本方法,硬件电路的设计等,通过实际动手能力的培养,进一步熟悉汇编语的结构和使用方法,掌握软硬结合的控制程序设计,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平,增进对汇编语言的认识,加强用汇编语言编程的能力;

掌握汇编语言的中断调用功能的应用,可以用汇编语言调用各种中断调用功能,并由此实现对硬件的控制等。

了解和掌握汇编语言程序设计过程、方法及实现,为以后相关的课程的学习打下良好基础。

二、课程设计要求

1、遵循模块化、结构化的程序设计方法。

2、要求程序必须正确。

3、程序简明易懂,多运用输入输出提示,有出错信息及必要的注释。

4、要求程序结构合理,语句使用得当。

5、适当追求编程技巧和程序运行效率。

三、主要仪器设备及软件

Pc机,MASM汇编软件,绘图软件,等

4、课程设计题目及要求

题目:

代码转换程序

要求:

完成一个字母或数制之间的转化程序,主程序分别具有5种可选择的子功能,按相应的字符可分别进入相应的子功能并在屏幕上显示结果,按“q”键退出。

5种可选择的子功能分别为:

1)实现小写字母向大写字母的转换

2)实现大写字母向小写字母的转换

3)实现二进制数向十六进制数的转换

4)实现十六进制数向二进制数的转换

5)实现十六进制数向十进制数的转换

五、课题分析及设计思路

1、实现大小写字母之间的转换:

输入的字符串中,不是字母的字符不改变;大写字母改成小写字母时,若是大写字母则不改变;同样,小写字母改成大写字母时,若是小写字母则不改变

2、二进制和十六进制数之间的转换:

输入一个二进制数(或十六进制数),用十六进制数(或二进制数)表示输出;最多能把十六位二进制数(或四位十六进制数)用四位十六进制数(或十六位二进制数)表示输出;小于十六位(或四位)时按“q”结束并输出

3、十进制数和十六进制数之间的转换:

输入一个十六进制数,用十进制数表示输出;最大能把十六进制数FFFF转换成十进制数65535表示输出;小于FFFF时按“q”结束并输出

整个程序由四个主要的子程序和若干个辅助子程序组成,实现六个转换功能:

HEXIDEC用来把一个十六进制数转换成十进制数表示

BINARY用来把十六制数转换为十六位二进制数表示

BETOHE用来把一个十六位二进制数转换成十六进制输出

1、INPUT用来输入字符串

2、HEXIBIN用来输入一个十六进制数,并存放在BX中

3、BINIDEC用来把BX中十六进制转换到十进制

4、DEC_DIV用来除以各位十进制的权

5、PRINT用来把BX中的十六进制数转换成二进制

8、INBIN输入十六二进制数

9、CRLF用来换行

六、程序主要流程

7、程序及主要代码与分析

7.1程序及主要代码

GAIXIEMACROP1,P2,P3,P4,P5,P6;义该宏用来判定字母?

P2:

CMPBYTEPTR[SI],P3

JBP5

CMPBYTEPTR[SI],P4

JNBP5

CMPBYTEPTR[SI],'$';到$则结束

JZP6

P1BYTEPTR[SI],20H

P5:

INCSI

LOOPP2

P6:

LEADX,BUF1+2;出改写后的字母

MOVAH,9;调用9号中断功能,输出字符串

INT21H

LEADX,BF;把BF首地址给CX

MOVAH,9;调用9号中断功能

INT21H

JMPSTART;返回

ENDM

DATASEGMENT;义数据段

BUFDB'**********choosetheoperation**********',0DH,0AH

DB'1:

bigtosmall',0DH,0AH

DB'2:

smalltobig',0DH,0AH

DB'3:

hexadecimaltobinary',0DH,0AH

DB'4:

binarytohexadecimal',0DH,0AH

DB'5:

hexadecimaltodecimal',0DH,0AH

DB'6/q:

EXIT',0DH,0AH,'$'

BFDB0DH,0AH,'$'

BUF1DB21,?

20DUP(?

);用来存放输入的字符串

BUF2DB'enterahexdata:

$'

BUF3DB'Theinputiswrong,chooseagainplease:

$'

BUF4DB'enteradecidata:

$'

BUF5DB'enterabindata:

$'

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVDX,OFFSETBUF;出选择界面

MOVAH,9;调用9号中断功能

INT21H

MOVAH,1;入要选择的操作

INT21H

PUSHAX;NT会改变AL的值,应压栈保护

LEADX,BF;行

MOVAH,9;调用9号中断功能

INT21H

POPAX;把AX压栈保护

CMPAL,'1';把AL中内容跟1比较

JZBTOS;相等则跳转到

CMPAL,'2'

JZSTOB

CMPAL,'3'

JZHTOB

CMPAL,'4'

JZBTOH

CMPAL,'5'

JZHTOD

CMPAL,'6'

JZEXIT

CMPAL,71H

JZEXIT

LEADX,BUF3;把BUF3的首地址给DX

MOVAH,9

INT21H

CALLCRLF;调用子程序CALL

JMPSTART;返回,重新选择

EXIT:

MOVAH,4CH;退出

INT21H

BTOH:

CALLBETOHE;调用二进制转十六进制子程序

HTOB:

CALLBINARY;调用十六进制转二进制子程序

HTOD:

CALLHEXIDEC;调用十六进制转十进制子程序

BTOS:

CALLINPUT;大写字母改为小写

MOVCX,20;作为循环条件

GAIXIEADD,NEXT1,'A','Z',N1,N2;宏GAIXIE展开

STOB:

CALLINPUT;小写字母改为大写

MOVCX,20

GAIXIESUB,NEXT2,'a','z',N3,N4

INPUTPROCNEAR;输入字符串

MOVDX,0;DX清零

MOVDX,OFFSETBUF1;把BUF1的首地址给DX

MOVAH,10;调用10号中断功能,输出字符串

INT21H

LEADX,BF;把BF首地址给DX

MOVAH,9

INT21H

LEASI,BUF1+2

MOVBL,[SI-1];把输入的字符个数给BL

MOVBH,0;BH清零

MOVBYTEPTR[BX+SI+1],'$';把$作为字符串结束字符

LEADX,BUF1+2

MOVAH,9

INT21H

RET;返回

INPUTENDP

HEXIDECPROCNEAR;用该子程序把一个十六进制数转换成十进制数表示

PUSHDS;保护初始数据段

SUBAX,AX;AX清零

PUSHAX;把AX压栈保护

START1:

LEADX,BUF2

MOVAH,9

INT21H

CALLHEXIBIN;调用输入一个十六进制数子程序

CMPAL,71H;遇q则退出

JZEXIT1

CALLCRLF;换行

CALLBINIDEC

CALLCRLF

JMPSTART1;返回

EXIT1:

RET

HEXIDECENDP

HEXIBINPROCNEAR;输入一个十六进制数,并存放在BX中

MOVBX,0;把BX清零

MOVDX,0;作为输入四位的记数器

INHEX:

CMPDX,4;把DX跟4比较

JNBHEXEND;大于则跳转

MOVAH,1;输入数据

INT21H

CMPAL,71H;遇到q则退出

JZHEXEND

SUBAL,30H;判断是否数字或字母?

否则跳出

JLHEXEND

CMPAL,10;判断是否数字

JLADD_TO;是则存放BX中

SUBAL,7;把AL内容减7转为字母

CMPAL,10;判断是否小写字母(a~f)

JLHEXEND

CMPAL,16

JLADD_TO;小于则跳转

SUBAL,20H;判断是否大写字母(A~F)

CMPAL,10

JLHEXEND

CMPAL,16

JGEHEXEND

ADD_TO:

MOVCL,4;作为循环条件

SHLBX,CL;BX乘以16

MOVAH,0

ADDBX,AX;两数相加

INCDX;DX加1

JMPINHEX

HEXEND:

RET

HEXIBINENDP

BINIDECPROCNEAR;用来把BX中十六进制转换到十进制

MOVCX,10000;把10000给CX,作为万位的权

CALLDEC_DIV;调用除权子程序

MOVCX,1000

CALLDEC_DIV

MOVCX,100

CALLDEC_DIV

MOVCX,10

CALLDEC_DIV

MOVCX,1

CALLDEC_DIV

RET

BINIDECENDP

DEC_DIVPROCNEAR;除以各位十进制的权

MOVAX,BX;把BX内容给AX

MOVDX,0;DX清零

DIVCX

MOVBX,DX

MOVDL,AL

ADDDL,30H;转换为ASSII

MOVAH,2

INT21H

RET

DEC_DIVENDP

CRLFPROCNEAR;换行

LEADX,BF

MOVAH,9

INT21H

RET

CRLFENDP

BINARYPROCNEAR;该子程序用来把十六制数转换为十六位二进制数表示

START2:

LEADX,BUF2

MOVAH,9

INT21H

PUSHDS;把DS压栈

SUBAX,AX;AX清零

PUSHAX

CALLHEXIBIN

CMPAL,71H

JZEXIT2

CALLCRLF

CALLPRINT

CALLCRLF

JMPSTART2

EXIT2:

RET

BINARYENDP

PRINTPROCNEAR;把BX中的十六进制数转换成二进制

MOVCX,16D;记数

ROT:

SHLBX,1D;每移一位最高位变为CF

JCSET;CF为1则跳到SET,否则输出0

MOVDL,30H

MOVAH,2

INT21H

DECCX

JNZROT

RET

SET:

MOVDL,31H;输出1

MOVAH,2

INT21H

DECCX

JNZROT

RET

PRINTENDP

DECIBINPROCNEAR;输入一个五位的十进制数

MOVBX,0

MOVCX,0

NEWCHAR:

CMPCX,5

JNBEXIT4

MOVAH,1

INT21H

CMPAL,71H

JZEXIT4

SUBAL,30H

JLEXIT4

CMPAL,9

JGEXIT4

CBW

INCCX

XCHGAX,BX

MOVDX,10

MULDX

XCHGAX,BX

ADDBX,AX

JMPNEWCHAR

EXIT4:

RET

DECIBINENDP

BINIHEXPROCNEAR;把BX中的十进制数转换成十六进制输出

MOVCH,4

ROTATE:

MOVCL,4

ROLBX,CL;把BX中高四位移到低四位,放到AL中

MOVAL,BL

ANDAL,0FH

ADDAL,30H

CMPAL,3AH;判断是否为数字

JLPRINTIT

ADDAL,7

PRINTIT:

MOVDL,AL

MOVAH,2

INT21H

DECCH

JNZROTATE

RET

BINIHEXENDP

BETOHEPROCNEAR;用该子程序来把一个十六位二进制数转换成十六进制数

START3:

LEADX,BUF5

MOVAH,9

INT21H

PUSHDS

SUBAX,AX

PUSHAX

CALLINBIN

CMPAL,71H

JZEXIT5

CALLCRLF

CALLBINIHEX

CALLCRLF

JMPSTART3

EXIT5:

RET

BETOHEENDP

INBINPROCNEAR;输入十六二进制数

MOVBX,0

MOVCX,0

PUTIN:

CMPCX,16

JNBEXIT6

MOVAH,1

INT21H

CMPAL,1BH

JZEXIT6

SUBAL,30H

JLEXIT6

CMPAL,1

JGEXIT6

CBW

INCCX

XCHGAX,BX

MOVDX,2

MULDX

XCHGAX,BX

ADDBX,AX

JMPPUTIN

EXIT6:

RET

INBINENDP

CODEENDS

ENDSTART

7.2算法分析

小写字母的ASCII码比大写字母的ASC码大20H,因此,大写字母转换成小写字母就是将大写字母的ASCII码加20H,反之,小写字母转换成大写字母就是将小写字母的ASCII码减20H。

二进制转换为十六进制

在数据段中定义一个空间用于存储输入的二进制数,每一位二进制数占一个字节,在输入二进制的时候,假设用一个指针DI指向定义的段,每输入一位二进制数,指针就加一。

当输入结束时,指针指向存储二进制最低位的位置。

再用另外一个指针SI指向段。

在取数时,将所取的数减30H,将它由ASCII码变成真正的二进制。

首先二进制数最后一位取数,如果该数是1,就将DL加1。

第一个指针DI减1,指向倒数第二位,如果倒数第二位是1,将DL加2。

DI减1,再取倒数第三位,如果取得的数是1,DL就加4。

DI减1,取倒数第四位,如果取得1,DL就加8。

这样就将二进制的第四位求和,DL再加30H,与39H比较,如果小于39H,就将DL入栈。

如果大于39H,再将DL加07H,然后将其入栈就这样向前取数,每四位像前面一样求和、入栈。

每次取数后,DI减1,比较SI和DI,如果两者相等,表示数已取完,直接进入入栈操作。

就这样每四位求和、转换、入栈,就将每四位作为一体转换为一位十六进制数。

由于低位先入栈,所以每出栈一位并显示,最后得到的十六进制也是从高到低的

十六进制转换为二进制

输入一位十六进制数,将它由ASCII码形式转换为二进制形式,采用移位指令将其左移四位,再与另个输入的十六进制数的二进制形式相与得到一个八位二进制数,假设将它赋给BH,然后再输入两位十六进制数,采取前面的操作得到另一个八位二进制数,将它赋给BL,这样就得到一个16位二进制数。

将BX带CF位循环左移,如果CF=1,则显示字符‘1’,如果CF=0,则显示字符‘0’。

当循环结束时,就将十六进制数转换为二进制数显示出来。

十六进制转换为十进制

①输入一位十六进制数,将它由ASCII码转换为二进制,将它赋给BX。

②再输入第二位十六进制数,转换为二进制后,假设将它赋给AX,BX向左移四位。

③依次输入第三位十六进制数,转为二进制后将它赋给AX,重复第二步后面的操作。

④最后输入第四位十六进制数,重复第二步操作,最后得到的是这个四位十六进制数的求和。

⑤利用这个和除10000得到十进制数的万位,并显示万位。

余数在除以1000,得到千位并显示。

余数在除100,得到并显示百位。

余数除10,得到并显示十位。

最后的余数就是个位,显示个位。

这样一个四位十六进制数就转换为十进制数。

 

8、实验结果截图

(1)主界面进行选择,如图8-1所示:

图8-1主界面

(2)选择1,进行大写字母转换成小写字母的程序界面,如图8-2所示:

图8-2大写字母转换成小写字母

(3)选择2,进行小写字母转换成大写字母的程序界面,如图8-3所示:

图8-3小写字母转换成大写字母

(4)选择3,进行十六进制转换成二进制的程序界面,如图8-4所示:

图8-4十六进制转换成二进制

(5)选择4,进行二进制转换成十六进制的程序界面,如图8-5所示:

图8-5二进制转换成十六进制

(6)选择5,进行十六进制转换成十进制的程序界面,如图8-6所示:

图8-6十六进制转换成十进制

选择6(q),退出主界面,如图8-7

图8-7,选择q退出主界面

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2