《应用程序设计》PPT课件.ppt_第1页
《应用程序设计》PPT课件.ppt_第2页
《应用程序设计》PPT课件.ppt_第3页
《应用程序设计》PPT课件.ppt_第4页
《应用程序设计》PPT课件.ppt_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言与简单程序设计,多字节加法多字节减法多字节BCD码加法,4.1运算程序,例4字节无符号数相加。被加数:内部RAM43H,42H,41H,40H单元;加数:内部RAM53H,52H,51H,50H单元。计算两数的和,放在43H,42H,41H,40H单元中。,多字节加法,多字节加法,采用主子程序结构:主程序功能:设置子程序入口参数子程序功能:两个多字节数相加子程序入口参数:加数最低位的起始地址50H;被加数最低位的起始地址40H;加数和被加数的长度4字节;子程序出口参数:和的最低位的起始地址40H,主程序MOVR0,#40H;被加数与和的地址指针MOVR1,#50H;加数地址指针MOVR2,#04H;加数的字节数ACALLJASUB,多字节加法程序,加法子程序JASUB:CLCCJASUB1:MOVA,R0ADDCA,R1;MOVR0,AINCR0INCR1DJNZR2,JASUB1RET,采用主子程序结构:主程序功能:设置子程序入口参数子程序功能:两个多字节数相减子程序入口参数:减数最低位的起始地址50H;被减数最低位的起始地址40H;减数的长度4字节;子程序出口参数:差的最低位的起始地址40H,例4字节无符号数相减,被减数放在内部RAM43H,42H,41H,40H单元,减数放在内部53H,52H,51H,50H单元。计算两数的差,放在43H,42H,41H,40H单元中。,多字节减法程序,主程序MOVR0,#40H;被减数与差的地址指针MOVR1,#50H;减数的地址指针MOVR2,#04H;减数的字节数ACALLJIANSB,多字节减法程序,减法子程序JIANSB:CLCCJIAN1:MOVA,R0SUBBA,R1;MOVR0,AINCR0INCR1DJNZR2,JIAN1RET,主程序MOVR0,40H;被加数与和的地址指针MOVR1,50H;加数地址指针MOVR2,#04H;加数的字节数ACALLJASUB,多字节BCD码加法程序,加法子程序JASUB:CLCCJASUB1:MOVA,R0ADDCA,R1;DAAMOVR0,AINCR0INCR1DJNZR2,JASUB1RET,数据的拼拆数据的转换,4.2数据的拼拆和转换,一、数据的拼拆,例:设20H,21H单元中各有一个8位数据:(20H)=X7X6X5X4X3X2X1X0(21H)=Y7Y6Y5Y4Y3Y2Y1Y0目的:(30H)=Y2Y1Y0X4X3X2X1X0,MOV30H,20HANL30H,#00011111BMOVA,21HSWAPARLA,ANLA,#11100000BORL30H,A,(30H)=X7X6X5X4X3X2X1X0(30H)=000X4X3X2X1X0(ACC)=Y7Y6Y5Y4Y3Y2Y1Y0(ACC)=Y3Y2Y1Y0Y7Y6Y5Y4(ACC)=Y2Y1Y0Y7Y6Y5Y4Y3(ACC)=Y2Y1Y000000(30H)=Y2Y1Y0X4X3X2X1X0,数据的拼拆(续),例:设7CH单元中各有2个BCD码:(20H)=X7X6X5X4X3X2X1X0目的:(21H)=0000X0X1X2X3,CyACCX0a7a6a5a4a3a2a1a0a7a6a5a4a3a2a1a0X0X1a6a5a4a3a2a1a0X0a6a5a4a3a2a1a0X0X1X2a5a4a3a2a1a0X0X1a5a4a3a2a1a0X0X1X2X3a4a3a2a1a0X0X1X2a4a3a2a1a0X0X1X2X30000X0X1X2X3,MOVC,00HRLCAMOVC,01HRLCAMOVC,02HRLCAMOVC,03HRLCAANLA,#00001111BMOV21H,A,数据的拼拆(续),例:设7CH单元中各有一个8位数据:(7C)=X1X0H目的:(R6)=0X1H,(R5)=0X0HMOVR1,#7CHMOVA,#00HXCHDA,R1MOVR5,AMOVA,7CHSWAPAMOVR6,A,R1ACC7CH7CHX1X0H7CH00HX1X0H7CH0X0HX10H7CHX10HX10H7CH0X1HX10H,二、数据的转换,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)=0AH0FH(R2)=00H09H,ASCII:MOVA,R2CLRCSUBBA,#30H;MOVR2,A;SUBBA,#0AH;JCSBIO;XCHA,R2;SUBBA,#07H;MOVR2,ASBIO:RET,1.二进制数与ASCII的相互转换,ASCII:MOVA,R2CLRCSUBBA,#30HMOVR2,ASUBBA,#0AHJCSBIOXCHA,R2SUBBA,#07HMOVR2,ASBIO:RET,三次用到了SUBB指令,都需要提前对Cy清零,为什么只有第一条指令之前有CLRC指令?,问题1,第一条指令SUBBA,#30H执行之后Cy一定为0,因此第二条指令SUBBA,#0AH之前不需要对Cy清零;指令JCSBIO根据Cy产生两个分支,第三条指令SUBBA,#07H处在Cy=0的分支,因此第三条指令SUBBA,#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(Cy)=1(Cy)=0顺序执行直接退出(A)=11H16H(A)=0AH0FH(R2)=0AH0FH(R2)=00H09H,ASCII:MOVA,R2CLRCSUBBA,#30H;MOVR2,A;SUBBA,#0AH;JCSBIO;XCHA,R2;SUBBA,#07H;MOVR2,ASBIO:RET,4.3查表程序,复杂代码转换显示数据补偿:传感器补偿复杂函数计算:Y=SIN(X)查表指令:在51中有两条查表指令:MOVCA,A+DPTRMOVCA,A+PC,yn,y2,y1,Y=SIN(X),xn,x2,x1,X,应用场合:,查表程序举例,例:设一巡回报警系统,对16路输入进行控制,现根据测量路数,找出每路的最大允许值.若大于允许值就报警.,TB3:MOVA,R2;(R2)=015ADDA,R2MOVR3,AADDA,#补偿值?MOVCA,A+PC1XCHA,R32ADDA,#补偿值+1=?1MOVCA,A+PC1MOVR4,A1RETTAB3:DW1520H;第0路报警阈值DW3721H;第1路报警阈值DW,#06H,#03H,表格最大长度的计算:按照第一条MOVC指令:2566=250Byte;按照第二条MOVC指令:2563=253Byte;表格最大长度=250Byte可以同时监测信号路数250/2=125路信号,查表程序举例,例:将上例改为使用DPTR作基址。,TB3:MOVA,R2ADDA,R2MOVR3,AMOVDPTR,#TAB1MOVCA,A+DPTRXCHA,R3INCDPTRMOVCA,A+DPTRMOVR4,ARETTAB3:DW1520H;DW3721H;DW,问题1,如果监测点超过128个或者数据表超过256Byte,怎么办?,表格最大长度=256Byte可以同时监测信号路数256/2=128,数据表格超过256Byte解决办法,问题,如果数据表超过256Byte,怎么办?解决办法1:表中偏移量(A)*2(R2)(R3)表头地址#TAB(DPTR),4)给累加器清零:(A)05)执行查表指令:MOVCA,A+DPTR,一步完成待查数据的偏移量的计算,数据表格超过256Byte解决办法,问题,如果数据表超过256Byte,怎么办?解决办法2:1)表中偏移量(A)*2(R2)(R3)2)表头地址#TAB(DPTR),4)给累加器赋值:(A)(R3)5)执行查表指令:MOVCA,A+DPTR,两步完成待查数据的偏移量的计算,数据表格超过256Byte查表程序举例,例:在一个以MCS-51为核心的温度控制器中,温度传感器输出的电压与温度为非线性关系。传感器输出电压:XHXL(两个字节)(20H)(21H)电压值的取值范围:10位二进制数0XHXL1023温度值的取值精度:两个字节YHYL温度表长度:1024*2=2KByte温度表首地址:#TAB本例的x和y均为双字节无符号数。,数据表格超过256Byte查表程序举例,传感器输出电压:XHXL(两个字节)(20H)(21H)电压值的取值范围:0(20H)(21H)=XHXL1023电压值XiHXiL对应的温度值在表中的偏移量:(20H)(21H)*2(20H)(21H)*2+1,(20H)(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)05)查出温度值高字节YiH:MOVCA,A+DPTR6)给累加器清零:(A)07)数据指针加1:(DPTR)(DPTR)+18)查出温度值低字节YiL:MOVCA,A+DPTR,一步完成待查数据的偏移量的计算,查表操作的几个问题,问题1,如何实现2字节电压值乘以2?,单独使用RLA已经不能解决问题:RLA;(A)(A)*2,前提是(A)7FH解决办法:,查表操作的几个问题,问题1,如何实现2字节电压值乘以2?,设:(20H)=b7b6b5b4b3b2b1b0(21H)=a7a6a5a4a3a2a1a0目的:(20H)=b6b5b4b3b2b1b0a7(21H)=a6a5a4a3a2a1a00两次使用RLCA分步解决问题:,MOVA,21HCLRCRLCAMOV21H,AMOVA,20HRLCAMOV20H,A,CyA,0a7a6a5a4a3a2a1a0a7a6a5a4a3a2a1a00(21H)=a6a5a4a3a2a1a00a7b7b6b5b4b3b2b1b0b7b6b5b4b3b2b1b0a7(20H)=b6b5b4b3b2b1b0a7,查表操作的几个问题,问题2,高字节电压值(20H)乘以2过程中最高位b7数据丢失是否影响查表结果?,设:(20H)=b7b6b5b4b3b2b1b0(21H)=a7a6a5a4a3a2a1a0目的:(20H)=b6b5b4b3b2b1b0a7(21H)=a6a5a4a3a2a1a00,答:不会。2字节电压值取值范围:0(20H)(21H)=XHXL1023乘2之前(20H)(21H)=000000b3b2b1b0a7a6a5a4a3a2a1a0即最高的6bite都为0高字节电压值(20H)乘以2过程中最高位b7数据丢失不会影响查表结果。,数据表格超过256Byte查表例程清单,LTB2:MOVDPTR,#TAB2MOVA,21HCLRCRLCAMOV21H,AXCHA,20HRLCAMOV20H,A,数据表格超过256Byte查表例程清单(续),MOVA,21H;ADDA,DPL;MOVDPL,AMOVA,20HADDCA,DPHMOVDPH,ACLRAMOVCA,A+DPTRMOV22H,AINCDPTRCLRAMOVCA,A+DPTRMOV23H,ARETTAB2:DW,;(20H)(21H)+(DPTR)(DPTR);查第一字节;第一字节存入22H中;查第二字节;第二字节存入23H中;温度值表,查表操作的几个问题,数据表长度=2KByte,超过了256Byte,本例程中采用的解决办法如下:1)表中偏移量(20H)(21H)*2(20H)(21H)2)表头地址#TAB(DPTR),4)给累加器清零:(A)05)执行查表指令:MOVCA,A+DPTR,一步完成待查数据的偏移量的计算,问题3,能否采用另一种解决方法?,查表操作的几个问题,数据表长度=2KByte,超过了256Byte,采用另一种解决办法如下:1)表中偏移量(20H)(21H)*2(20H)(21H)2)表头地址#TAB(DPTR),4)给累加器赋值:(A)(21H)5)查出温度值高字节YiH:MOVCA,A+DPTR6)给累加器赋值:(A)(21H)7)数据指针加1:(DPTR)(DPTR)+18)查出温度值低字节YiL:MOVCA,A+DPTR,问题3,查表操作的几个问题,数据表长度=2KByte,超过了256Byte,采用另一种解决办法的程序清单如下:,问题3,MOVA,20H;(20H)(21H)+(DPTR)(DPTR)ADDA,DPH;MOVDPH,AMOVA,21HMOVCA,A+DPTR;查第一字节MOV22H,A;第一字节存入22H中MOVA,21HINCDPTR;MOVCA,A+DPTR;查第二字节MOV23H,A;第二字节存入23中RET,改为INCA,可以吗?,改为INCA,当恰好(21H)=0FFH时会发生错误,本例中只能为偶数,4.4散转程序,定义:就是用散转指令“JMPA+DPTR”来实现多分支程序的转移。设计步骤:1)在ROM中建立一个散转表表中可以存放无条件转移指令、或各分支入口地址。表中存放的内容不同,所编写的散转程序也就不同。假设各分支入口地址:OPR0:操作程序0OPR1:操作程序1OPRn:操作程序n,设计步骤(续),2)将散转表的首地址送DPTR;3)分支序号送A;4)根据序号查找相应的转移指令或入口地址,从而实现多分支的转移实现方式:(1)采用转移指令组成表(2)采用地址偏移量组成表(3)采用各分支入口地址组成表,(1)采用转移指令组成表,在许多实际应用中,往往要根据某标志单元的内容(键盘输入或运算结果)是0,1,2,n,分别转向操作程序0,操作程序1,操作程序2,操作程序n。可使用转移指令组成表。,TAB1:AJMPOPR0;AJMPOPR1AJMPOPRn,(1)采用转移指令组成表,例试编程根据R7的内容,转向相应的操作程序段。使用转移指令组成表。若R7=0,查表获得指令:AJMPOPR0转入标号为OPR0的分支;若R7=1,查表获得指令:AJMPOPR1转入标号为OPR1的分支;若R7=n,查表获得指令:AJMPOPRn转入标号为OPRn的分支;,多分支程序流程图,例程清单采用转移指令组成表,JUMP1:MOVDPTR,#TAB1;MOVA,R7;ADDA,R7;NOAD:JMPA+DPTR;TAB1:AJMPOPR0;AJMPOPR1AJMPOPRn,送转移表首地址序号送A序号2A(因AJMP指令占2个字节)转入转移表内转移指令组成转移表,例程清单采用转移指令组成表,JUMP1:MOVDPTR,#TAB1;MOVA,R7;ADDA,R7;NOAD:JMPA+DPTR;TAB1:AJMPOPR0;AJMPOPR1AJMPOPRn,最多可以实现多少个分支跳转?即n的取值范围是多少?答:n127,因为没考虑(R7)2256的情况,问题,例程清单采用转移指令组成表,JUMP1:MOVDPTR,#TAB1;MOVA,R7;ADDA,R7;JNCNOADINCDPHNOAD:JMPA+DPTR;TAB1:AJMPOPR0;AJMPOPR1AJMPOPRn,例程清单采用转移指令组成表,JUMP1:MOVDPTR,#TAB1;MOVA,R7;ADDA,R7;JNCNOADINCDPHNOAD:JMPA+DPTR;TAB1:AJMPOPR0;AJMPOPR1AJMPOPRn,送转移表首地址序号送A序号2A转入转移表内转移指令组成转移表此段散转程序适用127n256,例程清单采用转移指令组成表,JUMP1:MOVDPTR,#TAB1;MOVA,R7;ADDA,R7;JNCNOADINCDPHNOAD:JMPA+DPTR;TAB1:AJMPOPR0;AJMPOPR1AJMPOPRn,(2)采用地址偏移量组成表,当分支序号较少,各段程序较短,所有分支程序均处在256字节之内时,可使用地址偏移量组成表。TAB2:DBOPR0TAB2;OPRi:操作程序iDBOPR1TAB2DBOPR2TAB2DBOPR3TAB2DBOPR4TAB2,(2)采用地址偏移量组成表,(2)采用地址偏移量组成表,例试编程根据R7的内容,转向相应的操作程序段。设(R7)=04,使用地址偏移量组成表。若R7=0,查表获得分支程序OPR0与表头TAB2的差值OPR0TAB2,转入标号为OPR0的分支;若R7=1,查表获得分支程序OPR1与表头TAB2的差值OPR1TAB2,转入标号为OPR1的分支;若R7=4,查表获得分支程序OPR4与表头TAB2的差值OPR4TAB2,转入标号为OPR4的分支,例程清单采用地址偏移量组成表,JUMP2:MOVDPTR,#TAB2;MOVA,R7;MOVCA,A+DPTR;JMPA+DPTR;TAB2:DBOPR0TAB2DBOPR1TAB2DBOPR2TAB2DBOPR3TAB2DBOPR4TAB2,送表首地址分支序号送A根据序号查表,取地址偏移量送A表首地址地址偏移量形成目标地址,适用条件:分支子程序入口标号OPRi到表首地址TAB2的偏移量OPRiTAB2255,(3)采用各分支入口地址组成表,在散转之前,先用查表方法获得表中的转移地址,然后将该地址装入DPTR,最后按DPTR中的内容进行散转。,OPRiTAB2255怎么办?,问题,答:将所要转移的各分支入口地址OPRi(16位),组成一个表。TAB3:DWOPR0;DWOPR1DWOPRn,(3)采用各分支入口地址组成表,(3)采用各分支入口地址组成表,例试编程根据R7的内容(即分支序号),转向相应的操作程序段。若R7=0,查表获得分支程序OPR0的入口地址,转入标号为OPR0的分支;若R7=1,查表获得分支程序OPR1的入口地址,转入标号为OPR1的分支;若R7=n,查表获得分支程序OPRn的入口地址,转入标号为OPRn的分支;,例程清单采用各分支入口地址组成表,JUMP3:MOVDPTR,#TAB3MOVA,R7ADDA,R7DADD:MOVR3,AMOVCA,A+DPTRXCHA,R3INCAMOVCA,A+DPTRMOVDPL,AMOVDPH,R3CLRAJMPA+DPTRTAB3:DWOPR0;DWOPRn,;首地址送DPTR;取分支序号送A;序号2;暂存2倍序号(即索引值);取转移地址高8位送A;转移地址高8位与R3互换;2倍序号加1送A(索引值加1);查表取转移地址低8位送A;转移地址低8位送DPL;转移地址高8位DPH;A清0;按DPTR中的地址进行转移;将各分支入口地址定义到表中,例程清单采用各分支入口地址组成表,JUMP3:MOVDPTR,#TAB3MOVA,R7ADDA,R7DADD:MOVR3,AMOVCA,A+DPTRXCHA,R3INCAMOVCA,A+DPTRMOVDPL,AMOVDPH,R3CLRAJMPA+DPTRTAB3:DWOPR0;DWOPRn,答:这种方法可以实现64KB地址空间的转移;分支数最大为127。,这种方法可以实现多大地址空间的转移?分支数最大为多少?,问题,例程清单采用各分支入口地址组成表,JUMP3:MOVDPTR,#TAB3MOVA,R7ADDA,R7DADD:MOVR3,AMOVCA,A+DPTRXCHA,R3INCAMOVCA,A+DPTRMOVDPL,AMOVDPH,R3CLRAJMPA+DPTRTAB3:DWOPR0;DWOPRn,答:这种方法可以实现64KB地址空间的转移;分支数超过128后,加倍后可能会产生进位Cy,分支数超过了127怎么办?,问题,例程清单采用各分支入口地址组成表,JUMP3:MOVDPTR,#TAB3MOVA,R7ADDA,R7JNCNADDINCDPHDADD:MOVR3,AMOVCA,A+DPTRXCHA,R3INCAMOVCA,A+DPTRMOVDPL,AMOVDPH,R3CLRAJMPA+DPTRTAB3:DWOPR0;,;首地址送DPTR;取分支序号送A;序号2;暂存2倍序号(即索引值);取转移地址高8位送A;转移地址高8位与R3互换;2倍序号加1送A(索引值加1);查表取转移地址低8位送A;转移地址低8位送DPL;转移地址高8位DPH;A清0;按DPTR中的地址进行转移;将各分支入口地址定义到表中,例程清单采用各分支入口地址组成表,JUMP3:MOVDPTR,#TAB3MOVA,R7ADDA,R7JNCNADDINCDPHDADD:MOVR3,AMOVCA,A+DPTRXCHA,R3INCAMOVCA,A+DPTRMOVDPL,AMOVDPH,R3CLRAJMPA+DPTRTAB3:DWOPR0;,答:分支数最大为256。,分支数最大为多少?,问题,实现方式:通过ACC或寄存器传递通过堆栈传递参数主程序用PUSH将参数压入堆栈;子程序按栈指针来间接访问,取出参数。利用数据指针传递参数,4.6子程序调用时的参数传递方法,1、通过ACC或寄存器传递,例:内部RAM区清零MAIN:MOVR0,#30HMOVR7,#0AHACALLSUBRSUBR:MOVA,#00H;LOOP:MOVR0,A;INCR0DJNZR7,LOOPRET,子程序入口参数:RAM区起始地址R0RAM区长度R7,2、通过堆栈传递参数,例:内部RAM区清零MAIN:MOV70H,#30HMOV71H,#0AH,子程序入口参数:RAM区起始地址70HRAM区长度71H,初始SP,2、通过堆栈传递参数,例:内部RAM区清零MAIN:MOV70H,#30HMOV71H,#0AHPUSH70H,子程序入口参数:RAM区起始地址70HRAM区长度71H,初始SP,SP栈顶,数据进栈,(70H),2、通过堆栈传递参数,例:内部RAM区清零MAIN:MOV70H,#30HMOV71H,#0AHPUSH70HPUSH71H,子程序入口参数:RAM区起始地址70HRAM区长度71H,初始SP,SP栈顶,数据进栈,(70H),(71H),2、通过堆栈传递参数,例:内部RAM区清零MAIN:MOV70H,#30HMOV71H,#0AHPUSH70HPUSH71HACALLSUBR(PC):,子程序入口参数:RAM区起始地址70HRAM区长度71H,初始SP,SP栈顶,数据进栈,(70H),(71H),(PC)L,(PC)H,2、通过堆栈传递参数,例:内部RAM区清零MAIN:MOV70H,#30HMOV71H,#0AHPUSH70HPUSH71HACALLSUBR(PC):SUBR:POPDPH,子程序入口参数:RAM区起始地址70HRAM区长度71H,初始SP,SP栈顶,数据出栈,(70H),(71H),(PC)L,(PC)H(DPH),2、通过堆栈传递参数,例:内部RAM区清零MAIN:MOV70H,#30HMOV71H,#0AHPUSH70HPUSH71HACALLSUBR(PC):SUBR:POPDPHPOPDPL,子程序入口参数:RAM区起始地址70HRAM区长度71H,初始SP,SP栈顶,数据出栈,(70H),(71H),(PC)H(DPH),(PC)L(DPL),2、通过堆栈传递参数,例:内部RAM区清零MAIN:MOV70H,#30HMOV71H,#0AHPUSH70HPUSH71HACALLSUBR(PC):SUBR:POPDPHPOPDPLPOPR7POPR0,子程序入口参数:RAM区起始地址70HRAM区长度71H,初始SP,数据出栈,(PC)H(DPH),(PC)L(DPL),(71H)(R7),(70H)(R0),2、通过堆栈传递参数,例:内部RAM区清零SUBR:POPDPHPOPDPLPOPR7POPR0MOVA,#00H;LOOP:MOVR0,A;INCR0DJNZR7,LOOP,子程序入口参数:RAM区起始地址70HRAM区长度71H,30H,39H,00H,00H,.,2、通过堆栈传递参数,MAIN:MOV70H,#30HMOV71H,#0AHPUSH70HPUSH71HACALLSUBR(PC):SUBR:POPDPHPOPDPLPOPR7POPR0(清零操作),(DPH)=(PC)H(DPL)=(PC)L,PUSHDPLPUSHDPH,初始SP,2、通过堆栈传递参数,MAIN:MOV70H,#30HMOV71H,#0AHPUSH70HPUSH71HACALLSUBR(PC):SUBR:POPDPHPOPDPLPOPR7POPR0(清零操作)PUSHDPLPUSHDPHRET,初始SP,数据出栈,(PC)(PC)H(PC)L返回主程序断点处继续执行,2、通过堆栈传递参数完整程序,例:内部RAM区清零MAIN:MOV70H,#30HMOV71H,#0AHPUSH70HPUSH71HACALLSUBRSUBR:POPDPHPOPDPLPOPR7POPR0MOVA,#00H;,子程序入口参数:RAM区起始地址70HRAM区长度71H,LOOP:MOVR0;INCR0DJNZR7,LOOPPUSHDPLPUSHDPHRET,3、利用数据指针传递参数,特点:待传递的参数紧跟在子程序调用指令的后面.,例:数据表打印采用主子程序结构:主程序功能:初始化待传递参数表,以“00H”作为参数表的结束标志子程序功能:从主程序的参数表中读出数据,并打印子程序入口参数:待传递参数表的起始地址DPTR;,例程清单,MAIN:ACALLPRINTDBTHISISANEXAMPLEDB0AH,0DH,00H,NEXT:SUBR:POPDPHPOPDPLPPP1:MOVA,#00H;MOVCA,A+DPTR;INCDPTRJZPENDPPP2:(打印程序)SJMPPPP1PEDD:JMPA+DPTR,MAIN:ACALLPRINTDBTHISISANEXAMPLEDB0AH,0DH,00H,NEXT:SUBR:POPDPHPOPDPLPPP1:MOVA,#00H;MOVCA,A+DPTR;INCDPTRJZPENDPPP2:(打印程序)SJMPPPP1PEDD:JMPA+DPTR,(DPTR)=#TAB(A)#00H;(A)T;(DPTR)#TAB+1退出循环的条件:取出的数据(A)=#00H取出的数据(A)#00H时:执行打印程序;返回继续取数据打印;,MAIN:ACALLPRINTDBTHISISANEXAMPLEDB0AH,0DH,00H,NEXT:SUBR:POPDPHPOPDPLPPP1:MOVA,#00H;MOVCA,A+DPTR;INCDPTRJZPENDPPP2:(打印程序)SJMPPPP1PEDD:JMPA+DPTR,退出循环之后:(DPTR)=?;(A)=?;,退出循环返回主程序的原理?,问题1,MAIN:ACALLPRINTDBTHISISANEXAMPLEDB0AH,0DH,00H,NEXT:SUBR:POPDPHPOPDPLPPP1:MOVA,#00H;MOVCA,A+DPTR;INCDPTRJZPENDPPP2:(打印程序)SJMPPPP1PEDD:JMPA+DPTR,退出循环之后:(DPTR)=#NEXT;(A)=#00H;无条件跳转到NEXT处继续主程序,退出循环返回主程序的原理?,问题1,MAIN:ACALLPRINTDBTHISISANEXAMPLEDB0AH,0DH,00H,NEXT:SUBR:POPDPHPOPDPLPPP1:MOVA,#00H;MOVCA,A+DPTR;INCDPTRJZPENDPPP2:(打印程序)SJMPPPP1PEDD:JMPA+DPTR,JZPENDINCDPTR,两条指令交换顺序影响打印效果吗?,问题2,MAIN:ACALLPRINTDBTHISISANEXAMPLEDB0AH,0DH,00H,NEXT:SUBR:POPDPHPOPDPLPPP1:MOVA,#00H;MOVCA,A+DPTR;INCDPTRJZPENDPPP2:(打印程序)SJMPPPP1PEDD:JMPA+DPTR,JZPENDINCDPTR,两条指令交换顺序影响打印效果吗?,问题2,打印不会出错:先判断或先移动指针不会影响打印效果,MAIN:ACALLPRINTDBTHISISANEXAMPLEDB0AH,0DH,00H,NEXT:SUBR:POPDPHPOPDPLPPP1:MOVA,#00H;MOVCA,A+DPTR;INCDPTRJZPENDPPP2:(打印程序)SJMPPPP1PEDD:JMPA+DPTR,JZPENDINCDPTR,两条指令交换顺序影响主程序返回吗?,问题3,MAIN:ACALLPRINTDBTHISISANEXAMPLEDB0AH,0DH,00H,NEXT:SUBR:POPDPHPOPDPLPPP1:MOVA,#00H;MOVCA,A+DPTR;INCDPTRJZPENDPPP2:(打印程序)SJMPPPP1PEDD:JMPA+DPTR,JZPENDINCDPTR,两条指令交换顺序影响主程序返回吗?,问题3,退出循环之后:(DPTR)=#NEXT-1;(A)=#00H;无法正常跳转到主程序,MAIN:ACALLPRINTDBTHISISANEXAMPLEDB0AH,0DH,00H,NEXT:SUBR:POPDPHPOPDPLPPP1:MOVA,#00H;MOVCA,A+DPTR;INCDPTRJZPENDPPP2:(打印程序)SJMPPPP1PEDD:JMPA+DPTR,JZPENDINCDPTR,两条指令交换顺序之后应该怎样修改最后的散转指令?,问题4,SJMPNEXT,MAIN:ACALLPRINTDBTHISISANEXAMPLEDB0AH,0DH,00H,NEXT:SUBR:POPDPHPOPDPLPPP1:MOVA,#00H;MOVCA,A+DPTR;INCDPTRJZPENDPPP2:(打印程序)SJMPPPP1PEDD:JMPA+DPTR,标号PPP1下移一行,循环体不包括A清零的指令会出现什么情况?,问题5,从第二个字符值开始,查表操作的偏移量将由上传所查出的字符的ASCII码值决定。,1.通过ACC或寄存器传递1)方法简单;2)运算速度快;3)传递参数个数不可能太多(受寄存器资源个数的限制);4)传递参数个数不可改;2.通过堆栈传递参数1)传递参数个数不可能太多(受堆栈资源的限制);3.利用数据指针传递参数1)数据表必须在调用指令之后;2)适合于大数据量传送的场合。,子程序参数传递方法的特点,第四章作业,第一版:P711、3、4第二版:P851、3、4,实验一数据区赋初值,实验题目1:内部RAM数据区赋初值实验原理:采用单一的主程序结构对内部RAM中连续的n各单元赋初值X。数据区起始地址:30H数据区长度:n=16Byte初值X:01H实验步骤:编写源程序并编译、连接;程序运行前:观察并记录该数据区的初始状态;程序运行后:观察并记录该数据区的赋值结果;思考:修改程序使得30H3FH单元赋初值为00H0FH;修改程序对外部RAM区3000H301FH单元赋初值为00H1FH;实验日期:2009-3-4(上午3-4节),工程楼305、402,实验一数据区赋初值,实验题目2:子程序参数传递方式练习实验原理:采用主、子程序结构对内部RAM中连续的n各单元赋初值X。参数传递方法采用寄存器方式。主程序功能:给子程序设置入口参数子程序功能:从主程序中接收参数,实现内部RAM中连续的n各单元赋初值X;入口参数:数据区起始地址(R0)=30H数据区长度(R2)=16Byte初值(R3)=00H,实验一数据区赋初值,实验题目2:子程序参数传递方式练习实验步骤:编写源程序并编译、连接;程序运行前:观察并记录该数据区的初始状态;程序运行后:观察并记录该数据区的赋值结果;思考:采用堆栈方式对内部RAM30H3FH单元赋初值为03H,如何修改程序?采用堆栈方式对外部RAM3000H300FH单元赋初值为04H,如何修改程序?,实验二I/O口实验,实验题目1:P1口驱动指示灯循环点实验原理:P1口各个位值为0时,指示灯亮;为1时,指示灯。实验接线:P1口8位(P1.0P1.7)分别接指示灯L0L7。实验现

温馨提示

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

评论

0/150

提交评论