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

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

来源:用户分享 时间:2025/10/25 19:46:28 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

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指令,由于我们的程序是子程序,供主程序或调用程序调用,在调用我们这个子程序时,要将断点处的地址压入堆栈,故作此操作)

(利用堆栈进行转换之前,要求先把数据放到堆栈中即Hex,在调用子程序之前,你要将该数据放入堆栈区的首地址中,当调用时,硬件又自动将断点的地址压入堆栈,故程序前两句是为了找到我们的待转换数据,找到后,将它弹回到累加器ACC中,用与指令屏蔽了高4位,低4位是待转换的数据,把它放到A中,加7是为了找到待转换数据在ASCII代码表中的位置; ASCII代码表用伪指令DB定义,双引号“”)里面的数据相当于ASCII代码。如果你对这个不了解的话,可以用下面一种形式来定义。它们完全相同,如30H代表ASCII码的0,46H代表ASCII码的F。

在表中寻找待转换代码的方法,首先从表的起始地址开始,根据偏移量来进行,为什么加7呢,因为程序后面四条指令占用的字节数为7,加完后利用查表指令,找到后放到A中,根据子程序的出口条件,还需要把它送回堆栈中,最后将堆栈指针恢复到调用前的位置。) (数据的组织工作由主程序来完成,如下,) 主程序(MAIN): MAIN: MOV SP, #0F0H PUSH hex ACALL HASC POP asc MOV A, hex SWAP A PUSH ACC ACALL HASC POP asc+1 : :

(首先设了一个堆栈指针,将待转换的数据按照子程序入口的要求,压入堆栈中,调用该子程序,完成整个转换工作,然后利用弹出指令,将该数据保存到相应的单元中,这就完成低4位16进制数到ASCII的转换;然后再将原数放到A中,进行高4位转换,先在A中高低位交换后,再调用子程序转换,过程同前。这里介绍的编程方法主要是要理解堆栈的使用,堆栈的概念十分有利,在程序中使用的被转换数据和转换后的数据之间的数据传递关系,都是用堆栈来进行的,以上介绍的就是十六进制数转换为ASCII代码, 下面来看将ASCII码转换为十六进制数,应该如何进行呢?)

2.ASCII码转换为十六进制数 ASCII码: 30H~39H (ASCII码-30H)→0~9 41H~46H(ASCII码-37H) →A~F

(如果外部设备传给计算机数据为30H~39H,计算机要处理这个数据之前,应该把它转换为0~9,如果外部设备传给计算机41H~46H数据,计算机要把转换为A~F后才能进行数

据处理。ASCII码转换为十六进制数也有多种转换方式,) 转换算法一:

(被转换的ASCII码范围:30H~39H,41H~46H),

ASCII码-30H≥0AH?(其它数据不能传入!方法比较简单,利用前面的差值式子进行比较就可以得到了,)

C=1,差值为0~9(比较结果有借位)

C=0,差值为(A~F)+7(比较结果无借位) 差值-07H结果为A~F

转换算法二: 被转换的ASCII码范围:00H~7FH 剔除: 00H~2FH 3AH~40H 47H~7FH

(这些数据不属于十六进制数的范围,应予以剔除。这在编程时要加以考虑。下面看一个例子)

例4.6:把外部RAM 30H~3FH单元中的16个ASCII码依次转换为十六进制数,并存入内部RAM 60H~67H的8个单元之中。

(子程序要完成的是一个ASCII码到十六进制数的转换,转换数据的多少,存放在哪里,都是由主程序或上一级程序来完成的。) 子程序功能:

完成ASCII码到十六进制数的转换

入口: R0:指向ASCII转换数据存放单元 出口: A: 转换后的十六进制数在A的低4位中,A的高4位为0 (子程序编制如下:) 子程序(TRAN): TRAN: CLR C MOVX A, @R0 SUBB A, #30H CJNE A, #0AH, BB AJMP BC BB: JC DONE BC: SUBB A, #07H

DONE: RET

(子程序首先对位累加器清零,然后将待转换的ASCII码首个数送给A,判断该数码的范围,转换后的数据放在A中(出口),然后退出,这个子程序完成了一位ASCII码的转换,多个数据的安排由主程序来进行,主程序如下) 主程序(MAIN): MAIN: MOV R0, #30H MOV R1, #60H MOV R7, #08H AB: ACALL TRAN SWAP A MOVX @R1, A INC R0 ACALL TRAN XCHD A, @R1 INC R0 INC R1

DJNZ R7, AB HALT: AJMP HALT

(简单解释一下该主程序的指令,通过修改主程序的数据指针、循环寄存器等,就可以进行不同地址下,不同数据量的ASCII码的转换工作。)

(在这里,我们介绍了一下子程序的编制,需要说明的是,由于应用不同,子程序的编写方法很多,这里我们要求一方面了解单片机子程序的编写,另一方面,我们也可以到一些成熟的子程序库中去调用,这样可以加快我们的研制工作。)

4.5 汇编语言源程序的编辑汇编与调试

以例4.6为例如何在WAVE仿真开发环境下进行源程序的编辑、汇编与调试。

作业:P96

㈠:1、2、㈡:1

搜索更多关于: 第四章 汇编语言程序设计(DOC) 的文档
第四章 汇编语言程序设计(DOC).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c8mg3e72xp51cf865breu5a66i6tmib010wn_3.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top