进制转换程序设计1.docx

上传人:b****0 文档编号:12583704 上传时间:2023-04-20 格式:DOCX 页数:22 大小:116.80KB
下载 相关 举报
进制转换程序设计1.docx_第1页
第1页 / 共22页
进制转换程序设计1.docx_第2页
第2页 / 共22页
进制转换程序设计1.docx_第3页
第3页 / 共22页
进制转换程序设计1.docx_第4页
第4页 / 共22页
进制转换程序设计1.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

进制转换程序设计1.docx

《进制转换程序设计1.docx》由会员分享,可在线阅读,更多相关《进制转换程序设计1.docx(22页珍藏版)》请在冰豆网上搜索。

进制转换程序设计1.docx

进制转换程序设计1

1常用数制

计算机常用的数制:

二进制,十进制,八进制,十六进制。

通常表示一个数时,每个数字表示的量不散取决于数字本身,而且取决于所在的位置,这种表示方法被称为位置表示法。

在位置表示法中,对每个数位赋予一定的位值,称为权。

每个数位上的数字锁表示的量是这个数字和权的乘积。

相邻两位中高位的权与低位的权之比如果是个常数,则此常数称为基数,用X表示,则数

所表示的量N为

式中,从

起向左是数的整数部分,向右是数的小数部分;

表示各数位上的数字,称为系数,它可以在0,1,…,X-1共X中数中任意取值;m和n为冥指数,均为正整数。

正由于相邻高位的权与低位的权相比是个常数,因而在这种位值计数法中,基数(或称底数)X的取值不同便得到不同进位制数的表达式。

(1)十进制

十进制是生活中最常用的十进制,当X=10时,得十进位制数的表达式为

其特点是:

系数

只能在0~9这10个数字中取值;每个数位上的权是10的某次冥;在加,减运算中,采用“逢十进一,借一当十”的规则。

(2)二进制

二进制是计算机中最常用的数值。

当X=2时,得二进制数的表达式为

二进制的特点是:

系数

只能在0和1这两个数字中取值;每个数位上的权是2的某次冥;在加减运算中,采用“逢二进一,借一当二”的规则。

(3)八进制和十六进制

由于1位八进制数对应3位二进制,1位十六进制对应4位二进制,因此,当二进制数列很长时,可以用八进制或十六进制数来表示。

当X=8时,得八进制数的表达式为

八进制的特点是:

系数

只能在0~7这8个数字中取值;每个数位上的权是8的某次冥;在加减运算中,采用“逢八进一,借一当八”的规则。

同理,当X=16时,得十六进制数的表达式为

十六进制的特点:

系数

只能在0~15这16个数字中取值(其中0~9这10个数字借用十进制中的数码,10~15这6个数用A,B,C,D,E,F表示);每个数位上的权的16的某次冥;在加减运算中,采用逢“十六进一,借一当十六”的规则。

表1.1列出四种进位制中数的表示法,其中B是Binary的缩写,表示该数为二进制数;Q表示该数为八进制数;H是Hexadecimald的缩写,表示该数是十六进制数;十进制数采用符合D(Decimal)。

表1.1十进制,二进制,八进制,十六进制数码对照表

十进制

二进制

八进制

十六进制

0

0000B

0Q

0H

1

0001B

1Q

1H

2

0010B

2Q

2H

3

0011B

3Q

3H

4

0100B

4Q

4H

5

0101B

5Q

5H

6

0110B

6Q

6H

7

0111B

7Q

7H

8

1000B

10Q

8H

9

1001B

11Q

9H

10

1010B

12Q

AH

11

1011B

13Q

BH

12

1100B

14Q

CH

13

1101B

15Q

DH

14

1110B

16Q

EH

15

1111B

17Q

FH

数制间的转换规则

1.十进制数与非十进制数之间的转换

(1)十进制数转换成非十进制数

把一个十进制数转换成非十进制数(基数记作R)分成两步.整数部分转换时采用“除R取余法”;小数部分转换时采用“乘R取整法”。

(2)非十进制数转换成十进制数

非十进制数(基数记作R,第j个数位的位权记作Rj)转换成十进制数的方法:

按权展开求其和。

2.非十进制数之间的转换

(1)二进制数与八进制数之间的转换

二进制数转换成八进制数的方法.以小数点分界,整数部分自右向左、小数部分自左向右,每三位一组,不足三位时,整数部分在高位左边补0,小数部分在低位右边补0,然后写出对应的八进制数码。

八进制数转换成二进制数的方法:

用八进制数码对应的三位二进制数代替八进制数码本身即可。

(2)二进制数与十六进制数之间的转换

二进制数转换成十六进制数的方法:

以小数点分界,整数部分自右向左、小数部分自左向右,每四位一组,不足四位时,整数部分在高位左边补0,小数部分在低位右边补0,然后写出对应的十六进制数码。

十六进制数转换成二进制数的方法:

用十六进制数码对应的四位二进制数代替十六进制数码本身即可。

 

2设计原理

程序流程图如图2.1所示。

 

N(A)

N(A)N(A)

YYY

 

图2.1程序运算流程图

对于不同的情况我们只需要定义不同的输入函数和输出函数,根据不同的情况,调用不同的输入函数和输出函数。

本程序调用二进制输入,十进制输入,十六进制输入,二进制输出,十进制输出,十六进制输出等六个子程序。

确定程序功能和功能结构,数据结构,以及用户界面;对各功能模块进行准确的定义,对全局数据变量进行说明和定义;确定各功能模块的原理及算法并画出相应的数据和程序流图。

课设涉及到各种跳转,各个寄存器之间的移动,特定的输入和输出。

调用01h的输入功能,结果在al中,调用02h的输出功能,输出得到是dl里面的内容。

提示信息的输出是用db来定义的,结束标志是$,同时我也定义了一个表,来应对各种不同的情况。

首先输出一个选择窗口,有6种选择。

按照自己的要求选择,选择之后,就会调用相应的输入函数,必须输入相应进制的数进行处理,2进制数必须输入16位,16进制数输入4位,10进制数要求输入的必须小于2的16次方。

输入之后,程序就会处理输入数据,然后调用相应的输出函数,就会输出相应的数据。

输入函数,输出函数都是子函数。

整个程序由主程序和若干子程序组成。

子程序:

完成各数制之间转换的具体功能实现

CRLF:

实现回车换行的操作

INBIN:

二进制输入子程序

OUTBIN:

二进制输出子程序

INDEC:

十进制输入子程序入

INHEX:

十六进制输入子程序

OUTDEC:

10进制输出子程序

OUTHEX:

16进制输出子程序

L1:

二进制转化成十进制

L2:

二进制转换成十六进制

L3:

十进制转换成二进制

L4:

十进制转换成十六进制

L5:

十六进制转换成十进制

L6:

十六进制转换成二进制

主程序:

主要实现友好的交互界面的设计,以及代码与数制之间相互转换的子程序调用。

定时器通道3的G端与61H端口的bit0位相联,如果将61H端口的bit0位置成1,那么定时器通道3就被启动,此时将有一组信号从OUT端输出,信号的频率可以用程序控制;若61H端口bit0位为0,则定时器被关闭,OUT端就会恒定为1,此电路用在这里相当一个"可控开关",如果将61H端口的bit0、bit1位都置成1,则相当于既打开了定时器又打开了开关,这时候定时器产生的声音信号就会送到放大器推动喇叭发声;若将bit0位置0,则定时器关闭,此时OUT端为1,这时候如果连续改变bit1位的状态,也可以从喇叭中听到声音;若将OUT位置0,则开关关闭,此时即使打开定时器也不能听到声音。

PC中的定时电路有三个通道,通道3用于发声,通道1用于控制系统内部的时钟。

通道1的工作方式和通道3一样,但是系统启动时设定其发出一个频率固定为18.2Hz的信号,这个信号直接送到系统中的"中断控制器"。

每一个"Hz"都产生一个硬件中断,一般称这个硬中断为"IRQ0",对应的中断号是08H。

也就是说,当计算机启动后,我们的机器看上去十分平静,但实际上CPU非常忙碌。

在定时器的控制下每隔55毫秒就要执行一个08H号中断,这个中断的主要工作就是连续地计数。

在内存"0040H:

006CH"处有四字节的存储空间专门用于保存计数值,CPU每执行一次08H中断,这四字节的计数值就被加1,不难算出这个计数值每增加1091后时间恰好过了1分钟,每增加65454后时间恰好过了1小时。

系统内部的时钟之所以能准确走时,靠得就是08H中断和这四字节的计数值。

因此我们要想精确的定时,必须依靠时钟计数值才行。

而该程序对时间要求不是那么严。

本次设计中,先将定时器3的OUT端置1,再给bit1一个矩形波,通过矩形波的频率来控制喇叭发声的频率;若控制OUT端为高电平时的时长,则可以控制报警音的时间。

设计的报警子程序模块如下:

BELLPROC

MOVDX,65535

INAL,61H

ANDAL,0FCH

TRIG:

XORAL,2

OUT61H,AL

MOVCX,65535

Delay:

LOOPDelay

DECDX

JNETRIG

RET

BELLENDP

3源程序

DATASEGMENT;数据段

MENUDB'PleaseInputyourChoice:

',0dh,0ah

db'1:

Bin-->Dec',0dh,0ah

db'2:

Bin-->Hex',0dh,0ah

db'3:

Dec-->Bin',0dh,0ah

db'4:

Dec-->Hex',0dh,0ah

db'5:

Hex-->Dec',0dh,0ah

db'6:

Hex-->Bin',0dh,0ah

db'0:

Exit.$',0dh,0ah

mess0db'error!

$'

mess1db'PleaseinputaBinnumber:

$'

mess2db'PleaseinputaDecnumber:

$'

mess3db'PleaseinputaHexnumber:

$'

mess4db'OutputBinis:

$'

mess5db'OutputDecis:

$'

mess6db'OutputHexis:

$'

TABLEDWL0,L1,L2,L3,L4,L5,L6

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

MAINPROCFAR

PUSHDS

XORAX,AX;清零AX,CF

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

MOVAX,DATA

MOVDS,AX

LKS:

LEADX,MENU;实现根据输入进行跳转

MOVAH,09H

INT21H;显示字符串DS:

DX=字符串

MOVAH,01H

INT21H;带回显的字符输入AL=8位数据

CMPAL,30H

JBLK          ;低于转移

CMPAL,36H

JALK;高于转移

JMPLK1

LK:

CALLBELL

JMPLKS

LK1:

ANDAL,0FH

LEASI,TABLE    ;将TABLE首地址给SI

MOVAH,0

SHLAX,1;将AX左移一位

ADDSI,AX       ;相加结果送回SI

JMP[SI];跳转到对应的进制转换部分

L1:

CALLINBIN;调用子程序INBIN

CALLCRLF

CALLOUTDEC

CALLCRLF

JMPLKS;无条件转移到LKS子程序

L2:

CALLINBIN;BIN——>HEX

CALLCRLF

CALLOUTHEX

CALLCRLF

JMPLKS

L3:

CALLINDEC     ;DEC——>BIN

CALLCRLF

CALLOUTBIN

CALLCRLF

JMPLKS

L4:

CALLINDEC;DEC——>HEX

CALLCRLF

CALLOUTHEX

CALLCRLF

JMPLKS

L5:

CALLINHEX;HEX——>DEC

CALLCRLF

CALLOUTDEC

CALLCRLF

JMPLKS

L6:

CALLINHEX;HEX——>BIN

CALLCRLF

CALLOUTBIN

CALLCRLF

JMPLKS

L0:

RET;返回

MAINENDP

CRLFPROC;回车换行子程序

MOVAH,02H;将02H送AH

MOVDL,0AH

INT21H

MOVDL,0DH

INT21H

RET;返回

CRLFENDP

BELLPROC;报警子程序

CALLCRLF

LEADX,MESS0

MOVAH,09H

INT21H

CALLCRLF

MOVDX,6553

INAL,61H

ANDAL,0FCH

TRIG:

XORAL,2

OUT61H,AL

MOVCX,65535

Delay:

LOOPDelay

DECDX

JNETRIG

RET

BELLENDP

INBINPROC;二进制的输入

LEADX,MESS1;MESS1首地址送DX

MOVAH,09H

INT21H

MOVBX,0

INBL1:

MOVAH,01H

INT21H

CMPAL,0DH;比较

JZINBEXIT;等于或结果为0转移

ANDAL,01H;相与,送到AL

SHLBX,1;将BX左移一位

ORBL,AL;相或,送到BL

JMPINBL1;无条件转移到INBL1

INBEXIT:

RET;返回

INBINENDP

;二进制的输入:

每次我们输入的数都放在al中,每次都将al和空的bl进行或运算,实际上就将我们输入的数据存到了bx中,之后左移一位,在输入数据,之后重复进行上面的步骤,这样就将我们所输入的数据存到了bx中。

INDECPROC;十进制的输入

LEADX,MESS2

MOVAH,09H;调用9号中断功能,字符串显示功能

INT21H

MOVBX,0

INDL1:

MOVAH,01H

INT21H

CMPAL,0DH

JZINDEXIT;等于或结果为0转移

SUBAL,30H

CMPAL,9

JBEINDL2;低于或等于,不高于转移

SUBAL,7

INDL2:

MOVAH,0

XCHGAX,BX;交换,AX<——>BX

MOVCX,10

MULCX;(AX)<——(AL)

(SRC)

ADDBX,AX

JMPINDL1

INDEXIT:

RET

INDECENDP

;十进制的输入:

通过ax和bx的配合使用,每次都将前一次输入的数据乘以10,在加上这一次的输入,就这样就形成了10进制的输入。

INHEXPROC;十六进制的输入

LEADX,MESS3

MOVAH,09H

INT21H

MOVBX,0

IHL1:

MOVAH,01H

INT21H

CMPAL,0DH

JZIHEXIT;等于或结果为0转移

SUBAL,30H;相减,结果送AL

CMPAL,9

JBEIHL2;低于或等于,不高于转移

SUBAL,7

IHL2:

MOVCL,4

SHLBX,CL

ORBL,AL

JMPIHL1

IHEXIT:

RET

INHEXENDP

;十六进制的输入:

输入的数据放在al中,将al和bl将行或运算,将我们所输入的数据保存起来,之后左移4位,在重复这个操作,将我们所输入的数据全部保存在16数据里面。

OUTBINPROC;二进制的输出

LEADX,MESS4

MOVAH,09H

INT21H

MOVCX,16

OBL1:

ROLBX,1

MOVDL,BL

ANDDL,01H;相与

ORDL,30H;相或

MOVAH,02H

INT21H

LOOPOBL1;循环OBL1子程序

RET

OUTBINENDP

;二进制的输出:

我们所输入的数据都保存在bx中,每次都将bx左移一位,然后将bl的数据转存到dl中,加上30h后,在输出之后就是二进制的了。

OUTDECPROC;十进制的输出

LEADX,MESS5

MOVAH,09H

INT21H

PUSHBX;入栈

MOVAX,BX

MOVDX,0;余数

MOVCX,10000

DIVCX;AX除以CX商送AL,余数送AH

MOVBX,DX

MOVDL,AL

ORDL,30H;逻辑与运算

MOVAH,02H

INT21H

MOVAX,BX

MOVDX,0

MOVCX,1000

DIVCX;AX除以CX商送AL,余数送AH

MOVBX,DX

MOVDL,AL

ORDL,30H

MOVAH,02H

INT21H

MOVAX,BX

MOVDX,0

MOVCX,100

DIVCX

MOVBX,DX

MOVDL,AL

ORDL,30H

MOVAH,02H

INT21H

MOVAX,BX

MOVCL,10

DIVCL

MOVBL,AH

MOVDL,AL

ORDL,30H

MOVAH,02H

INT21H

MOVDL,BL

ORDL,30H

MOVAH,02H

INT21H

POPBX;出栈

RET

OUTDECENDP

;十进制的输出:

将保存在bx中的数据转存到ax中来,由于19位数据所存最大数据是6万多,所以第一次除以一万,余数存放在dx中,商存在al中,将ax中的内容转存到dl中,输出出来,而将dx中的余数又转存到bx中,继续上面的操作,不过除数改城了1000,然后除数变成100,10,最后输出商。

OUTHEXPROC;十六进制输出程序

LEADX,MESS6

MOVAH,09H

INT21H

MOVCX,4

OHL1:

ROLBX,1;循环左移

ROLBX,1

ROLBX,1

ROLBX,1

MOVDL,BL

ANDDL,0FH

ADDDL,30H;加运算

CMPDL,39H

JBEOHL2;低于或等于,不高于转移

ADDDL,7

OHL2:

MOVAH,02H

INT21H

LOOPOHL1;OHL1循环

RET

OUTHEXENDP

;16进制的输出:

bx中左移4位,将dl低四位与bl低四位,进行与运算,结果在dl中,然手加上30h,变成ask码输出,就可以输出16进制数。

CODEENDS

ENDMAIN

 

4程序运行结果

运行程序首先输出一个选择窗口,有6种选择。

按照自己的要求选择进制转换之间的关系,选择之后,调用相应的输入函数,必须输入相应进制的数进行处理。

其中2进制数必须输入16位,16进制数输入4位,10进制数要求输入的必须小于2的16次方。

输入之后,程序就会处理输入数据,然后调用相应的输出函数,就会输出相应的数据。

开始运行程序

通过输入数字确定进制之间转换,其验证结果如下:

输入0~6之外的数字是错误的,发出警报,显示为:

1.二进制转换为10进制

2.二进制转换为16进制

3.10进制转换为二进制

4.十进制转换为十六进制

5.十六进制转换为十进制

6.十六进制转换为二进制

这个程序要求我们输入必须符合二进制,十进制和十六进制的规则,当二进制转化成其他进制时输入可为16位之内,而其他进制转换为二进制,二进制显示的是16位。

16进制显示的是4位。

当输入内容不符合程序要求时,仪器会发出警报,并且重新选择,直到选择或者数入正确为止。

 

5心得体会

本次实验设计的提点是将不同进制的输入输出分别写成功能不同的函数,不近翻遍调用,而且只需定义一次,不可以重复调用,可以简化程序。

我的收获是对数制转换的原理有了叫较为清楚的理解,可以解释原来不懂的程序,对应各种寄存器的跳转有了一定的了解,同时认识到由于寄存器的数量有限,我们有时侯不得不进行出栈和入栈了,这样可以解决有时候寄存器不够的情况,对应进一步学习汇编有了一定的推动作用,汇编基础有了一定的提高,这个课程设计让我对汇编重新复习一遍。

汇编语言程序设计是一门很抽象的学科,学起来也比较乏味。

一开始学的时候感觉很难,也没什么兴趣。

但随着学习的推进,以及上机编程,逐渐感到轻松。

在这次课程设计中,让我更加熟悉了汇编语言的一些基本的指令;掌握了汇编语言的一些基本的中断调用功能,可以用汇编语言调用各种中断调用功能,并由此实现对硬件的控制;能够熟练的利用子程序和宏进行编程。

在设计过程中,不断对程序进行修改、改进,增强了自己分析问题、解决问题的能力;在不断的调试中,也让自己发现了自己存在的一些错误以及一些调试时应注意的问题,同时也更深的理解了寄存器、存储器等工作原理以及一些指令执行后对它们的改变,例如INT指令会改变AL的值,在编程时应注意这方面的问题。

在编写过程中,让我深刻的体会到了搞科学的严谨性。

有时一个逗号或者写错一个字母这样一点点小小的错误,就会产生十几个错误,导致调试的失败。

不管做什么事,都要认认真真,否则就会得不偿失了。

当设计一步步接近成功,每一个子程序的调试成功,都让自己感到喜悦,从中体会到了编程的乐趣,有一种成就感,也让自己树立了信心,增强了对汇编语言程序设计的兴趣。

通过这次的课程设计,让我对汇编有了更进一步的认识,加强了我用汇编语言编程的能力。

 

参考文献

[1]易先清.微机计算机原理与应用.北京:

电子工业出版社,2001

[2]裘雪红等.微型计算机原理与接口技术.西安:

电子科技大学出版社,2001

[3]潘新民等.微型计算机原理汇编接口技术.北京:

希望电子出版社,2002

[4]李文英,刘星,宋蕴新,李勤.微机原理与接口技术.北京:

清华大学出版社,2001

[5]钱晓捷,陈涛.16/32位微机原理、汇编语言及接口技术.北京:

机械工业出版社,2001

[6]沈美明,温冬婵.IBM-PC汇编语言程序设计.北京:

清华大学出版社,2001

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1