汇编程序设计2_第1页
汇编程序设计2_第2页
汇编程序设计2_第3页
汇编程序设计2_第4页
汇编程序设计2_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第第3 3章章 程序设计的基本技术程序设计的基本技术 (二)(二)23.3 循环程序设计 v3.3.1 循环程序设计方法 v3.3.2 循环程序设计实例 33.3.1 循环程序设计方法 v循环程序的结构一般包括以下几部分。循环程序的结构一般包括以下几部分。l循环初始化循环初始化是进入循环处理前必须要有的一个环节,是进入循环处理前必须要有的一个环节,用于完成循环前的准备工作。循环初始化包括给工作寄存用于完成循环前的准备工作。循环初始化包括给工作寄存器器(或其他存储单元或其他存储单元)设置计数初值、地址指针、数据块长度设置计数初值、地址指针、数据块长度等。等。l循环处理循环处理是需要多次重复执行

2、的程序段。循环处理是是需要多次重复执行的程序段。循环处理是循环程序的核心,用于完成主要的计算和操作任务。循环程序的核心,用于完成主要的计算和操作任务。 l循环控制循环控制是用条件转移指令控制循环是否继续。每循是用条件转移指令控制循环是否继续。每循环一次,根据循环结束条件进行一次判断;当满足条件时,环一次,根据循环结束条件进行一次判断;当满足条件时,停止循环,继续执行其他程序;否则,再作循环。停止循环,继续执行其他程序;否则,再作循环。l循环结束循环结束用于存放循环程序的执行结果,同时恢复相用于存放循环程序的执行结果,同时恢复相关工作单元的初值。关工作单元的初值。 43.3.1 循环程序设计方法

3、 v循环程序一般有两种编写方法。循环程序一般有两种编写方法。l先循环处理后循环控制先循环处理后循环控制(即先处理后判断即先处理后判断),其流程如下图所,其流程如下图所示。示。l先循环控制后循环处理先循环控制后循环处理(即先判断后处理即先判断后处理),其流程如下图所,其流程如下图所示。示。v循环处理和循环控制构成循环体,若循环程序的循环体内循环处理和循环控制构成循环体,若循环程序的循环体内不再包含其他循环程序,则称为不再包含其他循环程序,则称为单重循环单重循环程序。若循环程程序。若循环程序的循环体内包含有其他循环程序,则称为序的循环体内包含有其他循环程序,则称为多重循环多重循环程序,程序,又称为

4、又称为循环嵌套循环嵌套。v多重循环程序中的各重循环不能有交叉,不能从外循环跳多重循环程序中的各重循环不能有交叉,不能从外循环跳入内循环,只能外循环内嵌套内循环。两重循环程序流程入内循环,只能外循环内嵌套内循环。两重循环程序流程如下图所示。如下图所示。 5 先判断后处理 先处理后判断 两重循环循环程序流程图 循环程序流程图 程序流程图 63.3.1 循环程序设计方法 v循环程序的特点和设计方法。循环程序的特点和设计方法。l程序结构紧凑,占用存储单元较少,程序中间有分支,循程序结构紧凑,占用存储单元较少,程序中间有分支,循环程序本质上是分支程序的一种特殊形式。环程序本质上是分支程序的一种特殊形式。

5、lDJNZ指令使用得较多,凡是分支程序中可以使用的控制转指令使用得较多,凡是分支程序中可以使用的控制转移类指令,循环程序一般都可以使用。移类指令,循环程序一般都可以使用。l循环控制的形式有多种。计数循环是最常用的一种,它先循环控制的形式有多种。计数循环是最常用的一种,它先预置计数初值,再用预置计数初值,再用 DJNZ指令控制循环次数;条件循环指令控制循环次数;条件循环也是较常用的一种,它先预置结束循环的条件,再用也是较常用的一种,它先预置结束循环的条件,再用CJNE指令、指令、JZ指令或指令或JB指令控制循环的结束。指令控制循环的结束。 73.3.2 循环程序设计实例【例例1】 片内片内RAM

6、中存放有中存放有10个数据,个数据,首地址为首地址为30H,编程将数据块传送到,编程将数据块传送到片外片外RAM以以1000H为首地址的存储为首地址的存储单元中。单元中。 解:该程序是单重循环程序,片内解:该程序是单重循环程序,片内RAM首地址首地址30H、片外、片外RAM首地址首地址1000H和数据块长度和数据块长度10都是循环初都是循环初始化的内容。始化的内容。 循环控制是对数据块长度进行判断,循环控制是对数据块长度进行判断,每传送一个数据,存放数据块长度的每传送一个数据,存放数据块长度的寄存器减寄存器减1;10个数据传送完,存放个数据传送完,存放数据块长度的寄存器内容正好为零,数据块长度

7、的寄存器内容正好为零,退出循环。退出循环。 开始R1赋30H、DPTR赋1000HR1给A给DPTRR1和DPTR加1结束R2-1=00H?YNR2=108ENDSJMP $80 FE010DH;循环次数未到循环次数未到10次次,转移转移DJNZ R2,LOOPDA FA010BH;修改片外修改片外RAM地址指针地址指针INC DPTRA3010AH;修改片内修改片内RAM地址指针地址指针INC R1090109H;数据传送到片外数据传送到片外RAM MOVX DPTR,AF00108H;从片内从片内RAM取数据取数据LOOP:MOV A,R1E70107H;数据块的长度数据块的长度MOV R

8、2,#107A 0A0105H;置片外置片外RAM地址指针地址指针1000HMOV DPTR,#1000H90 10 000102H;置片内置片内RAM地址指针地址指针30HMAIN:MOV R1,#30H79 300100HORG 0100HLJMP MAIN02 01 000000HORG 0000H注释注释程序程序机器码机器码地址地址93.3.2 循环程序设计实例【例例2】将内部将内部RAM中起始地址为中起始地址为data的数据串送到外部的数据串送到外部RAM中起始地址为中起始地址为buffer的存储区域中,直到发现的存储区域中,直到发现$字符,传字符,传送停止送停止-循环次数事先不知道

9、先判断,后执行。循环次数事先不知道先判断,后执行。开始给R0赋dataDPTR赋bufferDPTR加1R0加1结束A=24H?YNR1给AA 给DPTR10 MOV R0,#data MOV DPTR,#bufferLOOP1:MOV A,R0 CJNE A,#24H,LOOP2 ;判断是否为字符 SJMP LOOP3 ;是,转结束LOOP2:MOVX DPTR,A ;不是,传送数据 INC R0 INC DPTR SJMP LOOP1 ;传送下一数据LOOP3:END113.3.2 循环程序设计实例【例例3】片内片内RAM中存放一批数据,查找出最大值并存放于首中存放一批数据,查找出最大值并

10、存放于首地址中。设地址中。设R0中存首地址,中存首地址,R2中存放字节数。中存放字节数。12 MOV R2 MOV R2,n n ;n n为要比较的数据字节数为要比较的数据字节数 MOV AMOV A,R0R0 ;存首地址指针;存首地址指针 MOV R1MOV R1,A ADEC R2DEC R2; MOV AMOV A,R1 R1 LOOP:LOOP:MOV R3MOV R3, A A;将数据暂存;将数据暂存R3R3 DEC R1DEC R1 CLR CCLR C SUBB ASUBB A,R1R1;两个数比较;两个数比较 JNC LOOP1JNC LOOP1;C=0C=0,A A中的数大,

11、跳中的数大,跳LOOP1LOOP1 MOV AMOV A,R1R1;C=1C=1,则大数送,则大数送A A SJMP LOOP2SJMP LOOP2LOOP1:LOOP1:MOV AMOV A,R3 R3 LOOP2:LOOP2:DJNZ R2, LOOPDJNZ R2, LOOP;是否比较结束?;是否比较结束? MOV R0MOV R0, A A;存最大数;存最大数 RET RET 133.3.2 循环程序设计实例【例例4】一批单字节无符号数,以一批单字节无符号数,以R0为首地址指针,为首地址指针,R2中为字中为字节数,将这批数进行升序排列。节数,将这批数进行升序排列。冒泡法:相邻数互换的排

12、序方法,类似水中气泡上浮冒泡法:相邻数互换的排序方法,类似水中气泡上浮 。排。排序时从前向后进行相邻两个数的比较,次序与要求的顺序序时从前向后进行相邻两个数的比较,次序与要求的顺序不符时,就将两个数互换;顺序符合要求不互换。不符时,就将两个数互换;顺序符合要求不互换。 。14SORTSORT:MOV AMOV A,R0 R0 ;MOV R1MOV R1,A AMOV AMOV A,R2R2;字节数送入;字节数送入R5R5MOV R5MOV R5,A ACLR F0CLR F0;互换标志位;互换标志位F0F0清零清零DEC R5DEC R5;MOV AMOV A,R1R1;LOOP:LOOP:M

13、OV R3MOV R3,A A;INC R1INC R1;CLR CCLR C; 15MOV AMOV A,R1R1;A A为后一个数为后一个数SUBB ASUBB A,R3R3 ;比较大小;比较大小JNC LOOP1JNC LOOP1 ;C=0,AR3C=0,AR3转移转移SETB F0SETB F0;互换标志位;互换标志位F0F0置置1 1MOV AMOV A,R3R3;XCH AXCH A,R1R1;两个数互换;两个数互换DEC R1DEC R1;XCH AXCH A,R1R1;INC R1INC R1LOOP1LOOP1:MOV AMOV A,R1 R1 DJNZ R5DJNZ R5,

14、LOOP LOOP JB F0JB F0,SORT SORT RETRET163.3.2 循环程序设计实例【例例5】 P1口做为输出口控制步进电动机的四相绕组,编写程口做为输出口控制步进电动机的四相绕组,编写程序,控制步进电动机每序,控制步进电动机每2s正向转动一步。晶振频率正向转动一步。晶振频率6MHz。解:步距角:解:步距角:b=360/mZ () 电机转速:电机转速:n=60f/mZ (r/min)上式中:上式中:f 为脉冲频率,单位:为脉冲频率,单位:Hz或步或步/s。 m 为拍数,本例中为为拍数,本例中为4。 Z 为转子齿数,本例中取为转子齿数,本例中取5。 拍数拍数m=4,若使用的

15、步进电动机转子齿数,若使用的步进电动机转子齿数Z为为5,则步距角,则步距角b=18。题目要求步进电动机每。题目要求步进电动机每2s正向转动一步,即正向转动一步,即T=2s,则,则f=0.5Hz,电机转速,电机转速n=1.5r/min。 用三重循环设计用三重循环设计2s的循环程序。晶振频率为的循环程序。晶振频率为6MHz时,机时,机器周期为器周期为2 s,延时程序的延时时间计算方法如下:,延时程序的延时时间计算方法如下: 1+1+(1+1+21+1+(1+1+2123+2)123+2)200+2200+220+220+22 2 s s =2000126 =2000126 s=2.000126s

16、s=2.000126s 17 P1.0P1.3口作为输出口分别控制步进电动机的四相绕组,步进电动机的控制状态与P1口的控制码的对应关系如下表所示。1001000009HD相、相、A相绕组通电相绕组通电001100000CHC相、相、D相绕组通电相绕组通电0110000006HB相、相、C相绕组通电相绕组通电1100000003HA相、相、B相绕组通电相绕组通电A相相B相相C相相D相相P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P1口口控制码控制码控制状态控制状态18;重复循环重复循环 SJMP MAIN80 E60048H LCALL DELAY12 01 000045H;

17、DA相通电相通电 MOV P1, #09H75 90 090042H LCALL DELAY12 01 00003FH;CD相通电相通电 MOV P1, #0CH75 90 0C 003CH LCALL DELAY12 01 000039H;BC相通电相通电 MOV P1, #06H75 90 060036H LCALL DELAY12 01 000033H;AB相通电相通电 MAIN: MOV P1,#03H75 90 030030H ORG 0030H LJMP MAIN02 00 300000H ORG 0000H注释注释程序程序机器码机器码地址地址主程序:19;程序结束程序结束 END

18、 RET22010DH DJNZ R3,LP1DB F5010BH DJNZ R7,LP2DF F90109H LP3: DJNZ R6,LP3DE FE0107H NOP000106H;延时延时0.5ms的循环次数的循环次数 LP2: MOV R6,#1237E 7B0104H;延时延时100ms的循环次数的循环次数 LP1: MOV R7,#2007F C80102H;延时延时2s的循环次数的循环次数DELAY: MOV R3,#207B 140100H ORG 0100H注释注释程序程序机器码机器码地址地址延时子程序:203.4 分支程序设计 v3.4.1 分支程序设计方法 v3.4.2

19、 分支程序设计实例 213.4.1 分支程序设计方法v分支程序是根据程序的要求改变程序的执行顺序,并根据条分支程序是根据程序的要求改变程序的执行顺序,并根据条件对程序的流向进行判断的程序结构。件对程序的流向进行判断的程序结构。v分支程序一般有两个或两个以上的出口。分支程序一般有两个或两个以上的出口。v分支程序又分为分支程序又分为单分支单分支和和多分支多分支结构。结构。223.4.1 分支程序设计方法v分支程序的特点和设计方法。分支程序的特点和设计方法。l程序中有转移指令包括程序中有转移指令包括无条件转移无条件转移、条件转移条件转移和和散转指令散转指令。l单分支程序单分支程序一般有一般有一个入口

20、一个入口、两个出口两个出口,一般用无条件转移,一般用无条件转移和条件转移指令来实现,结构形式有两种。和条件转移指令来实现,结构形式有两种。 一种是当条件满足时,执行处理程序一种是当条件满足时,执行处理程序2,否则执行处理程序,否则执行处理程序3。分支程序流程图如下图分支程序流程图如下图(a)所示。所示。 另一种是当条件满足时,跳过处理程序另一种是当条件满足时,跳过处理程序2,直接执行处理程,直接执行处理程序序3,否则顺序执行处理程序,否则顺序执行处理程序2和处理程序和处理程序3。分支程序流程图。分支程序流程图如下图如下图(b)所示。所示。233.4.1 分支程序设计方法 开始 处理 2 处理

21、3 处理 1 初始化 结束 Y N 条件满足? (a) 分支程序流程图 (b) 分支程序流程图 243.4.1 分支程序设计方法l分支程序允许分支程序允许嵌套,即一个嵌套,即一个分支接一个分分支接一个分支,形成树状支,形成树状多分支多分支结构。结构。多分支程序流多分支程序流程图如右图所程图如右图所示。示。多分支程序流程图25【例例1】按下面公式编写程序,按下面公式编写程序,x为无符号数,存在为无符号数,存在20h单元,单元,y存放在存放在21h单元。单元。204020240 xxxxxxy3.4.2 分支程序设计实例26 ORG 0030H MOV A, 20H CJNE A, #21, LO

22、OP1LOOP1: JC NEXT1 CJNE A, #40, LOOP2LOOP2: JNC NEXT2 MOV B, #2 MUL AB AJMP NEXT2NEXT1: CPL ANEXT2: MOV 21H, A END最终结果存在最终结果存在 21h中中27 【例例2】行李计价:行李计价: 当当G5,M=G3; 当当G5,M=G3+(G-5)(5-3)3.4.2 分支程序设计实例FRT: MOV A,40H ;取行李重量取行李重量G放在放在40H MOV R3,A MOV B,#03H;M=G3 MUL AB MOV R2,A;暂存暂存3 G在在R2 MOV A,R3;取回;取回G

23、CJNE A,#06H,L1 ;G5 ?L1: JC WETC;是,转至;是,转至WETC SUBB A,#05H;否则;否则M=3G+2(G-5) RLC A ADD A,R2 MOV R2,AWETC:MOV 41H,R2 ;最后结果最后结果M存存41H end283.4.2 分支程序设计实例【例例3】 设计一个水塔水位控制系统,晶振频率设计一个水塔水位控制系统,晶振频率6MHz。设计要设计要求如下:求如下:(1) 在水塔内三个不同的高度分别安装了一根在水塔内三个不同的高度分别安装了一根固定不动的金属棒,正常情况下,塔内固定不动的金属棒,正常情况下,塔内水位应保持在虚线之内,水位控制原理水

24、位应保持在虚线之内,水位控制原理如下图所示。如下图所示。 (2) A棒处于水位上限,棒处于水位上限,B棒处于水位下限。当棒处于水位下限。当水位低于水位下限时,自动启动水泵电水位低于水位下限时,自动启动水泵电机给水塔供水;直到塔内水位达到水位机给水塔供水;直到塔内水位达到水位上限,自动停止水泵电机动转。上限,自动停止水泵电机动转。(3) 塔内水位从水位上限下降到水位下限的过塔内水位从水位上限下降到水位下限的过程中,水泵电机不会自动启动。程中,水泵电机不会自动启动。(4) 水塔进水时,要有信号灯指示;水位检测水塔进水时,要有信号灯指示;水位检测发生故障时,要有故障灯指示并使水塔发生故障时,要有故障

25、灯指示并使水塔水位控制系统停止工作。水位控制系统停止工作。 293.4.2 分支程序设计实例 由于水的导电作用,当塔内水位由于水的导电作用,当塔内水位达到水位下限时,达到水位下限时,B棒接通棒接通+5V;当塔内水位达到水位上限时,当塔内水位达到水位上限时,A棒也接通棒也接通+5V。 水位上限信号水位上限信号输入至输入至P1.0,水位水位下限信号下限信号输入至输入至P1.1,P1.2输出输出控制信号以控制控制信号以控制水泵电机水泵电机的启动的启动(P1.2=0)和停止和停止(P1.2=1),P1.3输出显示信号以指示输出显示信号以指示水泵电机的水泵电机的运行状态运行状态(P1.3=0时点亮时点亮

26、),P1.4输出故障信号以指示输出故障信号以指示水位检测系水位检测系统故障状态统故障状态(P1.4=0时点亮时点亮)。 解:当塔内水位处于水位下限以下时,当塔内水位处于水位下限以下时,A、B棒通过电阻接地。棒通过电阻接地。 304.4.2 分支程序设计实例 水位控制信号与水泵电机控制状态的对应关系水位控制信号与水泵电机控制状态的对应关系 为了防止电机频繁启停,在启动或停止电机后最少要维持这为了防止电机频繁启停,在启动或停止电机后最少要维持这一状态一状态20s20s,这可以采用延时程序来实现。,这可以采用延时程序来实现。 111水泵电机停止水泵电机停止111维持原来状态维持原来状态01011故障

27、报警故障报警10100水泵电机启动水泵电机启动00P1.4P1.3P1.2控制状态控制状态P1.0P1.131 SJMP YS80 E40055H SETB P1.3D2 930053H;停止电机停止电机 TZDJ: SETB P1.2D2 920051H SJMP YS80 EA004FH;打开电机运行指示打开电机运行指示 CLR P1.3C2 93004DH;启动电机启动电机 QDDJ: CLR P1.2C2 92004BH SJMP $80 FE0049H;打开水位检测故障指示打开水位检测故障指示 CLR P1.4C2 940047H;关闭电机运行指示关闭电机运行指示 SETB P1.3

28、D2 930045H;停止电机停止电机 SETB P1.2D2 920043H;P1.0=0,转移至启动电机转移至启动电机 QDZB: JNB ACC.0,QDDJ30 E0 080040H SJMP MAIN80 F0003EH;延时延时20s YS: LCALL DELAY12 01 00003BH;P1.0=1,转移至停止电机转移至停止电机 JB ACC.0,TZDJ20 E0 160038H;P1.1=0,转移至启动准备转移至启动准备 JNB ACC.1,QDZB30 E1 080035H;读入水位检测信号读入水位检测信号 MOV A,P1F5 90 0033H;水位信号输入端做读入准

29、备水位信号输入端做读入准备 MAIN: ORL P1,#03H43 90 030030H ORG 0030H LJMP MAIN02 00 300000H ORG 0000H主程序:32;程序结束程序结束 END RET22010DH DJNZ R3,LP1DB F5010BH DJNZ R7,LP2DF F90109H LP3: DJNZ R6,LP3DE FE0107H NOP000106H;延时延时0.5ms的循环次数的循环次数 LP2: MOV R6,#1237E 7B0104H;延时延时100ms的循环次数的循环次数 LP1: MOV R7,#2007F C80102H;延时延时20

30、s的循环次数的循环次数DELAY: MOV R3,#2007B C80100H ORG 0100H注释注释程序程序机器码机器码地址地址延时子程序:333.5 子程序设计 v3.5.1 子程序设计方法 v3.5.2 子程序设计实例 343.5.1 子程序设计方法v子程序是指完成某一专门任务并能被其他程序反复调用的子程序是指完成某一专门任务并能被其他程序反复调用的程序段。调用子程序的程序称为主程序或程序段。调用子程序的程序称为主程序或调用程序调用程序。使用。使用子程序的过程称为子程序的过程称为调用子程序调用子程序。子程序执行完后返回主程。子程序执行完后返回主程序的过程称为序的过程称为子程序返回子程

31、序返回。v主程序和子程序是相对的,同一程序既可以作为另一程序主程序和子程序是相对的,同一程序既可以作为另一程序的子程序,也可以有自己的子程序。也就是说,子程序是的子程序,也可以有自己的子程序。也就是说,子程序是允许允许嵌套嵌套的,嵌套深度和堆栈区的大小有关。的,嵌套深度和堆栈区的大小有关。v采用子程序能使整个程序结构简单,缩短程序设计时间,采用子程序能使整个程序结构简单,缩短程序设计时间,减少对存储空间的占用。减少对存储空间的占用。 353.5.1 子程序设计方法v子程序的特点和设计方法子程序的特点和设计方法l子程序具有通用性和独立性,以满足所有调用程序实现资源子程序具有通用性和独立性,以满足

32、所有调用程序实现资源共享。共享。l子程序的第一条指令的地址称为子程序的第一条指令的地址称为子程序的入口地址子程序的入口地址,该指令,该指令前应有标号。前应有标号。l合理地确定子程序的参数传递方式:合理地确定子程序的参数传递方式:入口参数入口参数是子程序需要是子程序需要的原始参数,由主程序通过相关的工作寄存器、特殊功能寄的原始参数,由主程序通过相关的工作寄存器、特殊功能寄存器、片内存器、片内RAMRAM或堆栈等传送给子程序;或堆栈等传送给子程序;出口参数出口参数是根据入口是根据入口参数执行子程序后获得的结果,由子程序通过相关的工作寄参数执行子程序后获得的结果,由子程序通过相关的工作寄存器、特殊功

33、能寄存器、片内存器、特殊功能寄存器、片内RAMRAM或堆栈等传递给主程序。或堆栈等传递给主程序。l在主程序中可以用调用指令调用子程序,在子程序末尾用在主程序中可以用调用指令调用子程序,在子程序末尾用RETRET返回指令从子程序返回主程序。返回指令从子程序返回主程序。363.5.1 子程序设计方法l根据需要保护现场和恢复现场。在子程序的开始,使用压根据需要保护现场和恢复现场。在子程序的开始,使用压栈指令把需要保护的内容压入堆栈;在返回主程序前,使栈指令把需要保护的内容压入堆栈;在返回主程序前,使用弹出指令把堆栈中保护的内容送回原来的存储单元中。用弹出指令把堆栈中保护的内容送回原来的存储单元中。

34、子程序中有可能要使用累加器子程序中有可能要使用累加器A或工作寄存器,在子程序或工作寄存器,在子程序使用它们之前,把它们中可能存有的主程序的中间结果保使用它们之前,把它们中可能存有的主程序的中间结果保存起来,这一过程称为存起来,这一过程称为保护现场保护现场。在子程序执行完并将返。在子程序执行完并将返回主程序之前,再将这些中间结果取出,送回到累加器回主程序之前,再将这些中间结果取出,送回到累加器A或原来的工作寄存器中,这一过程称为或原来的工作寄存器中,这一过程称为恢复现场恢复现场。l子程序中应尽量使用相对转移指令而不使用其他转移指令,子程序中应尽量使用相对转移指令而不使用其他转移指令,以便子程序放

35、在内存的任何区域都能被主程序调用。以便子程序放在内存的任何区域都能被主程序调用。l要正确地设置要正确地设置堆栈指针堆栈指针,以避免堆栈区与工作寄存器或其,以避免堆栈区与工作寄存器或其他存储单元发生冲突。他存储单元发生冲突。373.5.1 子程序设计方法v传送子程序参数的方法。传送子程序参数的方法。l利用寄存器或片内利用寄存器或片内RAM传送参数传送参数。可以把入口参数存放到。可以把入口参数存放到寄存器或片内寄存器或片内RAM中传送给子程序,也可以把出口参数存中传送给子程序,也可以把出口参数存放到寄存器或片内放到寄存器或片内RAM中传送给主程序。中传送给主程序。l利用寄存器传送参数的地址利用寄存

36、器传送参数的地址。把存放入口参数的地址通过。把存放入口参数的地址通过寄存器传送给子程序,子程序根据寄存器中存放入口参数寄存器传送给子程序,子程序根据寄存器中存放入口参数的地址便可找到入口参数并对它们进行相应操作;出口参的地址便可找到入口参数并对它们进行相应操作;出口参数的地址也可通过寄存器传送给主程序。数的地址也可通过寄存器传送给主程序。l利用堆栈传送参数利用堆栈传送参数。可以用压栈指令。可以用压栈指令PUSH把入口参数压入把入口参数压入堆栈传送给子程序,也可以使用压栈指令堆栈传送给子程序,也可以使用压栈指令PUSH把出口参数把出口参数压入堆栈传送给主程序。压入堆栈传送给主程序。 383.5.

37、2 子程序设计实例【例例1】 将片内将片内RAM区区20H24H单元中的一位十六进制数转单元中的一位十六进制数转换成换成ASCII码,并分别存放到片内码,并分别存放到片内RAM区区30H34H单元中单元中。解:解:ASCII码是有一定规律的编码,如十六进制数的码是有一定规律的编码,如十六进制数的09的的ASCII码为该数值加上码为该数值加上30H,分别为,分别为30H39H;十六进制;十六进制数的数的AF的的ASCII码为该数值加上码为该数值加上37H,分别为,分别为41H46H。39SJMP $80 FE010FHDJNZ R4,LP1DC F7010DHINC R109010CHINC R

38、008010BH;存放存放ASCII码码MOV R1,AF7010AH;调用代码转换程序调用代码转换程序LCALL HAC12 01 500107H;取十六进制数取十六进制数MOV A,R0LP1:E60106H;存放存放ASCII码首地址码首地址MOV R1,#30H79 300104H;存放十六进制数首地址存放十六进制数首地址MOV R0,#20H78 200102H;数据块的长度数据块的长度MOV R4,#05HMAIN:7C 050100HORG 0100HLJMP MAIN02 01 000000HORG 0000H注释注释程序程序机器码机器码地址地址主程序:40END;子程序返回子

39、程序返回RET220163H;恢复现场恢复现场POP PSWD0 D00161HADD A,#30HLP2:24 30015FHADD A,#07H24 07015DH;(A)10时时,转移转移JC LP240 02015BHPOP ACCD0 E00159H;比较比较A中内容的大小中内容的大小SUBB A,#0AH94 0A0157H;CLR CC30156H;PUSH ACCC0 E00154H;屏蔽掉高屏蔽掉高4位位ANL A,#0FH54 0F0152H;保护现场保护现场PUSH PSWHAC:C0 D00150H;子程序从地址子程序从地址0150H开始存放开始存放ORG 0150H;

40、占用资源占用资源:PSW;出口参数出口参数:A存放转换后的存放转换后的ASCII码码;入口参数入口参数:A存放要转换的十六进制数存放要转换的十六进制数;功能:功能:十六进制数转换成十六进制数转换成ASCII码码;程序名:程序名:HAC注释注释程序程序机器码机器码地址地址子程序:413.6 查表程序设计 v3.6.1 查表程序设计方法 v3.6.2 查表程序设计实例423.6.1 查表程序设计方法v在单片机的实际应用中,经常要对一些数据进行在单片机的实际应用中,经常要对一些数据进行函数运算函数运算,例如求平方、正弦函数等,为了提高单片机执行程序的速例如求平方、正弦函数等,为了提高单片机执行程序的

41、速度,一般将某函数的全部函数值按一定的规律编成表格存度,一般将某函数的全部函数值按一定的规律编成表格存放到程序存储器中。放到程序存储器中。v查表程序查表程序就是根据某数据的函数运算要求,按索引号从程就是根据某数据的函数运算要求,按索引号从程序存储器中查找与之相对应的函数值的程序结构。序存储器中查找与之相对应的函数值的程序结构。v设计查表程序时,主要通过两条设计查表程序时,主要通过两条查表指令查表指令实现查表功能。实现查表功能。433.6.1 查表程序设计方法v查表程序的特点和设计方法。查表程序的特点和设计方法。l查表指令查表指令“MOVC A,A+DPTR”的查表过程比较简单。的查表过程比较简

42、单。查表时首先需要把数据表格起始地址存入查表时首先需要把数据表格起始地址存入DPTR,然后把所,然后把所查数据的索引值送入累加器查数据的索引值送入累加器A中,最后使用查表指令中,最后使用查表指令“MOVC A,A+DPTR”完成查表。完成查表。l查表指令查表指令“MOVC A,A+PC”的查表过程相对复杂一些。的查表过程相对复杂一些。查表时首先使用传送指令把所查数据的索引值送入累加器查表时首先使用传送指令把所查数据的索引值送入累加器A,然后用然后用“ADD A,#data”指令对累加器指令对累加器A进行修正。进行修正。data值由该式确定:值由该式确定:PC+data=数据表格的首地址。其中,数据表格的首地址。其中,PC是是“MOVC A,A+PC”的下一条指令的地址。因此,的下一条指令的地址。因此,data值实际等于查表指令和数据表格之间的字节数。最后值实际等于查表指令和数据表格之间的字节数。最后使用查表指令使用查表指令“MOVC A,A+PC”完成查表。完成查表。443.6.2 查表程序设计实例【例例14】 变量变量a、b均为小于均为小于10的正整数,编程计算的正整数,编程计算c=a2+b2,其中变量其中变量a、b分别存放在片内分

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论