收藏 分享(赏)

80c51的汇编语言程序设计.ppt

上传人:天天快乐 文档编号:763023 上传时间:2018-04-21 格式:PPT 页数:88 大小:1.95MB
下载 相关 举报
80c51的汇编语言程序设计.ppt_第1页
第1页 / 共88页
80c51的汇编语言程序设计.ppt_第2页
第2页 / 共88页
80c51的汇编语言程序设计.ppt_第3页
第3页 / 共88页
80c51的汇编语言程序设计.ppt_第4页
第4页 / 共88页
80c51的汇编语言程序设计.ppt_第5页
第5页 / 共88页
点击查看更多>>
资源描述

1、2018/4/21,1,第4章 80C51的汇编语言程序设计,程序编制的方法和技巧,4.1,源程序的编辑和汇编,4.2,基本程序结构,4.3,子程序及其调用,4.4,简单I/O设备的并口直接驱动示例,4.5,2018/4/21,2,单片机应用系统由硬件系统和应用程序构成,汇编语言 高级语言,应用程序设计方法,汇编语言,生成的目标程序占内存空间少、运行速度快,具有效率高、实时性强。,高级语言,对系统的功能描述与实现简单,程序阅读、修改和移植方便,适合于编写复杂的程序。,2018/4/21,3,机器语言是计算机能够直接识别和执行的语言,但其指令代码的编写、调试和阅读都相当困难。基于机器语言存在的问

2、题,人类发明了更接近于人类语言特征的指令汇编语言来编写程序。 汇编语言是计算机系统提供给用户的最快、最有效的语言,也是能对硬件直接编程的语言。因此,对空间和时间要求很高的程序,或需要直接控制硬件的程序,一般都使用汇编语言进行程序设计。用汇编语言编写的程序称为汇编语言源程序。,2018/4/21,4,汇编语言的特点:,汇编语言是用助记符来表示机器语言的指令代码的。汇编语言具有如下特点: 助记符指令和机器指令一一对应。用汇编语言编写的程序效率高,占用存储空间小,运行速度快,且能编写出最优化的程序。 汇编语言与计算机硬件设备密切相关。汇编语言程序能直接管理和控制硬件设备,直接访问存储器及接口电路,也

3、能处理中断。 汇编语言编程比高级语言程序的编写和调试要困难。汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。 汇编语言缺乏通用性,程序不易移植。各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用。,2018/4/21,5,4.1 程序编制的方法和技巧,4.1.1 程序编制的步骤,明确任务:功能要求、技术指标 运行环境调研,任务分析,将实际问题转化为计算机处理的程序算法 算法比较与优化(内存需求与运行速度),算法设计,2018/4/21,6,流程描述,流程图符号,“超级循环”框架,分配存储空间和工作单元; 编制程序; 程序静态检查,上机调试。,2018

4、/4/21,7,强化模块观念,使程序占用空间减少、结构清晰循环初值和结束条件,避免“死机”现象子程序的现场保护(注意栈平衡、寄存器内容),程序模块(主程序模块、各种子程序模块)模块化优点:分块设计、便于阅读、调试方便,4.1.2 程序编制的方法和技巧,采用循环和子程序,对中断子程序还有注意保护PSW的内容,2018/4/21,8,4.1.3 汇编语言的语句格式,非数字字符开头,后跟字母、数字、“-”、“?”等不能用已定义的保留字(指令助记符、伪指令等)后跟英文冒号“:”,Keil的汇编器A51可以识别的语句形式为:,标号(即符号地址),标号: 指令助记符 操作数1, 操作数2, 操作数3, ;

5、注释,指令助记符,是指令功能的英文缩写。,LOOP:1BT:TABLE: LST+2:THLS2: BEGINLT-1: MOV:,2018/4/21,9,数据:二进制(B) 十进制(D或省略D) 十六进制(H),注意AF开头时要加“0” ASCII码,如 A,1245符号:符号名、标号或“$”(PC的当前值)表达式:由运算符和数据构成(见下页),操作数,注释,英文分号“;”开头,2018/4/21,10,表4.1,2018/4/21,11,4.2 源程序的编辑和汇编,目标程序的产生过程如下图:,2018/4/21,12,4.2.1 源程序的编辑和汇编,源程序的编辑,依据汇编语言规则用好伪指令

6、符号不用中文SJMP $ 用于调试以 .ASM存盘,ORG 0040HMOV A, #7FHMOV R1, #44HEND,例如:,ORG和END是两条伪指令,作用是告诉汇编程序此汇编源程序的起始位置。,2018/4/21,13,源程序的汇编,汇编源程序转为目标程序的过程叫汇编汇编通常在Windows下的集成开发环境完成用A51.EXE汇编生成.OBJ、.LIB及.LST,目标程序的连接,.OBJ、.LIB经BL51.EXE生成无扩展名的绝对地址目标文件绝对地址目标文件可以用于仿真器调试调试无误的目标文件用OH51.EXE转换为.HEX文件.HEX文件经编程器写入单片机存储器,2018/4/2

7、1,14,伪指令是汇编程序能够识别并对汇编过程进行某种控制的汇编命令。伪指令是指令系统之外的,是程序源发给汇编程序的指令。汇编程序在这些指令的指导下将汇编语言程序汇编,生成机器码。伪指令对程序本身的算法和流图控制没有作用,因此伪指令没有对应的机器语言代码。,4.2.2 伪指令,伪指令,也叫汇编命令。仅对汇编过程进行指示伪指令无对应的单片机可执行代码,2018/4/21,15,起始地址设定伪指令ORG,标号: ORG 地址,ORG 1000HSTART:MOV A,#30H ,ORG可多次使用,但地址值的顺序要由小到大,其中标号是任选项,可以没有。地址项为16位二进制绝对地址。例如:,规定了这个

8、程序的START标号所在的地址为1000H,机器码程序从1000H地址开始存放。,2018/4/21,16,结束汇编伪指令END,该伪指令位于源程序的最后一行。,其功能是终止源程序的汇编工作,在END之后的指令,汇编程序都不予处理。END是汇编语言程序的结束标志,一个程序只能有一个END命令。,命令格式:标号: END 表达式,2018/4/21,17,只有主程序模块才具有表达式项,且表达式的值等于该程序模块的入口地址。其他程序模块没有表达式项。 其中标号也是可选项,当源程序为主程序时,END伪指令可带标号,这个标号应是主程序第一条指令的符号地址。若源程序为子程序,则END伪指令不应带标号。例

9、如: ORG1000HSTART:MOVA,#00H ENDSTART,2018/4/21,18,定义字节数据表伪指令DB,定义字数据表伪指令DW,1000H,标号: DB 字节数据表,如:ORG 1000HDB -2,-4,-6,8,10,18,1001H,标号: DW 字数据表,ORG 1400HDATA1:DW 324AH,3CH ,1400H,1401H,1402H,1403H,2018/4/21,19,定义常值为符号名伪指令EQU,符号名 EQU 常值表达式,LEN EQU 10 SUM EQU 21HBLOCK EQU 22H CLR A MOV R7,LEN MOV R0,BLO

10、CK LOOP:ADD A,R0 INC R0 DJNZ R7,LOOP MOV SUM,A,符号名为:地址常数段名字符串寄存器名位名,比较:标号只能是地址,2018/4/21,20,定义位地址为符号名伪指令BIT,符号名 BIT 位地址表达式,如:ST BIT P1.0 ;将P1.0的位地址赋给符号名STCF BIT 0D7H ;将位地址为D7H的位定义为符号名,用BIT定义的“符号名”一经定义便不能重新定义和改变,2018/4/21,21,4.3 基本程序结构4.3.1 顺序程序设计,顺序程序指无分支、无循环结构的程序。执行没有流程转移,全部按照程序语句的先后次序执行。顺序程序是最基本的程

11、序结构之一,也是最简单的结构。,2018/4/21,22,1、数据传送,例4.1 内部RAM的2AH2EH单元中存储的数据如a图所示,编写程序实现b图所示的数据传送结果。,(a),(b),ACC,2EH,2DH,2CH,2BH,2AH,2AH,ACC,2EH,2DH,2CH,2BH,2018/4/21,23,方法一:MOV A,2EH ;2字节,1个机器周期MOV 2EH,2DH ;3字节,2个机器周期MOV 2DH,2CH ;3字节,2个机器周期MOV 2CH,2BH ;3字节,2个机器周期MOV 2BH,#00H ;3字节,2个机器周期共14个字节,9个机器周期。,方法二:CLR A ;1

12、字节,1个机器周期XCH A,2BH ;2字节,1个机器周期XCH A,2CH ;2字节,1个机器周期XCH A,2DH ;2字节,1个机器周期XCH A,2EH ;2字节,1个机器周期共9个字节,5个机器周期。,实际应用中,应尽量采用指令代码字节数少、执行时间短的高效率程序,即注意程序的优化。,(a),ACC,2EH,2DH,2CH,2BH,2AH,(b),2AH,ACC,2EH,2DH,2CH,2BH,2018/4/21,24,2、查表程序,例4.2 有一变量存放在片内RAM的20H单元,其取值范围为00H05H.要求编程,根据变量值求其平方值,并存入片内RAM的21H单元。 ORG 10

13、00HSTART: MOV DPTR,#2000H MOV A,20H MOVC A,A+DPTR MOV 21H,A ORG 2000HTABLE: DB 00,01,04,09,16,25 END,2018/4/21,25,3、简单运算,由于80C51指令系统中只有单字节加法指令,因此对于多字节的相加运算必须从低位字节开始分字节进行。除最低字节相加时可以使用ADD指令外,其他字节相加时要把低字节的进位考虑进去,这时应该使用ADDC(减法用SUBB)指令。,例4.3 两个三字节无符号数相减,设被减数放在片内RAM30H开始的单元中,减数放在40H开始的单元中,低字节在低地址单元中,高字节在高

14、地址单元中,求两数之差并存入40H开始的单元中,借位存放在位寻址区的00H位中。,2018/4/21,26,MOVR0,#30H;被加数的低字节地址MOVR1,#40H;加数的低字节地址CLRCMOVA,R0SUBBA,R1;低字节相减MOVR1,A;存低字节相减结果 INCR0INCR1MOVA,R0SUBB A,R1 ;中间字节带进位相减MOVR1,A ;存中间字节相减结果INCR0INCR1MOVA,R0SUBB A,R1 ;高字节带进位相减MOVR1,A ;存高字节相减结果MOV 00H,C ;借位送00H保存,2018/4/21,27,4.3.2 分支程序设计,程序的分支是通过条件转

15、移指令实现的。根据条件对程序中的状态进行判断,满足条件则进行程序转移,否则按顺序执行。在MCS-51指令系统中,有多种条件转移指令,包括JZ、JNZ、CJNE、DJNZ以及位状态条件转移指令JC、JNC、JB、JNB、JBC等,使用这些指令,可以完成各种条件下的程序分支转移。 分支程序可分为单分支、双分支和多分支程序。,单分支,双分支,多分支,2018/4/21,28,单分支程序 单分支程序是只使用一次条件转移指令的分支程序。,例4.4 设一个单字节二进制数存于A中,求其补码,结果仍存在于A中。START: JNB ACC.7,OK ;(A)=0,无需转换 MOV C,ACC.7 ; CPL

16、A ;取反 ADD A,#1 MOV ACC.7,C ;OK: RET,2018/4/21,29,2. 双分支程序,例4.5 已知X、Y均为8位二进制数,分别存在R0、R1中,试编制能实现下列功能。 +1,当X0Y= 0 ,当X=0 1,当X0,程序如下:,2018/4/21,30,ORG 1000H MOV A,R0 CJNE A,#00H,MP1;若(R0)0跳转 MOV R1,#00H ;若(R0)=0,则0R1AJMP HERE ;MP1: JB ACC.7 MP2 ;最高位为1,表明(R0)0,跳转MOV R1,#01H;否则1R1LJMP HEREMP2: MOV R1,#0FFH

17、;(R0)0,则-1R1,-1的补码为FFHHERE:SJMPHERE,2018/4/21,31,3. 多分支程序 在多分支程序中,因为可能的分支会有N个,若采用多条CJNE指令逐次比较,程序的执行效率会降低很多,特别是分支较多时。这时,一般采用跳转表的方法,通过两次转移来实现。,例4.6 设内部RAM的30H单元有一个数,根据该数值的不同转移到不同的程序段进行处理,设数值的范围为010的无符号数。,2018/4/21,32,程序如下:MOVA,30H;取数RLA;乘以2以适应跳转表 MOVDPTR,#JMPTAB;跳转表的首地址JMPA+DPTR;转向跳转表JMPTAB:AJMPPROC00

18、;转分支0AJMPPROC01;转分支1AJMPPROC10;转分支10PROC00: PROC10:,2018/4/21,33,使用跳转表最多可实现128路分支。由于AJMP指令的转移范围是2KB,因此分支处理程序的位置受到限制。若把跳转表中的AJMP指令改为LJMP指令,则分支程序可分布在整个64KB范围内,但要对分支数值进行乘3处理(LJMP是一个三字节指令,而AJMP是双字节指令)。相应程序如下: MOVA,30H;取数RLA ;乘2ADDA,30H;再加一次,实现乘3MOVDPTR,#JMPTAB;跳转表的首地址JMPA+DPTR;转向跳转表JMPTAB:LJMPPROC00 ;转分

19、支0LJMPPROC01;转分支1 LJMPPROC10;转分支10,2018/4/21,34,上面的例子还可采用查表法来实现。与跳转表不同,这个表的内容不是跳转指令,而是地址的偏移量,即各分支处理程序的入口地址与表的基地址的差值,因此也称为差值表。其程序如下:MOVA,30H;取数MOVDPTR,#BRTAB;差值表的首地址MOVCA,A+DPTR;查表JMPA+DPTR ;转向跳转表BRTAB:DBBR0-BRTAB;差值表DBBR1-BRTABDBBR10-BRTABBR0: BR10:,2018/4/21,35,【例】根据R7的内容x(转移序号)转向相应的处理程序。设R7内容为04,对

20、应的处理程序入口地址分别为PP0PP4。,2018/4/21,36,START:MOV R7,#3 ;以转移序号3为例 ACALL JPNUM AJMP START JPNUM:MOV DPTR,#TAB ;置分支入口地址表首址 MOV A,R7 ADD A,R7 ;乘2,调整偏移量 MOV R3,A MOVC A,A+DPTR ;取地址高字节,暂存于R3 XCH A,R3 INC A MOVC A,A+DPTR ;取地址低字节 MOV DPL,A ;处理程序入口地址低8位送DPL MOV DPH,R3 ;处理程序入口地址高8位送DPH CLR A JMP A+DPTR,2018/4/21,3

21、7,TAB:DW PP0 DW PP1 DW PP2 DW PP3 DW PP4 PP0:MOV 30H,#0 ;转移序号为0时,置功能号“0”于30H单元 RET PP1:MOV 30H,#1 ;转移序号为1时,置功能号“1”于30H单元 RET PP2:MOV 30H,#2 ;转移序号为2时,置功能号“2”于30H单元 RET PP3:MOV 30H,#3 ;转移序号为3时,置功能号“3”于30H单元 RET PP4:MOV 30H,#4 ;转移序号为4时,置功能号“4”于30H单元 RET,2018/4/21,38,4.3.3 循环程序设计,按某种控制规律重复执行的程序称为循环程序。循环

22、是为了重复执行一个程序段。与高级语言不同,汇编语言中没有专用的循环指令,但可以使用条件转移指令通过判断来控制循环是继续还是结束。 通常循环结构的程序包含四个组成部分: 循环准备:设置循环次数、起始地址及结果初值等参数。 循环体:循环程序的主体,是要求重复执行的部分。 循环修改:修改循环次数及有关变量参数等。 循环控制部分:根据循环结束条件来判断是否结束循环。,2018/4/21,39,循环程序分为:先执行后判断和先判断后执行两种基本机构。,先执行后判断,先判断后执行,2018/4/21,40,【例】将内部RAM的30H至3FH单元初始化为00H。,MAIN:MOV R0,#30H ;置初值 M

23、OV A,#00H ; MOV R7,#16 ; LOOP:MOV R0,A ;循环处理 INC R0 ; DJNZ R7,LOOP ;循环修改,判结束 SJMP $ ;结束处理,2018/4/21,41,【例】将内部RAM起始地址为60H的数据串传送到外部RAM中起始地址为1000H的存储区域,直到发现$ 字符停止传送。,MAIN:MOV R0,#60H ;置初值 MOV DPTR,#1000HLOOP0:MOV A,R0 ;取数据 CJNE A,#24H,LOOP1 ;循环结束? SJMP DONE ;是LOOP1:MOVX DPTR,A ;循环处理 INC R0 ;循环修改 INC DP

24、TR SJMP LOOP0 ;继续循环 DONE:SJMP DONE ;结束处理,2018/4/21,42,例 将内部RAM的30H地址开始的80个数据,传送到外部RAM的2000H单元开始的区域。ORG 2000HSTART:MOVR0,#30H ;源数据区首地址 MOVDPTR,#2000H ;目的数据区首地址 MOVR7,#80;循环次数LOOP: MOVA,R0;取数据 MOVXDPTR,A;数据传送 INCR0;源地址加1 INCDPTR ;目的地址加1 DJNZR7,LOOP;循环控制 SJMP $;结束,2018/4/21,43,例 外部RAM之间的数据传送程序。 把外部RAM

25、2000H开始单元中的数据传送到外部RAM 3000H开始的单元中,数据个数在内部RAM的35H单元中。 ORG1000HSTART:MOVDPTR,#2000H;源数据区首地址PUSHDPL;源首址暂存堆栈PUSHDPHMOVDPTR,#3000H;目的数据区首地址MOVR2,DPL;目的首址暂存寄存器MOVR3,DPH,2018/4/21,44,LOOP:POPDPH;取回源地址POPDPLMOVXA,DPTR;取出数据INC DPTR;源地址加1PUSHDPL;源地址暂存堆栈PUSHDPHMOVDPL,R2;取回目的地址MOVDPH,R3MOVXDPTR,A INC DPTR ;目的地址

26、加1MOVR2,DPL;目的地址暂存寄存器MOVR3,DPHDJNZ35H,LOOP ;没完,继续循环SJMP$,2018/4/21,45,此例中,由于访问外部RAM只有一对以DPTR寄存器作为间址方式的指令,完成累加器与外部RAM之间的数据传送,源地址指针和目的地址指针都必须使用DPTR,所以程序中将源地址和目的地址分别保护,分时占用DPTR来传送数据。,例 已知在内部RAM中,有一长度不超过32B的字符串,首地址为data,该字符串以回车符“CR”作为结束标志。要求统计此字符串的长度并将其结果存入内部RAM 的length单元中。程序流程框图如图4.3所示。,2018/4/21,46,因回

27、车符“CR”的ASCII值为0DH,假设data为20H,length为1FH,则程序如下:CREQU0DHdataEQU20HlengthEQU 1FHORG1000HMOVR0,#data-1;字符串首地址减1MOVR7,#0FFH;长度初值为-1CRLOP:INCR0;字符串地址加1INCR7;长度加1 MOVA,R0;取字符 CJNE A,#CR,CRLOP ;与“CR”比较相等时结束MOVlength,R7;存字符长度SJMP$,2018/4/21,47,4.3.4 子程序设计,子程序结构是汇编语言中一种重要的程序结构。在一个程序中经常会碰到反复执行某程序段的情况,如果重新书写这个程

28、序段,会使程序变得冗长而杂乱。对此,可以采用子程序结构,即把重复的程序段编写为一个子程序,通过主程序调用它。这样不但可以提高编制和调试程序的效率,而且可以缩短程序长度,从而节省程序存储空间,但并不节省程序运行的时间。 调用子程序的程序称为主程序,主程序和子程序之间的调用关系如图4.4所示。,2018/4/21,48,在MCS-51中,完成子程序调用的指令为ACALL和LCALL,完成子程序返回的指令为RET。 在子程序调用时需要注意的两个问题:1. 参数传递 在子程序结构中,参数的传递要靠程序设计者自己安排数据的存放和选择工作单元。子程序参数的传递一般可采用下面的方法。(1)传递数据 将数据通

29、过工作寄存器R0R7或者累加器A来传送。其具体过程是:在调用子程序前把数据送入寄存器中,子程序就对这些寄存器中的数据进行操作,子程序执行后,结果仍由寄存器送回。,2018/4/21,49,(2)传递地址 数据存放在数据存储器中,参数传递时只通过R0、R1、DPTR传递数据所存放的地址。调用结束时,结果就存放在数据存储器中,传送返回的也是寄存器中的地址。(3) 通过堆栈传递参数 在调用前,先把要传送的参数压入堆栈,进入子程序后,再将堆栈中的参数弹出到工作寄存器或其他内部RAM单元。在弹出参数时,应注意栈顶的两个字节数据是断点地址,不应误认为传递的参数。在子程序返回之前,应保证该两个字节数据仍处在

30、栈顶位置,以便正确返回主程序。,2018/4/21,50,2. 现场保护 进入子程序后,应注意除了要处理的参数数据和要传递回主程序的参数之外,有关的内部RAM单元和工作寄存器的内容,以及各标志的状态都不应因调用子程序而改变,这就存在现场保护问题。 现场保护的方法是:在调用子程序前或一进入子程序,就将子程序中所使用的或会被改变内容的工作单元的内容压入堆栈;在子程序完成处理,将要返回前或一返回主程序后,就把堆栈中的数据弹出到原来的工作单元,恢复原来状态。对于所使用的工作寄存器的保护可用改变工作寄存器组的方法。,2018/4/21,51,现场保护与恢复,在主程序中实现(结构灵活),PUSH PSW

31、;保护现场( 含当前工作寄存器组号)PUSH ACC ;PUSH B ;MOV PSW,#10H ;切换当前工作寄存器组LCALL addr16 ;子程序调用, POP B ;恢复现场POP ACC ;POP PSW ;含当前工作寄存器组切换,注意入栈和出栈的顺序要对应。,2018/4/21,52,在子程序中实现(程序规范、清晰),SUB1:PUSH PSW ;保护现场( 含当前工作寄存器组号) PUSH ACC ; PUSH B ; MOV PSW,#10H ;切换当前工作寄存器组 POP B ;恢复现场 POP ACC ; POP PSW ;内含当前工作寄存器组切换 RET,2018/4/

32、21,53,参数传递,利用累加器或寄存器(简单、快速,但参数个数不多),【例】实现两个8位的十六进制无符号数求和的子程序。,SADD:MOV A,R3 ;取加数(在R3中) CLR C ADD A,R4 ;被加数(在R4中)加A JC PP1 ;判CY的值 MOV R3,#00H ;结果小于255时,高字节R3内容为00H SJMP PP2 PP1:MOV R3,#01H ;结果大于255时,高字节R3内容为01H PP2:MOV R4,A ;结果的低字节在R4中 RET,入口:(R3)=加数; (R4)=被加数。,出口:(R3)=和的高字节; (R4)=和的低字节。,2018/4/21,54

33、,利用存储器(个数多,用R0或R1及DPTR为参数表指针),【例】将内部RAM 中R0,R1指向的两个3字节无符号整数相加,和的高字字节由R0指向。数据采用大端模式存储。,入口:(R0)=加数低字节地址; (R1)=被加数低字节地址。,出口:(R0)=和的高字节起始地址。,NADD:MOV R7,#3 ;字节数4送计数器 CLR C ;NADD1:MOV A,R0 ;利用指针,取加数低字节 ADDC A,R1 ;利用指针,被加数低字节加A MOV R0,A ; DEC R0 DEC R1 DJNZ R7,NADD1 INC R0 ;调整指针,指向出口 RET,2018/4/21,55,利用堆栈

34、,【例】 将内部RAM中20H单元中的1个字节十六进制数转换为2位ASCII码,存放在R0指示的两个单元中。,入口:预转换数据(低半字节)在栈顶,出口:转换结果(ASCII码)在栈顶,HEASC:MOV R1,SP ;借用R1为堆栈指针 DEC R1 DEC R1 ;R1指向被转换数据 XCH A,R1 ;取被转换数据 ANL A,#0FH ;取一位十六进制数 ADD A,#2 ;偏移调整,所加值为MOVC与DB间总字节数 MOVC A,A+PC ;查表 XCH A,R1 ;1字节指令,存结果于堆栈中 RET ;1字节指令ASCTAB:DB 30H,31H,32H,33H,34H,35H,36

35、H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H,2018/4/21,56,主程序段,MAIN:MOV A,20H ; SWAP A PUSH ACC ;预转换的数据(在低半字节)入栈 ACALL HEASC POP ACC ;弹出栈顶结果于ACC中 MOV R0,A ;存转换结果高字节 INC R0 ;修改指针 PUSH 20H ;预转换的数据(在低半字节)入栈 ACALL HEASC POP ACC ;弹出栈顶结果于ACC中 MOV R0,A ;存转换结果低字节 SJMP $,2018/4/21,57,4.4 综合编程举例 在MCS-51单片机指令系统中,设

36、有单字节无符号数的加减指令:ADD、ADDC和SUBB。而在实际应用系统,时常需要进行多字节的算术运算。以下我们介绍多字节无符号数的加减法程序设计。,2018/4/21,58,1.多字节无符号数的加减法运算,例4.13 编写四字节无符号数加法子程序,设被加数存放在内部RAM的33H、32H、31H、30H单元,加数放在43H、42H、41H、40H单元,结果将和存放在33H、32H、31H、30H单元中,最高位进位存放在34H单元中。数据高位存高地址。解题分析:根据题意要求列出算式如下: (33H)(32H)(31H)(30H)+ (43H)(42H)(41H)(40H),(34H)(33H)

37、(32H)(31H)(30H),只要将各对应字节逐一相加即可。,2018/4/21,59,用循环结构程序解上述问题。,DADD:MOVR0,#30H;被加数低位地址MOVR1,#40H;加数低位地址MOVR7,#04H;加法次数CLRCLOOP:MOVA,R0ADDCA,R1 MOVR0,AINCR0INCR1DJNZR7,LOOP,2018/4/21,60,CLRAADDCA,#00H;A0+(CY)+0MOVR0,ARET DADD子程序完成2个四字节无符号数加法程序设计。首先,最低位的相加,只要使用不含进位的加法指令ADD即可,为避免入口时CY位状态对本程序的影响,在进行最低位加法运算前

38、要先清CY 位;其次,最高位进位通过“ADDCA,#00H”指令获得,在ADDC指令执行前,先使A的内容为0,从而获得CY 位的值。,2018/4/21,61,例4.14 编写N字节无符号数减法子程序。设被减数存放在内部RAM 30H单元开始的连续地址,减数放在以40H单元开始的连续地址,结果将差存放在30H单元开始的连续地址,借位存放在00H位地址中。数据高位存地址。,该题与上一题非常类似,除运算类型不同外,主要差别还表现在借位不是存放在一个字节单元内,而是一个位地址。DSUB:MOVR0,#30H;被减数低位地址MOVR1,#40H;减数低位地址MOVR7,#N;减法次数CLRCLOOP:

39、MOVA,R0SUBBA,R1,2018/4/21,62,MOVR0,AINCR0INCR1DJNZR7,LOOPMOV00H,C;借位存放RET,2018/4/21,63,2. 多字节的乘法运算,MCS-51内部设有单字节的乘法指令(MLU AB),对于单字节的乘法运算,只要通过一条指令即可完成,而对于多字节数的乘法,必须通过程序实现。,例4.15 编两个双字节无符号数的乘法运算程序,被乘数和乘数分别存放于内部RAM的R2、R3单元和R6、R7单元(其中R2、R6为高位字节),将积存放于R4、R5、R6、R7单元中。根据题意可知:R4R5R6R7=R2R3R6R7由于乘数和被乘数都是双字节数

40、,所以必须进行4次乘法运算,得到4个部分积,假定部分积的高字节以“H”表示,部分积的低字节以“L”表示,双字节无符号数的乘法运算过程如图4.6所示。,2018/4/21,64,2018/4/21,65,乘法程序如下:DBMUL:MOVA,R3MOVB,R7MULAB;(R3)(R7)(得第一次部分积)XCHA,R7;R7(R3R7L),A(R7)MOVR5,B;R5(R3R7H)MOVB,R2 MULAB;(R2)(R7)(得第二次部分积)ADDA,R5MOVR4,A;R4(R2R7L)+(R3R7H)CLRA ADDCA,BMOVR5,A;R5(R2R7H) +(R2R7L;+R3R7H时产生的进位),2018/4/21,66,MOVA,R6MOVB,R3MULABADDA,R4XCHA,R6;R6(R3R6L),A(R6)XCHA,B ;B(R6),A(R3R6H)ADDCA,R5 MOVR5,A ;R5(R3R6H) +(R3R6L+ R4时产生的进位)MOVF0,CMOVA,R2MULABADDA,R5,2018/4/21,67,MOVR5,A;R5(R2R6L)+(R5)CLRAMOVACC.0,CMOVC,F0ADDCA,BMOVR4,A;R4(R2R6H)+(F0)+;(R2R6L+R5时产生的进位)RET,

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

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报