第4章 应用程序设计.ppt_第1页
第4章 应用程序设计.ppt_第2页
第4章 应用程序设计.ppt_第3页
第4章 应用程序设计.ppt_第4页
第4章 应用程序设计.ppt_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

1、汇编语言与 简单程序设计,多字节加法 多字节减法 多字节BCD码加法,4.1运算程序,例 4字节无符号数相加。 被加数:内部RAM 43H,42H,41H,40H单元; 加数:内部RAM 53H,52H,51H,50H单元。 计算两数的和,放在43H,42H,41H,40H单元中。,多字节加法,多字节加法,采用主子程序结构: 主程序功能:设置子程序入口参数 子程序功能:两个多字节数相加 子程序入口参数: 加数最低位的起始地址50H; 被加数最低位的起始地址40H; 加数和被加数的长度4字节; 子程序出口参数: 和的最低位的起始地址40H,主程序 MOV R0,#40H;被加数与和的地址指针 M

2、OV R1,#50H;加数地址指针 MOV R2,#04H ;加数的字节数 ACALL JASUB ,多字节加法程序,加法子程序 JASUB:CLCC JASUB1:MOVA, R0 ADDC A, R1 ; MOV R0,A INC R0 INC R1 DJNZ R2, JASUB1 RET,采用主子程序结构: 主程序功能:设置子程序入口参数 子程序功能:两个多字节数相减 子程序入口参数: 减数最低位的起始地址50H; 被减数最低位的起始地址40H; 减数的长度4字节; 子程序出口参数: 差的最低位的起始地址40H,例 4字节无符号数相减,被减数放在内部RAM 43H,42H,41H,40H

3、单元,减数放在内部53H,52H,51H,50H单元。计算两数的差,放在43H,42H,41H,40H单元中。,多字节减法程序,主程序 MOV R0,#40H;被减数与差的地址指针 MOV R1,#50H;减数的地址指针 MOV R2,#04H ;减数的字节数 ACALL JIANSB ,多字节减法程序,减法子程序 JIANSB :CLCC JIAN1:MOVA, R0 SUBB A, R1 ; MOV R0,A INC R0 INC R1 DJNZ R2, JIAN1 RET,主程序 MOV R0,40H;被加数与和的地址指针 MOV R1,50H;加数地址指针 MOV R2,#04H ;加

4、数的字节数 ACALL JASUB ,多字节BCD码加法程序,加法子程序 JASUB:CLCC JASUB1:MOVA, R0 ADDC A, R1 ; DAA MOV R0,A INC R0 INC R1 DJNZ R2, JASUB1 RET,数据的拼拆 数据的转换,4.2数据的拼拆和转换,一、数据的拼拆,例:设20H,21H单元中各有一个8位数据: (20H)= X7 X6 X5 X4 X3 X2 X1 X0 (21H)= Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 目的:(30H)= Y2 Y1 Y0 X4 X3 X2 X1 X0,MOV 30H ,20H ANL 30H ,#00

5、011111B MOV A ,21H SWAPA RLA , ANLA ,#11100000B ORL30H ,A,(30H)= X7 X6 X5 X4 X3 X2 X1 X0 (30H)= 0 0 0 X4 X3 X2 X1 X0 (ACC)= Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 (ACC)= Y3 Y2 Y1 Y0Y7 Y6 Y5 Y4 (ACC)= Y2 Y1 Y0Y7 Y6 Y5 Y4 Y3 (ACC)= Y2 Y1 Y0 0 0 0 0 0 (30H)= Y2 Y1 Y0 X4 X3 X2 X1 X0,数据的拼拆(续),例:设7CH单元中各有2个BCD码: (20H)=

6、X7 X6 X5 X4 X3 X2 X1 X0 目的: (21H)= 0 0 0 0 X0 X1 X2 X3,CyACC X0 a7 a6 a5 a4 a3 a2 a1 a0 a7 a6 a5 a4 a3 a2 a1 a0 X0 X1 a6 a5 a4 a3 a2 a1 a0 X0 a6 a5 a4 a3 a2 a1 a0 X0 X1 X2 a5 a4 a3 a2 a1 a0 X0 X1 a5 a4 a3 a2 a1 a0 X0 X1 X2 X3 a4 a3 a2 a1 a0 X0 X1 X2 a4 a3 a2 a1 a0 X0 X1 X2 X3 0 0 0 0 X0 X1 X2 X3,MOV

7、C,00H RLCA MOVC,01H RLCA MOVC,02H RLCA MOVC,03H RLCA ANLA ,#00001111B MOV21H ,A,数据的拼拆(续),例:设7CH单元中各有一个8位数据: (7C)= X1 X0H 目的: (R6)= 0X1H,(R5)= 0X0H MOVR1 , #7CH MOVA ,#00H XCHD A,R1 MOVR5 , A MOVA , 7CH SWAPA MOVR6 , A,R1 ACC 7CH 7CH X1 X0H 7CH 00H X1 X0H 7CH 0X0H X1 0 H 7CH X10H X1 0 H 7CH 0X1H X1 0

8、 H,二、数据的转换,1、 二进制数与ASCII的相互转换 二进制数转换为ASCII码 ASCII码转换为二进制数,1. 二进制数与ASCII的相互转换,例将R2中存放的十六进制数(0F)的ASCII码转化为十六进制数,并存放到R2中。 解分析:将程序设计为一个子程序, 入口参数: R2=30H39H,41H46H 出口参数: R2 =09,AF,(R2)=30H39H (R2)=41H46H (A)= 00H09H (A)=11H16H (R2)= 00H09H (R2)= 11H16H (Cy)= 1 (Cy)=0 顺序执行 直接退出 (A)= 11H16H (A)= 0AH0FH (R2

9、)= 0AH0FH (R2)= 00H09H,ASCII: MOV A, R2 CLR C SUBB A,#30H; MOV R2,A; SUBB A,#0AH; JC SBIO; XCH A, R2; SUBB A,#07H; MOV R2 ,A SBIO: RET,1. 二进制数与ASCII的相互转换,ASCII:MOVA, R2 CLR C SUBBA,#30H MOV R2,A SUBBA,#0AH JC SBIO XCHA, R2 SUBBA,#07H MOV R2 , A SBIO: RET,三次用到了SUBB指令,都需要提前对Cy清零,为什么只有第一条指令之前有CLRC指令?,问

10、题1,第一条指令SUBB A,#30H执行之后Cy一定为0,因此第二条指令SUBBA,#0AH 之前不需要对Cy清零; 指令JC SBIO根据Cy产生两个分支,第三条指令SUBB A,#07H处在Cy=0的分支,因此第三条指令SUBB A,#07H 之前不需要对Cy清零;,当(R2)=09H时,第二条指令SUBBA,#09H 会做出错误判断: (Cy)=0,程序顺序执行,造成(R2)=09H-07H=02H,1. 二进制数与ASCII的相互转换,(R2)=30H39H (R2)=41H46H (A)= 00H09H (A)=11H16H (R2)= 00H09H (R2)= 11H16H (C

11、y)= 1 (Cy)=0 顺序执行 直接退出 (A)= 11H16H (A)= 0AH0FH (R2)= 0AH0FH (R2)= 00H09H,ASCII: MOV A, R2 CLR C SUBB A,#30H; MOV R2,A; SUBB A,#0AH; JC SBIO; XCH A, R2; SUBB A,#07H; MOV R2 ,A SBIO: RET,4.3查表程序,复杂代码转换显示 数据补偿:传感器补偿 复杂函数计算: Y=SIN(X) 查表指令: 在51中有两条查表指令: MOVC A,A+DPTR MOVC A,A+PC,yn,y2,y1,Y=SIN(X),xn,x2,x

12、1,X,应用场合:,查表程序举例,例: 设一巡回报警系统,对16路输入进行控制,现根据测量路数,找出每路的最大允许值.若大于允许值就报警.,TB3:MOV A,R2;(R2)=015 ADD A,R2 MOV R3,A ADD A, #补偿值? MOVC A,A+PC 1XCH A,R3 2ADD A,#补偿值+1=? 1MOVC A,A+PC 1MOV R4,A 1RET TAB3: DW 1520H;第0路报警阈值 DW 3721H;第1路报警阈值 DW ,#06H,#03H,表格最大长度的计算: 按照第一条MOVC指令: 2566=250Byte; 按照第二条MOVC指令: 2563=2

13、53Byte; 表格最大长度=250Byte 可以同时监测信号路数 250/2=125路信号,查表程序举例,例:将上例改为使用DPTR作基址。,TB3:MOV A,R2 ADD A,R2 MOV R3,A MOV DPTR, #TAB1 MOVC A,A+DPTR XCH A,R3 INC DPTR MOVC A,A+DPTR MOV R4,A RET TAB3:DW 1520H ; DW 3721H ; DW ,问题1,如果监测点超过128个或者数据表超过256Byte,怎么办?,表格最大长度= 256Byte 可以同时监测信号路数 256/2=128,数据表格超过256Byte解决办法,问

14、题,如果数据表超过256Byte,怎么办? 解决办法1: 表中偏移量(A)*2(R2)(R3) 表头地址 #TAB (DPTR),4) 给累加器清零: (A)0 5) 执行查表指令:MOVC A,A+DPTR,一步完成待查数据的偏移量的计算,数据表格超过256Byte解决办法,问题,如果数据表超过256Byte,怎么办? 解决办法2: 1) 表中偏移量(A)*2(R2)(R3) 2) 表头地址 #TAB (DPTR),4)给累加器赋值: (A) (R3) 5)执行查表指令:MOVC A,A+DPTR,两步完成待查数据的偏移量的计算,数据表格超过256Byte查表程序举例,例:在一个以MCS-5

15、1为核心的温度控制器中,温度传感器输出的电压与温度为非线性关系。 传感器输出电压:XH XL (两个字节) (20H)(21H) 电压值的取值范围:10位二进制数0XH XL1023 温度值的取值精度:两个字节YH YL 温度表长度:1024*2=2K Byte 温度表首地址:#TAB 本例的x和y均为双字节无符号数。,数据表格超过256Byte查表程序举例,传感器输出电压:XH XL (两个字节) (20H)(21H) 电压值的取值范围:0(20H)(21H)=XH XL1023 电压值XiH XiL对应的温度值在表中的偏移量: (20H)(21H)*2 (20H)(21H)*2+1,(20

16、H)(21H)*2+1,(20H)(21H)*2,YiH,Xi,YiH,Y1L,X1,Y1H,Y0L,X0,Y0H,#TAB,.,查表操作步骤,数据表长度=2KByte,超过了256Byte,解决方法为: 1) 表中偏移量(20H)(21H) *2 (20H)(21H) 2)表头地址 #TAB (DPTR),4)给累加器清零: (A)0 5)查出温度值高字节YiH:MOVC A,A+DPTR 6)给累加器清零: (A)0 7)数据指针加1: (DPTR) (DPTR)+1 8)查出温度值低字节YiL:MOVC A,A+DPTR,一步完成待查数据的偏移量的计算,查表操作的几个问题,问题1,如何实

17、现2字节电压值乘以2?,单独使用RL A 已经不能解决问题: RL A ;(A) (A)*2,前提是(A)7FH 解决办法:,查表操作的几个问题,问题1,如何实现2字节电压值乘以2?,设: (20H)= b7b6b5b4b3b2b1b0(21H)=a7a6a5a4a3a2a1a0 目的:(20H)= b6b5b4b3b2b1b0a7(21H)=a6a5a4a3a2a1a00 两次使用RLC A分步解决问题:,MOVA,21H CLRC RLCA MOV21H,A MOVA,20H RLCA MOV20H,A,Cy A,0 a7 a6 a5 a4 a3 a2 a1 a0 a7 a6 a5 a4

18、a3 a2 a1 a0 0 (21H)= a6 a5 a4 a3 a2 a1 a0 0 a7 b7 b6 b5 b4 b3 b2 b1 b0 b7 b6 b5 b4 b3 b2 b1 b0 a7 (20H)= b6 b5 b4 b3 b2 b1 b0 a7,查表操作的几个问题,问题2,高字节电压值(20H)乘以2过程中最高位b7数据丢失是否影响查表结果?,设: (20H)= b7b6b5b4b3b2b1b0(21H)=a7a6a5a4a3a2a1a0 目的:(20H)= b6b5b4b3b2b1b0a7(21H)=a6a5a4a3a2a1a00,答:不会。 2字节电压值取值范围: 0(20H)

19、(21H)=XH XL1023 乘2之前(20H)(21H)= 000000b3b2b1b0 a7a6a5a4a3a2a1a0 即最高的6 bite都为0 高字节电压值(20H)乘以2过程中最高位b7数据 丢失不会影响查表结果。,数据表格超过256Byte查表 例程清单,LTB2: MOV DPTR,#TAB2 MOV A,21H CLR C RLC A MOV 21H,A XCH A,20H RLC A MOV 20H,A,数据表格超过256Byte查表 例程清单(续),MOV A,21H; ADD A,DPL; MOV DPL,A MOV A,20H ADDC A,DPH MOV DPH,

20、A CLR A MOVC A,A+DPTR MOV 22H,A INC DPTR CLR A MOVC A,A+DPTR MOV 23H,A RET TAB2: DW,;(20H)(21H)+(DPTR)(DPTR) ;查第一字节 ;第一字节存入22H中 ;查第二字节 ;第二字节存入23H中 ;温度值表,查表操作的几个问题,数据表长度=2KByte,超过了256Byte,本例程中采用的解决办法如下: 1)表中偏移量(20H)(21H) *2 (20H)(21H) 2)表头地址 #TAB (DPTR),4)给累加器清零: (A)0 5)执行查表指令:MOVC A,A+DPTR,一步完成待查数据的

21、偏移量的计算,问题3,能否采用另一种解决方法?,查表操作的几个问题,数据表长度=2KByte,超过了256Byte,采用另一种解决办法如下: 1)表中偏移量(20H)(21H) *2 (20H)(21H) 2)表头地址 #TAB (DPTR),4)给累加器赋值: (A)(21H) 5)查出温度值高字节YiH:MOVC A,A+DPTR 6)给累加器赋值: (A) (21H) 7)数据指针加1: (DPTR) (DPTR)+1 8)查出温度值低字节YiL:MOVC A,A+DPTR,问题3,查表操作的几个问题,数据表长度=2KByte,超过了256Byte,采用另一种解决办法的程序清单如下:,问

22、题3,MOV A,20H; (20H)(21H)+(DPTR)(DPTR) ADD A,DPH; MOV DPH,A MOV A,21H MOVC A,A+DPTR ;查第一字节 MOV 22H,A ;第一字节存入22H中 MOV A,21H INC DPTR ; MOVC A,A+DPTR ;查第二字节 MOV 23H,A ;第二字节存入23中 RET,改为INC A,可以吗?,改为INC A,当恰好(21H)=0FFH时会发生错误,本例中只能为偶数,4.4散转程序,定义:就是用散转指令“JMP A+DPTR”来实现多分支程序的转移。 设计步骤: 1)在ROM中建立一个散转表 表中可以存放无

23、条件转移指令、或各分支入口地址。表中存放的内容不同,所编写的散转程序也就不同。 假设各分支入口地址: OPR0: 操作程序0 OPR1: 操作程序1 OPRn: 操作程序n,设计步骤(续),2)将散转表的首地址送DPTR; 3)分支序号送A; 4)根据序号查找相应的转移指令或入口地址,从而实现多分支的转移 实现方式: (1)采用转移指令组成表 (2)采用地址偏移量组成表 (3)采用各分支入口地址组成表,(1)采用转移指令组成表,在许多实际应用中,往往要根据某标志单元的内容(键盘输入或运算结果)是0,1,2,n,分别转向操作程序0,操作程序1,操作程序2,操作程序n。 可使用转移指令组成表。,T

24、AB1: AJMP OPR0 ; AJMP OPR1 AJMP OPRn ,(1)采用转移指令组成表,例 试编程根据R7的内容,转向相应的操作程序段。使用转移指令组成表。 若 R7=0, 查表获得指令:AJMP OPR0转入标号为OPR0的分支; 若 R7=1, 查表获得指令:AJMP OPR1转入标号为OPR1的分支; 若 R7=n, 查表获得指令:AJMP OPRn转入标号为OPRn的分支;,多分支程序流程图,例程清单采用转移指令组成表,JUMP1: MOV DPTR,#TAB1; MOV A,R7 ; ADD A,R7 ; NOAD: JMP A+DPTR ; TAB1: AJMP OP

25、R0 ; AJMP OPR1 AJMP OPRn ,送转移表首地址 序号送A 序号2A(因AJMP指 令占2个字节) 转入转移表内 转移指令组成转移表,例程清单采用转移指令组成表,JUMP1: MOV DPTR,#TAB1; MOV A,R7 ; ADD A,R7 ; NOAD: JMP A+DPTR ; TAB1: AJMP OPR0 ; AJMP OPR1 AJMP OPRn ,最多可以实现多少个分支跳转?即n的取值范围是多少? 答: n127,因为没考虑(R7)2256的情况,问题,例程清单采用转移指令组成表,JUMP1: MOV DPTR,#TAB1; MOV A,R7 ; ADD A

26、,R7 ; JNC NOAD INC DPH NOAD:JMP A+DPTR ; TAB1 :AJMP OPR0 ; AJMP OPR1 AJMP OPRn ,例程清单采用转移指令组成表,JUMP1: MOV DPTR,#TAB1; MOV A,R7 ; ADD A,R7 ; JNC NOAD INC DPH NOAD:JMP A+DPTR ; TAB1 :AJMP OPR0 ; AJMP OPR1 AJMP OPRn ,送转移表首地址 序号送A 序号2A 转入转移表内 转移指令组成转移表 此段散转程序适用 127n256,例程清单采用转移指令组成表,JUMP1: MOV DPTR,#TAB1

27、; MOV A,R7 ; ADD A,R7 ; JNC NOAD INC DPH NOAD:JMP A+DPTR ; TAB1 :AJMP OPR0 ; AJMP OPR1 AJMP OPRn ,(2)采用地址偏移量组成表,当分支序号较少,各段程序较短,所有分支程序均处在256字节之内时,可使用地址偏移量组成表。 TAB2: DB OPR0 TAB2; OPRi: 操作程序i DB OPR1 TAB2 DB OPR2 TAB2 DB OPR3 TAB2 DB OPR4 TAB2 ,(2)采用地址偏移量组成表,(2)采用地址偏移量组成表,例 试编程根据R7的内容,转向相应的操作程序段。设(R7)

28、= 04,使用地址偏移量组成表。 若 R7=0, 查表获得分支程序OPR0与表头TAB2的差值OPR0 TAB2,转入标号为OPR0的分支; 若 R7=1, 查表获得分支程序OPR1与表头TAB2的差值OPR1 TAB2,转入标号为OPR1的分支; 若 R7=4,查表获得分支程序OPR4与表头TAB2的差值OPR4 TAB2,转入标号为OPR4的分支,例程清单采用地址偏移量组成表,JUMP2: MOV DPTR,#TAB2 ; MOV A,R7 ; MOVC A,A+DPTR ; JMP A+DPTR ; TAB2: DB OPR0TAB2 DB OPR1 TAB2 DB OPR2 TAB2

29、DB OPR3 TAB2 DB OPR4 TAB2 ,送表首地址 分支序号送A 根据序号查表,取地址偏移量送A 表首地址地址偏移量形成目标地址,适用条件: 分支子程序入口标号OPRi到表首地址TAB2的偏移量 OPRi TAB2255,(3)采用各分支入口地址组成表,在散转之前,先用查表方法获得表中的转移地址,然后将该地址装入DPTR,最后按DPTR中的内容进行散转。,OPRi TAB2255怎么办?,问题,答:将所要转移的各分支入口地址OPRi (16位),组成一个表。 TAB3: DW OPR0 ; DW OPR1 DW OPRn,(3)采用各分支入口地址组成表,(3)采用各分支入口地址组

30、成表,例 试编程根据R7的内容(即分支序号),转向相应的操作程序段。 若 R7=0,查表获得分支程序OPR0的入口地址,转入标号为OPR0的分支; 若 R7=1,查表获得分支程序OPR1的入口地址,转入标号为OPR1的分支; 若 R7=n,查表获得分支程序OPRn的入口地址,转入标号为OPRn的分支;,例程清单采用各分支入口地址组成表,JUMP3:MOV DPTR,#TAB3 MOV A,R7 ADD A,R7 DADD: MOV R3,A MOVC A,A+DPTR XCH A,R3 INC A MOVC A,A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP A+D

31、PTR TAB3:DW OPR0 ; DW OPRn,;首地址送DPTR ;取分支序号送A ;序号2 ;暂存2倍序号(即索引值) ;取转移地址高8位送A ;转移地址高8位与R3互换 ;2倍序号加1送A(索引值加1) ;查表取转移地址低8位送A ;转移地址低8位送DPL ;转移地址高8位DPH ;A清0 ;按DPTR中的地址进行转移 ;将各分支入口地址定义到表中,例程清单采用各分支入口地址组成表,JUMP3:MOV DPTR,#TAB3 MOV A,R7 ADD A,R7 DADD: MOV R3,A MOVC A,A+DPTR XCH A,R3 INC A MOVC A,A+DPTR MOV

32、DPL,A MOV DPH,R3 CLR A JMP A+DPTR TAB3:DW OPR0 ; DW OPRn,答:这种方法可以实现64KB地址空间的转移; 分支数最大为127。,这种方法可以实现多大地址空间的转移?分支数最大为多少?,问题,例程清单采用各分支入口地址组成表,JUMP3:MOV DPTR,#TAB3 MOV A,R7 ADD A,R7 DADD: MOV R3,A MOVC A,A+DPTR XCH A,R3 INC A MOVC A,A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP A+DPTR TAB3:DW OPR0 ; DW OPRn,答:这

33、种方法可以实现64KB地址空间的转移; 分支数超过128后,加倍后可能会产生进位Cy,分支数超过了127怎么办?,问题,例程清单采用各分支入口地址组成表,JUMP3:MOV DPTR,#TAB3 MOV A,R7 ADD A,R7 JNC NADD INC DPH DADD: MOV R3,A MOVC A,A+DPTR XCH A,R3 INC A MOVC A,A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP A+DPTR TAB3: DW OPR0 ; ,;首地址送DPTR ;取分支序号送A ;序号2 ;暂存2倍序号(即索引值) ;取转移地址高8位送A ;转移地

34、址高8位与R3互换 ;2倍序号加1送A(索引值加1) ;查表取转移地址低8位送A ;转移地址低8位送DPL ;转移地址高8位DPH ;A清0 ;按DPTR中的地址进行转移 ;将各分支入口地址定义到表中,例程清单采用各分支入口地址组成表,JUMP3:MOV DPTR,#TAB3 MOV A,R7 ADD A,R7 JNC NADD INC DPH DADD: MOV R3,A MOVC A,A+DPTR XCH A,R3 INC A MOVC A,A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP A+DPTR TAB3: DW OPR0 ; ,答:分支数最大为256。,

35、分支数最大为多少?,问题,实现方式: 通过ACC或寄存器传递 通过堆栈传递参数 主程序用PUSH将参数压入堆栈; 子程序按栈指针来间接访问,取出参数。 利用数据指针传递参数,4.6子程序调用时的参数传递方法,1、通过ACC或寄存器传递,例:内部RAM区清零 MAIN: MOV R0,#30H MOV R7,#0AH ACALLSUBR SUBR: MOVA,#00H; LOOP: MOVR0,A; INC R0 DJNZ R7,LOOP RET,子程序入口参数: RAM区起始地址R0 RAM区长度R7,2、通过堆栈传递参数,例:内部RAM区清零 MAIN: MOV 70H,#30H MOV 7

36、1H,#0AH ,子程序入口参数: RAM区起始地址70H RAM区长度71H,初始 SP,2、通过堆栈传递参数,例:内部RAM区清零 MAIN: MOV 70H,#30H MOV 71H,#0AH PUSH70H ,子程序入口参数: RAM区起始地址70H RAM区长度71H,初始 SP,SP 栈顶,数据进栈,(70H),2、通过堆栈传递参数,例:内部RAM区清零 MAIN: MOV 70H,#30H MOV 71H,#0AH PUSH70H PUSH71H ,子程序入口参数: RAM区起始地址70H RAM区长度71H,初始 SP,SP 栈顶,数据进栈,(70H),(71H),2、通过堆栈

37、传递参数,例:内部RAM区清零 MAIN: MOV 70H,#30H MOV 71H,#0AH PUSH70H PUSH71H ACALLSUBR (PC): ,子程序入口参数: RAM区起始地址70H RAM区长度71H,初始 SP,SP 栈顶,数据进栈,(70H),(71H),(PC)L,(PC)H,2、通过堆栈传递参数,例:内部RAM区清零 MAIN: MOV 70H,#30H MOV 71H,#0AH PUSH70H PUSH71H ACALLSUBR (PC): SUBR: POPDPH,子程序入口参数: RAM区起始地址70H RAM区长度71H,初始 SP,SP 栈顶,数据出栈,

38、(70H),(71H),(PC)L,(PC)H(DPH),2、通过堆栈传递参数,例:内部RAM区清零 MAIN: MOV 70H,#30H MOV 71H,#0AH PUSH70H PUSH71H ACALLSUBR (PC): SUBR: POPDPH POPDPL,子程序入口参数: RAM区起始地址70H RAM区长度71H,初始 SP,SP 栈顶,数据出栈,(70H),(71H),(PC)H(DPH),(PC)L (DPL ),2、通过堆栈传递参数,例:内部RAM区清零 MAIN: MOV 70H,#30H MOV 71H,#0AH PUSH70H PUSH71H ACALLSUBR (

39、PC): SUBR: POPDPH POPDPL POPR7 POPR0,子程序入口参数: RAM区起始地址70H RAM区长度71H,初始 SP,数据出栈,(PC)H(DPH),(PC)L (DPL ),(71H)( R7 ),(70H)( R0 ),2、通过堆栈传递参数,例:内部RAM区清零 SUBR: POPDPH POPDPL POPR7 POPR0 MOVA,#00H; LOOP: MOVR0,A; INC R0 DJNZ R7,LOOP,子程序入口参数: RAM区起始地址70H RAM区长度71H,30H,39H,00H,00H,. . .,2、通过堆栈传递参数,MAIN: MOV

40、 70H,#30H MOV 71H,#0AH PUSH70H PUSH71H ACALLSUBR (PC): SUBR: POPDPH POPDPL POPR7 POPR0 (清零操作),( DPH )= (PC)H ( DPL )= (PC)L,PUSH DPL PUSH DPH,初始 SP,2、通过堆栈传递参数,MAIN: MOV 70H,#30H MOV 71H,#0AH PUSH70H PUSH71H ACALLSUBR (PC): SUBR: POPDPH POPDPL POPR7 POPR0 (清零操作) PUSH DPL PUSH DPH RET,初始 SP,数据出栈,( PC

41、) (PC)H(PC)L 返回主程序断点处继续执行,2、通过堆栈传递参数完整程序,例:内部RAM区清零 MAIN: MOV 70H,#30H MOV 71H,#0AH PUSH70H PUSH71H ACALLSUBR SUBR: POPDPH POPDPL POPR7 POPR0 MOVA,#00H;,子程序入口参数: RAM区起始地址70H RAM区长度71H,LOOP:MOVR0; INC R0 DJNZ R7,LOOP PUSH DPL PUSH DPH RET,3、利用数据指针传递参数,特点: 待传递的参数紧跟在子程序调用指令的后面.,例:数据表打印 采用主子程序结构: 主程序功能:

42、初始化待传递参数表,以“00H”作为参数表的结束标志 子程序功能:从主程序的参数表中读出数据,并打印 子程序入口参数: 待传递参数表的起始地址DPTR;,MAIN: ACALLPRINT TAB: DBTHIS IS AN EXAMPLE DB0AH,0DH,00H, NEXT: 子程序: SUBR: POPDPH POPDPL PPP1: MOVA,#00H; MOVCA,A+DPTR; INCDPTR JZ PEND PPP2: (打印程序) SJMPPPP1 PEDD: JMPA+DPTR,例程清单,MAIN: ACALLPRINT #TAB : DBTHIS IS AN EXAMPLE

43、 DB0AH,0DH,00H, NEXT: 子程序: SUBR: POPDPH POPDPL PPP1: MOVA,#00H; MOVCA,A+DPTR; INCDPTR JZ PEND PPP2: SJMPPPP1 PEDD: JMPA+DPTR,执行过程,MAIN: ACALLPRINT DBTHIS IS AN EXAMPLE DB0AH,0DH,00H, NEXT: 子程序: SUBR: POPDPH POPDPL PPP1: MOVA,#00H; MOVCA,A+DPTR; INCDPTR JZ PEND PPP2: SJMPPPP1 PEDD: JMPA+DPTR,MAIN: AC

44、ALLPRINT #TAB : SUBR: POPDPH,执行过程,MAIN: ACALLPRINT DBTHIS IS AN EXAMPLE DB0AH,0DH,00H, NEXT: 子程序: SUBR: POPDPH POPDPL PPP1: MOVA,#00H; MOVC A,A+DPTR; INCDPTR JZ PEND PPP2: SJMPPPP1 PEDD: JMPA+DPTR,执行过程,MAIN: ACALLPRINT DBTHIS IS AN EXAMPLE DB0AH,0DH,00H, NEXT: 子程序: SUBR: POPDPH POPDPL PPP1: MOVA,#00

45、H; MOVC A,A+DPTR; INCDPTR JZ PEND PPP2: SJMPPPP1 PEDD: JMPA+DPTR,MAIN: ACALLPRINT #TAB: SUBR: POPDPH POPDPL PPP1: MOVA,#00H; MOVC A,A+DPTR; INCDPTR,执行过程,(DPTR)=#TAB (A)#00H; (A)T; (DPTR) #TAB+1 退出循环的条件: 取出的数据(A)=#00H 取出的数据(A)#00H时: 执行打印程序; 返回继续取数据打印;,MAIN: ACALLPRINT DBTHIS IS AN EXAMPLE DB0AH,0DH,0

46、0H, NEXT: 子程序: SUBR: POPDPH POPDPL PPP1: MOVA,#00H; MOVC A,A+DPTR; INCDPTR JZ PEND PPP2: SJMPPPP1 PEDD: JMPA+DPTR,执行过程,退出循环之后: (DPTR)=#NEXT; (A)=#00H; ;无条件跳转到NEXT处继续主程序,1.通过ACC或寄存器传递 1)方法简单; 2)运算速度快; 3)传递参数个数不可能太多(受寄存器资源个数的限制); 4)传递参数个数不可改; 2.通过堆栈传递参数 1)传递参数个数不可能太多(受堆栈资源的限制); 3.利用数据指针传递参数 1)数据表必须在调用

47、指令之后; 2)适合于大数据量传送的场合。,子程序参数传递方法的特点,第四章作业,第一版:P711、3、4 第二版:P851、3、4,实验一数据区赋初值,实验题目1:内部RAM数据区赋初值 实验原理:采用单一的主程序结构对内部RAM中连续的n各单元赋初值X。 数据区起始地址:30H 数据区长度:n=16 Byte 初值X:01H 实验步骤: 编写源程序并编译、连接; 程序运行前:观察并记录该数据区的初始状态; 程序运行后:观察并记录该数据区的赋值结果; 思考: 修改程序使得30H3FH单元赋初值为00H0FH; 修改程序对外部RAM区3000H301FH单元赋初值为00H1FH; 实验日期:2

48、009-3-4(上午3-4节),工程楼305、402,实验一数据区赋初值,实验题目2:子程序参数传递方式练习 实验原理: 采用主、子程序结构对内部RAM中连续的n各单元赋初值X。 参数传递方法采用寄存器方式。 主程序功能:给子程序设置入口参数 子程序功能:从主程序中接收参数,实现内部RAM中连续的n各单元赋初值X; 入口参数:数据区起始地址(R0)=30H 数据区长度(R2)=16 Byte 初值(R3)=00H,实验一数据区赋初值,实验题目2:子程序参数传递方式练习 实验步骤: 编写源程序并编译、连接; 程序运行前:观察并记录该数据区的初始状态; 程序运行后:观察并记录该数据区的赋值结果; 思考: 采用堆栈方式对内部RAM30H3FH单元赋初值为03H,如何修改程序? 采用堆栈方式对外部RAM3000H300FH单元赋初值为04H,如何修改程序?,实验二I/O口实验,实验题目1:P1口驱动指示灯循环点 实验原理:P1口各个位 值为0时,指示灯亮;为1时,指示灯。 实验接线:P1口8位(P1.0P1.7)分别接指示灯L0L7。 实验现象:在任意时刻只有一个指示灯被点亮,并且从右到左依次循环。,实验二I/O口实验,实验题目1:P1口驱动

温馨提示

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

评论

0/150

提交评论