




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1汇编程序设计二14.2.4 查表程序 对一些复杂的函数运算如sinx等,事先把其全部可能范围的函数值按一定的规律编成表格存放在计算机的程序存储器中。当用户程序中需要用到这些函数时,直接按编排好的索引值(或程序号)寻找答案。在控制应用场合或智能仪器仪表中,经常使用查表法。这种方法的不足是要占用较多的存储单元。两条极为有用的查表指令: MOVC A,A+DPTR MOVC A,A+PC2例4.11 根据累加器A中的数x(09之间)查x的平方表,根据x的值查出相应的平方放回A中。 ORG 0100HSQR1: MOV DPTR ,#TABLE MOVC A,A+DPTR RETTABLE DB 0
2、0H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H ORG 0100H0100H SQR2: INC A0101H MOVC A,A+PC0102H RET0103H TABLE DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H第1条指令 INC A的作用是加上偏移量,可以根据A的内容查出X对应的平方。34.2.5 子程序设计一个程序中有许多相同的运算或操作时,常把这些多次使用的程序段,按一定结构编好,存放在内存中,当需要时,程序可以去调用这些独立的程序段。在编写子程序时应注意以下问题:1子程序的第一条指令的地址称为子程
3、序的入口地址。该指令前必须有标号。2注意设置堆栈指针和现场保护。3. 在子程序调用时,注意参数传递的问题.4子程序在结构上应具有独立性和通用性,操作采用地址和寄存器的形式。5子程序可以嵌套,即子程序可以调用子程序41.利用工作寄存器或累加器传送参数 把入口参数存放到工作寄存器(Rn)或累加器中传送给子程序,出口参数存放到工作寄存器(Rn)或累加器中传送给主程序。2.利用寄存器传送参数的地址 把存放入口参数的地址通过寄存器传送给子程序,子程序根据寄存器中存放入口参数的地址找到入口参数并对它们进行相应操作;出口参数的地址也可通过寄存器传送给主程序。3.利用堆栈传送参数 用压栈指令PUSH把入口参数
4、压入堆栈传送给子程序,使用压栈指令PUSH把出口参数压入堆栈传送给主程序。 传送子程序参数的方法5子程序的基本结构 MAIN ;MAIN为主程序或调用程序标号 LCALL SUB ;调用子程序SUB SUB: PUSH PSW;现场保护 PUSH ACC; 子程序处理程序段POP ACC;现场恢复POP PSW; RET;最后一条指令必须为RET 6利用工作寄存器或累加器传送参数例 用程序实现 y x12x22。子程序名: SQR1 ORG 0000H x1 EQU 30H x2 EQU 40H Y EQU 50HSTART: MOV A,X1 ACALL SQR1 MOV R1,A ;X12
5、值暂存R1 MOV A,X2 ;X2取值 ACALL SQR1 ; ADD A,R1 ;求X12X22 MOV Y,A ;存入7 子程序 (例4.11) ORG 0100H0100 SQR1:INC A0101 MOVC A,APC0102 RET 0103 TABLE: DB 0,1, 4, 9,16 0108 DB 25,36,49,64,818用指针寄存器传递参数例:将片内RAM中30H单元开始的10个数据取反后送到片内RAM40H开始的单元中主程序: ORG 0100H MOV R2, #0AH MOV R0, #30H MOV R1, #40H ACALL TRAN子程序 ORG 0
6、200HTRAN: PUSH ACCTRAN1: MOV A, R0 CPL A MOV R1, A INC R0 INC R1 DJNZ R2, TRAN1 MOV A, R1 CLR C SUBB A, #0AH XCH A, R1 POP ACC RET9利用堆栈传送参数例4.14 将R1中的低半字节一个十六进制的数转换为ASCII码,再放回R1。 子程序名:H-ASC主程序 ORG 0000H AJMP STARSTAR: MOV SP ,#50H MOV A, R1 PUSH ACC LCALL H-ASC POP ACC MOV R1 ,A子程序: ORG 0E0HH_ASC MO
7、V R1 ,SP DEC R1 DEC R1 XCH A, R1 ANL A,0FH 保留低4位 MOV DPTR,TAB ; MOVC A,ADPTR;查表 XCH A, R1 RETTAB DB 30H,31H,32H,33H, 34H, 35H ,36H, 37H,38H,39H DB 41H,42H,43H, 44H,45H,46H104.3 MCS-51汇编语言实用程序举例 4.3.1 运算类程序 4.3.2 数值转换类程序结束返回114.3.1运算类程序例4.21:多字节无符号数乘法。相乘原理如例4.19。入口:R1(被乘数低位字节地址指针); R0(乘数低位字节地址指针); R2
8、(被乘数字节数); R3(乘数字节数)。出口:R4(积的低位字节地址指针); R5(积的字节数)。 结束返回124.3.1运算类程序程序清单如下: DOMUL:MOVA,R1;复制被乘数地址指针 MOVR6,A MOVA,R0;复制乘数地址指针 MOVR5,A MOVA,R2;计算清零需要的循环次数 ADDA,R3 MOV26H,A MOVR7,A MOVA,R4;复制积首地址到R0 MOVR0,A CLEAR: MOVR0,#00H;积单元清0 结束返回134.3.1运算类程序 INCR0 DJNZR7,CLEARMOVA,R4;保存积的低位地址 MOVR7,A MOV27H,R7 MOV2
9、0H,R2;保存被乘数字节数 LP0:MOVA,R5;恢复乘数首地址 MOVR0,A MOVA,R0 MOVB,R1 MULAB ACALLADDM;调用部分积相加程序 INCR1 ;被乘数地址加一结束返回144.3.1运算类程序 DJNZR2,LP0 MOVR2,20H;恢复被乘数字节数 MOVA,R6 MOVR1,A MOVA,R7;下次部分和累加开始地址 INCA MOVR7,A MOVR4,A;子程序会用到下次累加地址 INCR5;乘数首地址加1 DJNZR3,LP0 MOVR4,27H;恢复地址指针 结束返回154.3.1运算类程序 MOVR5,26H RET ADDM: MOV21
10、H,A;加部分积 MOVA,R4 MOVR0,A MOVA,21H;加乘积低8位 ADDA,R0 MOVR0,A MOVA,B;加乘积高8位 INCR0 ADDCA,R0 结束返回164.3.1运算类程序 MOVR0,A INCR0;加进位 MOVA,R0 ADDCA,#00H MOVR0,A DEC R0 MOVA,R0 MOVR4,A RET结束返回174.3.1运算类程序例4.23:BCD码多字节加法。编程说明:为了将计算机所能识别的二进制数转换成人们习惯使用的十进制数,可利用十进制调整指令,使多字节加法转换成多字节BCD码加法。入口:(R0)=被加数低位字节地址指针; (R1)=加数低
11、位字节地址指针; R3=字节数。出口:(R0)=和值低位字节地址指针; R3=和值字节数。程序清单如下: BCDADD: MOV20H,R0 MOV23H,R3 CLR C 结束返回184.3.2运算类程序 LP0: MOVA,R0;取被加数 ADDCA,R1;两数相加 DAA;十进制调整 MOVR0,A INCR0;指针加1 INCR1 DJNZR3,LP0;作完加法否 MOVR3,#23H JNCRETURN;有无进位 MOVR0,#01H INCR3 RETURN:MOVR0,#20H RET结束返回194.3.1运算类程序例4.29:求最大值(单字节无符号数)。入口:R0(数据区首址指
12、针);R2(字节数)。出口:R0(最大值存于首址指针所指单元)。程序清单如下: MAX: MOVA,R0;存首址指针 MOVR1,A DECR2 MOV A,R1 LP0: MOV R3,A DECR1 返回结束204.3.1运算类程序 CLRC SUBB A,R1;比较 JNCLP1 MOV A,R1;换最大值 SJMPLP2 LP1:MOVA,R3 LP2:DJNZR2,LP0 MOVR0,A;存最大值 RET返回结束214.3.1运算类程序例4.30:将内存中的单字节无符号数按从小到大的顺序排列入口:R0(数据区首地址指针);R2(字节数)。出口:00H位作为发生交换的标志,当无交换时,
13、排序结束。程序清单ROLE:MOVA,R0 MOVR1,A MOVA,R2 MOVR5,A CLR00H DECR5 MOV A,R1 LP0:MOVR3,A INCR1 CLRC;比较返回结束224.3.1运算类程序 MOV A,R1 SUBBA,R3 JNC LP1 SETB00H;有交换 MOVA,R3 XCH A,R1 DEC R1 XCH A,R1 INC R1 LP1: MOV A,R1 DJNZ R5,LP0 JB 00H,ROLE RET返回结束234.3.2 数值转换类程序我们日常习惯使用十进制数,而计算机能识别和处理的是二进制数,计算机的输入/输出数据又常用BCD码、ASC
14、II码和其它代码,因此,代码转换十分有用。例4.14:双字节二进制数转换为BCD数。编程说明:因为(a15a14a1a0)(02a15)2a14)2a0,所以,将二进制数从最高位逐次左移入BCD码寄存器的最低位,并且,每次都实现()2ai的运算。共循环16次,由R7控制。入口:R3 R2 (16位无符号二进制整数)。出口:R6 (万位)、R5 (干位、百位)、R4 (十位、个位)存放5位BCD码。 结束返回24程序清单如下:BCBCD:CLRA;BCD码寄存器清零 MOVR4,A MOVR5,A MOVR6,A MOVR7,#10H ;设循环指针 LP0: CLRC ;左移一位,移入C MOV
15、A,R2 RLCA MOVR2,A MOVA,R3 RLCA 结束返回25 MOV R3,A MOV A, R4 ADDCA,R4;实现()2ai DA A MOV R4, A MOV A,R5 ADDCA,R5 DA A MOV R5,A MOV A,R6 ADDCA,R6 DA A MOV R6,A DJNZ R7,LP0 RET结束返回26例4.15: BCD数转换成二进制数(双字节整数)。入口:R5 (千位,百位)、R4 (十位,个位)为BCD码。出口:R5 R4 (16位无符号二进制整数)。程序清单如下:MOVA,R5 MOVR2,A;给子程序入口参数 ACALLBCD2BIN1;调
16、用子程序BCD2BIN: MOVB,#64H结束返回274.3.1数值转换类程序 MULAB MOVR6,A XCHA,B MOVR5,A MOVA,R4 MOVR2,A;给子程序入口参数 ACALLBCD2BINl;调用子程序 ADDA,R6 MOVR4,A MOVA,R5 ADDCA,#00H MOVR5,A RET结束返回28子程序如下:;子程序入口R2 BCD2BIN1:MOVA,R2 ANLA,#0F0H;取高位BCD码,屏蔽低4位 SWAP A MOVB,#0AH MULAB MOVR3,A MOVA,R2 ANLA,#0FH ADDA,R3;加低位BCD码 MOVR2,A RET
17、结束返回294.3.1代码转换类程序例4.17:ASCII码转换为4位二进制数,本程序完成的是上例的逆过程。入口:(R2)ASCII码。出口:(R2)转换后的二进制数。程序清单如下: ASC2BIN:MOV A,R2 CLR C SUBBA,#30H;ASCII码减去30H MOVR2,A;得二进制数R2 SUBBA,#0AH JCLOOP MOVA,R2 SUBBA,#07H MOVR2,A LOOP:RET结束返回30作业P94-1 将片内30H39H单元中的内容送到以3000H为首的存储区内。3000H一定是外部数据存储区 OGR 0000H MAIN1: MOV A, R1 M1 EQU 3000H MOVX DPTR, A M2 EQU 30H INC DPTR AJMP MAIN INC R1 ORG 1000H DJNZ R2, MAIN1MAIN: MOV R2, #10 END MOV DPTR, #M1 MOV R1,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 叉车运输安全合同范本
- 《给年轻班主任的建议》和《班主任兵法》读后感
- 《昨天、今天、明天》中班教案
- 产品拍摄购销合同范本
- 《奋斗有我一起向未来》个人感悟
- 反聘用合同范本
- 医师待遇合同范本
- 医院买卖居间合同范本
- 受托支付装修合同范本
- 农田机井买卖合同范本
- 焊工培训-焊接基础知识-课件
- 社会学概论全套PPT完整教学课件
- 船体结构与制图
- 安全风险分级管控和隐患排查治理双重预防体系20230531
- 建筑工程质量通病防治措施
- 主题意义引领下的小学英语单元整体教学探究 论文
- 不锈钢管道及板件焊接工艺卡
- 部编人教版四年级下册语文 5琥珀 教案(教学设计)
- 工程项目客户评价表
- 增额终身寿险企业主类客户沟通逻辑
- GB/T 7631.4-1989润滑剂和有关产品(L类)的分类第4部分:F组(主轴、轴承和有关离合器)
评论
0/150
提交评论