77范文网 - 专业文章范例文档资料分享平台

第四章 汇编语言程序设计(DOC)(2)

来源:网络收集 时间:2019-01-10 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

CLR C ;清进位位 LOOP: MOV A, @R0 ;取被加数 ADDC A, @R1 ;与加数相加 MOV @R0, A ;存相加结果 DEC R0 ;地址减1 DEC R1 ; DJNZ R7, LOOP ;未完,继续 MOV 00H, C ;存进位位 RET

(假如我们要做一个三字节无符号数的加法,例如)

例4.3:已知有数据3A59F0H+F687B2H,请利用以上程序完成加法运算。并将和值送往片外RAM的50H,51H,52H单元。

(我们怎么来调用这个程序呢?首先根据提供的入口条件,将需要相加的数分别送往加数和被加数的单元,在这儿通过数据传送类指令来完成(对照程序说明),具体如下)

MOV 52H, #0F0H ;送被加数

MOV 51H, #59H MOV 50H, #3AH

MOV 55H, #0B2H ;送加数

MOV 54H, #87H MOV 53H, #0F6H LCALL ADDU ;调用多字节加法子程序 MOV R0, #50 ;和值送往外部RAM MOV R7, #03H LOOP: MOV A, @R0 MOVX @R0, A INC R0 DJNZ R7, LOOP : :

(假设我们需要把运算结果送外部RAM保存,又如何呢?对照程序的后半段予以说明。)

3、中断服务程序: 中断服务程序是为了完成中断请求而编制的程序。

(中断服务程序和子程序有相同点,也有不同点,相同在于两者都有断点,对子程序来说,断点是确定的,它就是调用子程序语句的下一条语句的地址,见下图的左边部分,说明调用过程;而中断服务程序的断点是不确定,因为不能事先预知中断何时发生。)

(介绍完单片机程序设计的基本概念后,我们来看一些程序设计举例。) ㈠算术运算程序

双字节无符号数乘法子程序 例4.4: 要进行两个双字节无符号数乘法运算,被乘数和乘数分别存放于内部RAM的R2,R3单元和R6,R7单元中(其中R2和R6分别为高位字节),相乘结果(积)依次存放在R4、

R5、R6、R7单元中。 (在单片机中,由于只有一条单字节的乘法指令,因此需要编写一个子程序来完成多字节的乘法运算,我们先来讲一下乘法运算的规则)

(对乘法运算规则给予解释,部分积1为16位,它是乘数低8位和被乘数低8位的乘积;部分积2为乘数低8位和被乘数的高8位的乘积,也是16位,而且部分积2的低8位和部分积1的高8对齐,高8位依次往前放;然后是乘数的高8位和被乘数的低8位,得到部分积3,该16位的积3的高低8位分别和部分积2的高低8位对齐;最后是乘数的高8位和被乘数的高8位相乘,得到部分积4,其低8位与部分积3的高8位对齐,高8位依次往前。最后我们把这些部分积相加,其中终积的低8位是部分积1的低8位,次低8位是三个字节的相加,再就是后面的三个8位字节相加,并考虑进位位,最后是终积的最高8位,并考虑进位,最终得到一个32位的结果,用4个8位的寄存器来存放此结果。明白这个基本运算规则,来看看我们这个例子,如何来放数据呢?是不是将这些多个中间字节存放起来,然后相加的办法?在我们的例子中,不采用这个方法,因为它有一个缺点:即4个部分积要占用比较多的工作寄存器。我们采用的方法是:)

R7*R3按照乘法规则,低8位放在寄存器A中,高8位放在寄存器B中,通过这两寄存器转存到R7和R5两个没有用过的寄存器中去,显然,R7就是终积的最低位的一个字节,R5是部分积的一部分;做完这个运算,我们来做R7*R2,结果仍然在A和B中,刚才我们已经有部分积在R5中,让R5和A相加,相加后的结果放到R4中,作为终积的一部分,并产生一个进位位,进位位和B相加,相加结果放到R5寄存器中,到这里,我们完成乘数低8位和被乘数的乘积运算结果,它们分别存放在R7、R4和R5中;下面我们来乘数的高8位与被乘数的16位相乘,这时,也是先R6*R3,乘积结果在A,B中,让R4和A相加,结果放到R6中,并产生进位位,R5和B相加,并考虑刚才的进位位,最后得到的结果放到R5中,并将进位位送F0(为了防止下面的加法进位覆盖,而另外存放),最后R6*R2,结果在B和A中,A与R5相加,结果继续放在R5中,进位送ACC.0,最后是暂存的进位、B和辅助进位位ACC.0相加结果存R4。最后得到相乘的结果。经过乘、加,乘、加的四个循环过程得到最后的结果。) (具体的子程序功能设计如下:) 子程序功能: 双字节无符号数相乘

程序入口:R2、R3为被乘数,R6、R7为乘数, 程序出口:R4、R5,R6、R7为乘积 程序影响:A、B、F0 (具体的程序编制如下:) DBMUL: MOV A, R3 MOV B, R7 MUL AB ;R3*R7(得第一次部分积) XCH A, R7 ;原R7内容送A,R7←R3R7L,(在R7中得到乘积得最低字节)

MOV R5, B ; R5←R3R7H MOV B, R2

MUL AB ;R2*R7(得第二次部分积) ADD A, R5 ; R2R7L+ R2R7H MOV R4, A ; R4←和

CLR A

ADDC A, B ; R2R7H+( R2R7L+R5时产生的进位) MOV R5, A ; R5←和 MOV A, R6 ; MOV B, R3

MUL AB ;R3*R6(得到第三次部分积) ADD A, R4 ;R3R6L+R4 XCH A, R6 ;A←R6, R6←R3R6L+R4(在R6中得到乘积的次低字节)

XCH A, B ; A←R3R6H,B←R6 ADDC A, R5 ; R3R6H+R5+( R3R6L+R4时产生的进位) MOV R5, A ;R5←和 MOV F0, C ; F0←进位 MOV A, R2

MUL AB ; R2*R6(得第四次部分积)

ADD A, R5 ; R2R6L+( R3R6H+R5时产生的进位) MOV R5, A ;在R5中得到终积的次高字节 CLR A

MOV ACC.0, C ;累加器最高位←进位 MOV C, F0

ADDC A, B ;R2R6H+F0+ACC.0

MOV R4, A ;在R4中得到终积的最高字节 RET

(具体讲解对照乘法运算规则和具体图例,简要说明该段程序的意思,编制程序的过程是对单片机指令系统的熟悉过程,也是对过去学习过的相关知识的复习过程,是一种综合能力的体现,希望同学们尽快熟悉单片机程序的设计过程。)

第四章 MCS-51汇编语言程序设计――汇编语言程序设计举例(2) (在上一次课中,我们给大家介绍了双字节的乘法运算程序设计,在应用上还有一类程序设计需要大家注意的,这就是数值转换程序,我们知道计算机处理的都是二进制数,但是,如果要将这些二进制数送往打印机打印时,它所接受的是ASCII码;如果送往显示器显示时,有一类显示器它接收的是十进制数,遇到这样的问题,我们都需要把计算机处理的二进制数转化为相应的外部设备所能够接受的代码,这样一类转换,我们就称数值转换。那么这一节课,我们就给大家讲解一下数值转换程序的编制。)

㈡ 数值转换程序

(数值转换程序一般都采用子程序来完成,即具体的转换功能由子程序完成,由主程序或上一级的调用程序来做组织数据、安排结果等工作,我们先来看) 1.十六进制数转换为ASCII码

(ASCII码又称美国信息交换标准码,一共有128个字符,这些字符常作为外部设备,如打印机、CRT显示器等的打印码或显示码使用,所以单片机要与这样一些设备交换信息时,输出的应该是ASCII码,但由于计算机内部处理的是二进制数或者是十六进制数,因此在输出前要进行十六进制数到ASCII码的转换;对于外部设备送给单片机的ASCII码数据,我们也要进行ASCII码到十六进制数的转换,单片机的CPU才能作进一步的处理,在转换之前,我们先来看,)

ASCII码与十六进制数据之间的关系: ASCII码字符: 00H~7FH

(ASCII码字符共128个,我们要进行数值转换,就是要找出十六进制的数据到ASCII码之间的关系,)

ASCII码与十六进制数据之间的关系: 0~9 → 30H~39H

A~F → 41H~46H

(我们要进行十六进制数到ASCII码的转换,如果计算机处理的数据是0~9时,对应的ASCII码为30H~39H,是A~F时,找到的是41H~46H。也就是说,如果计算机要把0送给打印机打印的时候,这时,你不能送0,而是30H,这样一种转换实际上有很多种方式,) 转换方法: ⑴计算法:

0~9→+30H→→ASCII: 30H~39H

A~F→+30H+07H→→ASCII: 41H~46H

⑵查表法: 建立ASCII代码表存入程序存储器中,通过程序将与转换码相对应的ASCII码从表格中找出。

例4.5:在内部RAM的hex单元中存有两位十六进制数,试将其转换为ASCII码,并存放于asc和asc+1两单元中。 (我们这样表达) D7 D6 D5 D4 D3 D2 D1 D0 1 1 0 0 0 0 1 0 D2 Hex 0 0 1 1 0 0 1 0 32H asc 0 1 0 0 0 1 0 0 44H Asc+1

(假设我们把要转换的十六进制数为D2,按照要求将十六进制的2转换为ASCII码的32H,并放到asc单元,十六进制的D转换为ASCII码的44H存放于44H单元。下面看程序编制过程,我们用子程序来完成) 子程序 功能:完成堆栈区中SP所指单元中的低4位数据转换为ASCII码。

入口:待转换数据放入堆栈区中的首地址单元。

出口:转换后的数据放入堆栈区中的首地址单元 (子程序如何编写呢?我们来看看这个子程序) 子程序(HASC) HASC: DEC SP DEC SP POP ACC ANL A, #0FH ADD A, #7 MOVC A, @A+PC PUSH ACC INC SP INC SP RET

ASCTAB:DB”0, 1, 2, 3, 4, 5, 6, 7” DB”8, 9, A, B, C, D, E, F” 或建立的ASCII表: 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H 38H, 39H, 41H, 42H, 43H, 44H, 45H, 46H

(首先,用两条堆栈减1指令,由于我们的程序是子程序,供主程序或调用程序调用,在调用我们这个子程序时,要将断点处的地址压入堆栈,故作此操作)

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第四章 汇编语言程序设计(DOC)(2)在线全文阅读。

第四章 汇编语言程序设计(DOC)(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/415910.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: