《汇编语言序程设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言序程设计.ppt(53页珍藏版)》请在三一办公上搜索。
1、3.1 汇编语言源程序设计与汇编 3.2 程序计数器和程序运行 3.3 顺序程序设计 3.4 分支程序设计 3.5 循环程序设计 3.6 子程序设计 3.7 常用程序设计,3.1 汇编语言源程序设计和汇编,3.1.1 指令和助记符,指令=操作码+操作数,例如8051做10加20的加法,在程序存储器中需要预先存储2条机器码指令,0111 0100;指令1操作码,把10送入累加器A 0000 1010;指令1操作数,10=00001010B=0AH0010 0100;指令2操作码,累加器A内容加20,结果存于A 0001 0100;指令2操作数,20=00010100B=14H,MOV A,0AH
2、;操作码助记符MOV,操作数助记符累加器A和立即数10ADD A,14H;操作码助记符ADD,操作数助记符累加器A和立即数20,机器语言,汇编语言,手工汇编,机器汇编,1、指令属性,时间属性:指令周期,一条指令执行需要一定的时间。,1机器周期指令、2机器周期指令和4机器周期指令,空间属性:在ROM存放占用的单元数,即指令的字节数。,1字节指令、2字节指令和3字节指令,功能属性:指令完成的功能。,算术运算类指令、逻辑运算类指令、移位类指令等,2、指令的字节数(空间属性),单字节指令,双字节指令,三字节指令,操作码1字节,无操作数或者操作数是寄存器寻址 或,操作码1字节,操作数1字节。,操作码1字
3、节,操作数2字节。,3.1.2 伪指令,伪指令虽然具有类似指令的形式,但不是真正的指令,不会产生任何可供机器直接执行的机器码。伪指令用来对汇编过程进行控制,是编程员发给汇编程序的命令,也称为汇编命令或汇编程序控制命令。,1、起始汇编伪指令ORG(Origin)ORG 16位地址用来规定源程序或者数据块在程序存储器的起始地址。注意地址从小到大排列,不同的程序段不可彼此覆盖。2、结束汇编伪指令END END 表示源程序到此结束。在一个源程序中只允许出现一条END语句,而且必须安排在源程序的末尾,汇编器对END语句后的所有语句都不进行汇编。3、赋值伪指令EQU(Equate)字符名称EQU赋值项其中
4、赋值项可以是常数、地址、标号或者是表达式,以8位或16位二进制数存放。汇编程序自动把EQU右边的赋值项赋给左边的字符名称。一旦字符名称被赋值它就可以在程序中作为数据或地址来多次使用。必须先赋值再使用,故该语句常放在程序开头。,3.1.2 伪指令,4、位地址赋值伪指令BIT 字符名称 BIT 位地址把BIT右边的位地址或位名称赋给左边的字符名称。因此BIT语句定义的字符名称是此位地址的别称。5、定义空间伪指令DS(Define Storage)标号:DS 表达式DS从指定的地址单元开始,保留由表达式指定的若干字节空间作为备用空间,空间大小由DS语句中表达式决定。同DB一样,DS伪指令只能用于程序
5、存储器。,ORG1000HDS 08H;从1000H开始保留8字节的存储空间备用DB 71H,13H,11H;数据表从1008H开始存放经汇编后从1000H单元开始保留8个字节的存储单元,而从1008H单元开始连续存放71H、13H和11H等数据。,3.1.3 汇编语句格式,标号:操作码 操作数1,操作数2,操作数3;注释 1、标号标号是语句地址的标志符号,它由18个ASCII字符组成,可以是字母、数字和一些特定字符,英文字母开头,冒号结束。为了避免把标号中字符当作指令来汇编,用户在编写自己的程序时绝对不应采用指令、寄存器名以及伪指令等作为语句的标号,而且同一标号在一个程序中只能定义一次。对每
6、一条语句而言,标号不是必选的,标号的有无取决于程序中有无其它语句访问该语句,一般用于转移程序的首地址。2、操作码操作码是汇编指令格式中唯一不能空缺的部分,可分为指令性语句和指示性语句两类。(1)指令性语句指令性语句是指采用指令助记符构成的汇编语言语句,8051单片机中的指令性语句是指111条指令的助记符语句。因此,指令性语句是汇编语言语句的主体。每条指令性语句都有与之对应的机器码供CPU识别和执行。如前述及的MOV、ADD、SETB、CLR等。(2)指示性语句指示性语句又称为伪指令语句,不会产生任何可供CPU识别和执行的机器码,只是用来对汇编过程进行某种控制。,3.1.3 汇编语句格式,标号:
7、操作码 操作数1,操作数2,操作数3;注释 3、操作数 指令执行时涉及到的数据或者数据的地址。它与操作码以空格分界,两操作数或三操作数时以逗号分开,可以是十进制数、二进制数(B)、十六制数(H)、ASCII码()、寄存器名、存储器地址、位地址以及变量标识符等。,16位地址ROM:,A+DPTR,A+PC,16位地址片外RAM:,DPTR,8位地址片内RAM:,direct(8位字节地址),Ri,寄存器(8位):,A,Rn,AB,数值:#data,#data16 只能作为源操作数,寄存器(16位):DPTR,位操作(1位):C(寄存器寻址),bit(8位位地址),其他:addr16,addr11
8、,rel(地址相对偏移量),4、注释 对语句在程序中完成的功能加以解释,“;”分号开头,不会被汇编程序理解为指令,数据传送类,片内RAM与寄存器传送操作,特点:数据的复制操作,目的与源看齐且等宽。,MOV 目的操作数,源操作数,大部分指令操作数在片内RAM和寄存器,字节操作。,访问片内RAM:,direct,Ri,寄存器:,A,Rn,立即数:#data,A,Rn,direct,Ri,A,Rn,direct,Ri,#data,1、立即寻址不能做目的操作数2、工作寄存器不能在两边同时出现,算术运算类,算术运算指令按照8位2进制运算法则运算,程序员负责按照程序的要求负责解释。,注意:运算对状态标志位
9、的影响。PSW的CY(C)、AC、OV,单字节加法 ADD A,,多字节加法(ADD with Carry)ADDC A,,Rn,direct,Ri,#data,多字节减法(Subtraction with Borrow 带借位减法)SUBB A,,BCD码加法(Decimal Adjust 十进制调整指令),DA A,;硬件对BCD码加法结果修正,过9补6,注意:此指令使用时紧跟在ADD和ADDC指令后,对BCD码加法结果进行自动修正,CLR CSUBB A,,单字节减法,自增自减,自增 Increment with constant 1,实现操作数自身内容的加1或减1操作,不影响标志位状态
10、。,自减 Decrement with constant 1,INC A,Rn,direct,Ri,DPTR,DEC A,Rn,direct,Ri,注意:自增自减操作常用于地址变量(指针)内容的更新,数据指针只有自增操作。,例3-4 多字节加法程序。设被加数存放在:40H(高字节),41H,42H(低字节)。加数存放在:43H(高字节),44H,45H(低字节)。运算结果仍存在被加数单元中,片内RAM双指针R0,R1,片外RAM单指针DPTR,变址A,例3-4 多字节加法程序。设被加数存放在:40H(高字节),41H,42H(低字节)。加数存放在:43H(高字节),44H,45H(低字节)。运
11、算结果仍存在被加数单元,ORG 0030HMOVR0,#42H;地址指针0指向被加数MOVR1,#45H;地址指针1指向加数MOVA,R0;取被加数低字节ADDA,R1;与加数低字节相加MOVR0,A;结果回存入被加数单元DECR0;地址指针0指向被加数中字节DECR1;地址指针1指向加数中字节MOVA,R0;取被加数中字节ADDCA,R1;与加数中字节及进位位相加MOVR0,A;结果回存入被加数单元DECR0;地址指针0指向被加数高字节DECR1;地址指针1指向加数高字节MOVA,R0;取被加数高字节ADDCA,R1;与加数高字节及进位位相加MOVR0,A;结果回存入被加数单元 END,累加
12、器A清零 Clear accumulator,CLR A,累加器A按位求反 Complement accumulator,CPL A,例3-2、设有16位二进制数存放在R0、R1中,其中R0存放高8位,R1存放低8位。编程实现其求反再加一运算,结果送原址。,ORG 0030HMOVA,R1;取低字节入ACPLA;对低字节求反ADDA,01H;加1MOVR1,A;存结果到原址MOVA,R0;取高字节入ACPL A;对高字节求反ADDCA,00H;加可能产生的低字节对高字节的进位MOVR0,A;存结果到原址SJMP$;原地踏步 END,累加器A循环左移 Rotate Left,RL A,8位的循环
13、移位器。,如果a7=0左移一位相当于原数乘2,SWAP A,累加器A循环右移 Rotate Right,RR A,8位的循环移位器。,累加器A高低4位互换 SWAP,如果a0=0右移一位相当于原数除以2,累加器A带进位位的循环左移 Rotate Left through Carry,RLC A,9位的循环移位器。,累加器A带进位位的循环右移 Rotate Right through Carry,RRC A,9位的循环移位器。,例、片内RAM40H、41H单元存放着16个单字节AD转换值的和,求其算术平均值。,(40H和的高字节,41H和的低字节,不考虑余数),CLR CMOV A,40HRRC
14、 AMOV 40H,AMOV A,41HRRC AMOV 41H,A,逻辑运算类,按位与AND Logical:,ANL A,,Rn,direct,Ri,#data,“遇1保持,遇0复位”。常用于某些特定位的强迫复位(与“0”与),其余位状态不改变(与“1”与)。,按位或OR Logical:,ORL A,,“遇0保持,遇1置位”。常用于某些特定位的强迫置位(与“1”或),其余位状态不改变(与“0”或)。,按位异或eXclusive-OR Logical:,XRL A,,“相同为0,相异为1”。常用于某些特定位的求反(与“1”异或),其位状态不改变(与“0”异或)。,例、片内RAM40H、41
15、H单元存放着16个单字节AD转换值的和,求其算术平均值。,(40H和的高字节,41H和的低字节,不考虑余数),MOV A,40HSWAP AMOV R2,A;暂存备拆分 ANL A,#0FH;高四位清零MOV 40H,AMOV A,R2 ANL A,#0F0HMOV R2,A;暂存MOV A,41HSWAP AANL A,#0FHORL A,R2MOV 41H,A,拆,合,;A,;A,;A,3.2 程序计数器PC和程序运行,3.2.1 程序计数器PC(Program Counter),PC(Program Counter):程序计数器。16位的寄存器,存放的是ROM地址,起始地址:0000H
16、第一条指令地址,形成下一条要执行指令的地址:,自动加1:取指令的1个字节加1,新地址直接替换:转移类指令,从程序存储器某地址取指令,分析指令(译 码),执行指令,形成下一条要执行指令的地址,起始地址,3.2.2 简单程序运行,PC=0100H,PC=0102H 取指7A23译码执行 PC=0104H,PC=0104H 取指7B24译码执行 PC=0106H,PC=0106H 取指7C25译码执行 PC=0108H,PC=0108H 取指7D26译码执行 PC=010AH,PC=010AH 取指2A译码执行 PC=010BH,PC=010BH 取指2B译码执行 PC=010CH,PC=010CH
17、 取指2C译码执行 PC=010DH,PC=010DH 取指2D译码执行 PC=010EH,PC自动加1后形成的值称PC当前值能保证按照指令排列顺序执行程序,取指7400译码执行,PC=0102H,0100H,0102H,0104H,0106H,0108H,010AH,010BH,010CH,010DH,MOV A,#00H,MOV R2,#23H,MOV R3,#24H,MOV R4,#25H,MOV R5,#26H,ADD A,R2,ADD A,R3,ADD A,R4,ADD A,R5,74,00,7A,23,7B,24,7C,25,7D,26,2A,2B,2C,2D,ORG 0100H,
18、END,MAIN:,标号是语句地址的标志符号,010EH,3.3 顺序程序设计,顺序程序的特点是程序执行时,每一条指令都被执行一次(有别于分支程序)且仅一次(有别于循环程序)。计算机在执行这类程序时只需按照指令排列的先后顺序依次执行,中间不会产生任何分支,故又称为无分支程序或简单程序(不含有转移指令)。,例3-3 在实际压力测量系统中通过A/D转换器得到8位无符号二进制数测量值存于累加器A中。把A中的二进制数测量值转换为3位BCD码,并以压缩BCD码形式存放在地址40H、41H单元中。,解题思路:8位二进制数3位BCD码,例如A=1111 0101B 转换,求百位数,求十位数,求个位数,除以1
19、00得到的商,DIV AB,余数除以10得到的商,除以10得到的余数,DIV AB,0 百,0 十,0 个,合成一字节,十 0,0 个,SWAP A,ORL A,,十 个,ORG 0030H;百位数MOVB,100;除数100送BDIVAB MOV40H,A;十位数和个位数MOVA,B;第一次除法余数;做第二次除法被除数MOVB,#10;除数10送B,例3-3 在实际压力测量系统中,通过A/D转换器得到8位二进制数测量值,存于A中。利用除法指令把累加器A中的二进制数测量值转换为3位BCD码,并以压缩BCD码形式存放在地址40H、41H单元中。,1111 0101,0110 0100,0010
20、1101,0000 0010,0000 0010,0010 1101,0000 1010,0100 0101,0100 0101,ORG 0030H;百位数MOVB,100;除数100送BDIVAB MOV40H,A;十位数和个位数MOVA,B;第一次除法余数;做第二次除法被除数MOVB,#10;除数10送BDIVAB;合SWAPA ORLA,B;组成压缩BCD码MOV41H,A END,例3-3 在实际压力测量系统中,通过A/D转换器得到8位二进制数测量值,存于A中。利用除法指令把累加器A中的二进制数测量值转换为3位BCD码,并以压缩BCD码形式存放在地址40H、41H单元中。,0010 1
21、101,0000 1010,0000 0010,0000 0100,0000 0101,0100 0000,3.3 顺序程序设计,例3-3 在实际压力测量系统中,通过A/D转换器得到8位二进制数测量值,存于A中。利用除法指令把累加器A中的二进制数测量值转换为3位BCD码,并以压缩BCD码形式存放在地址M1、M2单元中。,赋值伪指令EQU(Equate)字符名称EQU赋值项 其中赋值项可以是常数、地址、标号或者是表达式,以8位或16位二进制数存放。汇编程序自动把EQU右边的赋值项赋给左边的字符名称。一旦字符名称被赋值它就可以在程序中作为数据或地址来多次使用。必须先赋值再使用,故该语句常放在程序开
22、头。,BUFFER EQU 30H,MOV A,#BUFFER,MOV B,BUFFER,MOV A,#30H,;BUFFER做立即数使用,MOV B,30H,;BUFFER做地址使用,;先定义,M1 EQU 30H;赋值伪指令,M1=30HM2 EQU 31H ORG 0030HMOVB,64H;除数100送BDIVAB;得BCD百位数于AMOVM1,A;BCD百位数存于M1中,M1作为地址使用MOVA,0AH;取除数10XCHA,B;第一次余数与第二次除数交换DIVAB;得存A的BCD十位数和存B的BCD个位数SWAPA;十位数存于A的高4位ADDA,B;组成压缩BCD码MOVM2,A;压
23、缩BCD码存M2 END,3.2.2 简单程序运行,PC=0100H,PC=0102H 取指7A23译码执行 PC=0104H,PC=0104H 取指7B24译码执行 PC=0106H,PC=0106H 取指7C25译码执行 PC=0108H,PC=0108H 取指7D26译码执行 PC=010AH,PC=010AH 取指2A译码执行 PC=010BH,PC=010BH 取指2B译码执行 PC=010CH,PC=010CH 取指2C译码执行 PC=010DH,PC=010DH 取指2D译码执行 PC=010EH,PC自动加1后形成的值称PC当前值能保证按照指令排列顺序执行程序,取指7400译码
24、执行,PC=0102H,0100H,0102H,0104H,0106H,0108H,010AH,010BH,010CH,010DH,MOV A,#00H,MOV R2,#23H,MOV R3,#24H,MOV R4,#25H,MOV R5,#26H,ADD A,R2,ADD A,R3,ADD A,R4,ADD A,R5,74,00,7A,23,7B,24,7C,25,7D,26,2A,2B,2C,2D,ORG 0100H,END,MAIN:,010EH,0000H,3.4 分支程序设计,程序要求改变执行顺序,特点是含有控制转移类指令(转移目的地址替换PC当前值),无条件转移指令,1、长转移指令
25、LJMP:Long Jump,LJMP addr16,;,PCPC+3 PC当前值,PCaddr16 程序实现转移,转移范围:任意16位地址,即64KB空间。,ORG 0030H,MAIN:,ORG 0000H,LJMP 0030H,ORG 0000H,LJMP MAIN,常用标号代替addr16,程序员只需在要跳转到的,汇编语句前加标号,由汇编器负责计算。,LJMP,3.2.2 简单程序运行,1、PC=0000H 取指020100译码执行 PC=0003H 目的地址0100H装入PC替换掉当前值,程序转移,2、PC=0100H 取指7400译码执行 PC=0102H,3、PC=0102H 取
26、指7A23译码执行 PC=0104H,4、PC=0104H 取指7B24译码执行 PC=0106H,5、PC=0106H 取指7C25译码执行 PC=0108H,6、PC=0108H 取指7D26译码执行 PC=010AH,7、PC=010AH 取指2A译码执行 PC=010BH,8、PC=010BH 取指2B译码执行 PC=010CH,9、PC=010CH 取指2C译码执行 PC=010DH,10、PC=010DH 取指2D译码执行 PC=010EH,LJMP MAIN,MAIN=0100H,02 01 00,3.4 分支程序设计,无条件转移指令,2、绝对转移指令AJMP:Absolute
27、Jump,AJMP addr11,机器码,;,PCPC+2 PC当前值,PCPC当前值高五位+addr11,或,AJMP,转移范围:高五位不变的任意11位地址,,按照地址的高五位分成32页(每页2KB),,即2KB空间。其相当于把64KB的ROM空间,只能在当前页中跳转。,3.2.2 简单程序运行,1、PC=0000H 取指2100译码执行 PC=0002H 目的地址=0000 0001 0000 0000B=PC,转移,2、PC=0100H 取指7400译码执行 PC=0102H,3、PC=0102H 取指7A23译码执行 PC=0104H,4、PC=0104H 取指7B24译码执行 PC=
28、0106H,5、PC=0106H 取指7C25译码执行 PC=0108H,6、PC=0108H 取指7D26译码执行 PC=010AH,7、PC=010AH 取指2A译码执行 PC=010BH,8、PC=010BH 取指2B译码执行 PC=010CH,9、PC=010CH 取指2C译码执行 PC=010DH,10、PC=010DH 取指2D译码执行 PC=010EH,11、PC=010EH 取指80FE译码执行 PC=0110H 目的地址=0110H+0FEH=010E H,转移,3.4 分支程序设计,3.4.1 无条件转移指令,3、短转移指令和相对寻址方式SJMP:Short Jump,SJ
29、MP rel,或,SJMP,机器码,PCPC+2,PC当前值,PCPC当前值+rel,转移范围:,转移目的地址PC当前值+rel,rel是8位符号数(补码),因此转移范围(PC当前值128)(PC当前值+127),rel转移目的地址PC当前值补,=转移目的地址(PC+指令字节数)补,PC是转移指令首字节地址,;80rel rel是8位符号数(补码),相对寻址方式,机器汇编只需在指令写出要转移到语句的标号,由汇编器自动计算相对偏移量。,原地踏转指令 SJMP$,原地踏转指令一般用于程序结束处,实现原地踏步效果,,原地踏转指令rel计算:,rel$($+2)补2补0FEH,$表示所在指令的ROM地
30、址。,HERE:SJMP HERE,这类指令在执行过程中需要判断某种条件是否满足而决定要不要转移的指令。若满足条件就转移,否则程序顺序执行。这类指令无一例外的都是相对寻址方式。,3.4.2 条件转移指令,1、累加器A状态转移指令,JZ,JNZ,JZ:Jump if A is Zero,JNZ:Jump if A is Not Zero,2、累加位C状态转移指令,JC:Jump if C is set,JNC:Jump if C is Not set,JC,JNC,例、编程比较50H和51H单元内容,相等F0(PSW.5)0,否则F01.,分析:可以使用异或指令或者带借位减法指令;通过判断运算结
31、果A是否为零来,判断两个数是否相等。,CLR F0;相等处理,SETB F0;不相等处理,ORG 0030H,MOV A,51H,XRL A,50H;异或运算,START:,JNZ L0;不相等转移去标号L0处,ORG 0000H,LJMP START,;if A!=0,即两数不相等,SJMP$,SJMP$,L0:,SETB F0,CLR F0,ORG 0030H,MOV A,51H,XRL A,50H,START:,JZ L0,ORG 0000H,LJMP START,;if A=0,即两数相等,SJMP$,;else,两数不相等,SJMP$,L0:,;取51H单元内容,END,END,;e
32、lse,两数相等,3.4.2 条件转移指令,3、bit位状态转移指令,JB:Jump if Bit is set,JNB:Jump if Bit is Not set,JBC:Jump if Bit is set and Clear bit,JB bit,,JNB bit,,JBC bit,,4、比较不等转移指令,CJNE:Compare and Jump if is not Equal,CJNE A,#data,,CJNE Rn,#data,,CJNE Ri,#data,,CJNE A,direct,,例3-5 判断2个16位无符号数A、B的大小。A存放在片内RAM的40H、41H单元,B存
33、放在50H、51H单元中。当AB时,将内部RAM的42H单元内容清0;否则,将该单元内容置1。试编写实现此功能的程序。,ORG0030H MAIN:MOV R0,00H;建立AB标志 MOV A,40H;取A高字节 CJNE A,50H,LOOP2;与B高字节比较;若AB,转移至LOOP2 MOV A,41H;取A低字节 CJNE A,51H,LOOP2;与B低字节比较;若AB,转移至LOOP2 SJMP LOOP3;若A=B,转移至LOOP3LOOP2:JNC LOOP4;若AB,转移至LOOP4LOOP3:MOV R0,0FFH;建立AB标志LOOP4:MOV 42H,R0;存标志 SJM
34、P$END,3.5 循环程序设计,特殊的分支结构,含有重复执行多遍的指令。,在一个循环程序结构包含4个部分:,循环变量设置。在循环开始时,往往需要定义一个循环变量(例如循环次数计数,器,地址指针等),并且给它设置一个初始值。,循环体。要求重复执行的程序段,即循环程序的主体部分。,循环变量修改。修改循环变量的值,为下一次循环准备条件。,循环控制。根据循环结束的条件,判断是否跳出循环。,3.5 循环程序设计,计数控制循环(循环次数已知),常用先执行后判断结构。,减一非零转移指令DJNZ:Decrement and Jump if is Not Zero.,DJNZ Rn,,DJNZ direct,
35、,此指令专用于计数控制循环,Rn和direct作为减一计数的循环计数器。,例3-6 编写一个程序,清空16个数据存储单元,数据存储单元的开始地址是60H。ORG0030H CLR A;A=0 MOV R1,#60H;建立地址指针R1=60H MOV R2,#16;计数器赋初值R7=16AGAIN:MOVR1,A;通过指针将各单元清0 INC R1;指针调整 DJNZR2,AGAIN SJMP$;原地踏步,停机 END,3.2.3 循环程序运行,例3-7 计算从片内RAM的50H单元开始的10个BCD数的累加和。ORG 0000H LJMP MAIN ORG 0030HMAIN:MOVR3,00
36、H;清累加和的高位 MOVR4,00H;清累加和的低位 MOVR2,10;循环计数器初值 MOVR0,50H;指针指向50H单元 MOVA,R4;取累加和低字节 ADDA,R0;累加和低字节相加 DAA;BCD数调整 JNCNEXT;如果无进位,则转移到NEXT INCR3;如有进位,高字节加1NEXT:INCR0;修改指针,指向新的单元 DJNZR2,LOOP;判断是否累加完毕 MOVR4,A;存累加和低位 SJMP$;停机 END,LOOP:,3.5 循环程序设计,例3-8 将片内RAM 20H单元数据中的 1的个数统计出来。结果存20H单元。ORG 0030HMAIN:MOVR1,00H
37、;1的计数单元清0 MOVR2,08H;循环计数器置初值 MOVA,20H;取数据LOOP:RLCA;左移一位,待判定位移入C JNCNEXT;如果进位位为0,则转移到NEXT INCR1;如进位位为1,计数单元加1 NEXT:DJNZR2,LOOP;判断是否判断完毕 MOV20H,R1;存计数结果 SJMP$;停机 END,3.6 子程序结构,完成某一专用任务并能为其他程序反复调用的程序段称为子程序,调用子程序的,程序称为调用程序或主程序。,调用与返回,1、调用指令:,保存断点地址,提供子程序人口地址,长调用指令LCALL:Long Call,LCALL addr16,机器码,或,LCALL
38、,;12addr16,SP=SP+1*SP=PC70,PC=PC+3 断点地址,SP=SP+1*SP=PC158,调用范围:全部ROM的64KB空间。,例、下列程序执行到LCALL指令(地址0100H)后,求断点地址,以及堆栈的值。,MOV SP,#60H,LCALL SQUR,断点地址:,0100H+30103H,SP62H,(61H)03H,(62H)01H,PC=addr16转向子程序入口地址,3.6 子程序结构,调用与返回,2、返回指令:,恢复堆栈保存的断点地址,程序转回断点地址处继续执行主程序。,返回指令RET:return,RET,;,PCPC+1,PC158*SP SPSP-1,
39、PC70*SP SPSP-1,参数传递,主程序,子程序,入口参数,主程序,子程序,出口参数,双方共同约定的寄存器或某存储单元,堆栈,(共享资源)现场保护和现场恢复,主程序在运行过程中使用了一些寄存器来存放临时数据(或中间结果),在子程序,运行过程中有时也要用到这些寄存器,为了避免对主程序还有用的临时数据被子程序覆,盖掉,就要设法保护这些临时数据,保护的过程称为现场保护。在执行完子程序返回主,程序时,还要恢复这些数据,称为现场恢复。常使用堆栈进行现场保护和恢复。,PUSH ACC,PUSH B,PUSH PSW,POP PSW,POP B,POP ACC,;现场保护,;现场恢复,注意顺序,子程序
40、完整结构,现场保护,取入口参数,子程序功能,送出口参数,现场恢复,返回主程序RET,注意:在一些简单程序设计中,如果,主程序和子程序并没有共享资源,可以,省略现场保护和现场恢复。,远程查表指令 MOVC A,A+DPTR,1、简单单字节表,项数与所计算的数是线性对应的关 系,首地址送DPTR,项数送A,执行远程查表指令MOVC A,A+DPTR,3.7 常用子程序设计,一、查表子程序设计,数据表每项一字节,,每项地址数据表首地址+项数,ORG 0200HTABLE:DB0,1,4,9,16,25 DB 36,48,64,81,例3-12 用子程序调用的方法实现,其中a、b均小于10,a、b、c
41、存放在片内RAM的30H、31H和32H单元中。入口参数:A(项数)出口参数:A(结果),VAL1 EQU30H VAL2 EQU31HRESULT EQU32H ORG 0040HMAIN:MOVA,VAL1;准备入口参数LCALL SQR;调用子程序 MOVB,A;取出口参数MOVA,VAL2LCALLSQRADDA,BMOVRESULT,ASJMP$,ORG 0100HSQR:MOVDPTR,TABLE MOVCA,A+DPTR RET ORG 0200HTABLE:DB0,1,4,9,16,25 DB 36,48,64,81 END,3.7 常用子程序设计,例3-13 已知R0低4位有
42、1位16进制数(0F中的一个),请将其转换成相应的ASCII码。入口参数:R0(所查数据在数据表的项数)。出口参数:R0(转换后的ASCII值)。,ORG 0100HHEX2A:MOVA,R0;读入口参数 ANLA,0FH;屏蔽高4位 ADDA,;地址调整 MOVCA,A+PC;近程查表指令 MOVR0,A;送出口参数 1字节指令 RET;子程序返回 1字节指令ASTAB:DB 0,1,2,3,4,5,6,7 DB 8,9,A,B,C,D,E,F,3.2.4 子程序运行,断点地址0106H压入堆栈,并将010BH放进PC中,程序转移到010BH处执行延时子程序。子程序执行到返回命令RET后,将
43、堆栈中的0106H弹出到PC中,返回主程序继续执行。,FA,31 0B,二、散转程序设计并行多分支程序,根据某个值,分别转向各个不同处理程序,散转指令JMP,JMP A+DPTR,由于各个分支处理程序长度不一,把各个分支处理程序的转移指令按序编制成转移指令表(转移指令必须相同),用类似查表方式获得转移指令的地址,使程序先转向转移指令,然后再由不同的转移指令实现向各个分支处理程序的散转。如能实现128个分支的转移指令表:BRTAB:AJMPROUT0 AJMPROUT1 AJMPROUT127,转移指令地址转移指令表首地址+分支数 字节数,;PCPC+1,;PCA+DPTR 转移,3.7 常用子
44、程序设计,例3-14 设R0中为转移分支数(项数),实现程序散转。FPRO:MOVDPTR,BRTAB;送转移指令表首地址 MOVA,R0;送分支数 RLA;分支数乘2 JMPA+DPTR;散转指令BRTAB:AJMPROUT0;转移指令表(标号BRTAB转移指令表;首地址)转向分支0 AJMPROUT1;转向分支1 AJMP ROUT127;转向分支127 ROUT0:;分支0处理程序ROUT1:;分支1处理程序ROUT127:;分支127处理程序,例3-15 一个16键的行列式键处理程序中,每按下一个键后会得到相应的键号存放在累加器A中,设16个键键号为00H0FH,每键的处理程序不同。试
45、编制相应的键盘散转程序。FKEY:MOVDPTR,KPRG;送转移指令表首地址 MOVB,03H MULAB;项数乘字节数(LJMP是3字节指令)JMPA+DPTR;程序散转KPRG:LJMPKPRG0;长转移到0号键键处理程序 LJMPKPRG1 LJMPKPRG15KPRG0:;0号键键处理程序KPRG1:;1号键键处理程序KPRG15:;15号键键处理程序,三、代码转换程序设计例3-16 单字节压缩BCD码转换成二进制码子程序。入口参数:待转换的BCD码存于R2。出口参数:转换结果(8位无符号二进制整数)仍存R2。,ORG 2000HBCD2B:MOVA,R2;A(d1 d0)BCD A
46、NLA,0F0H;取高位BCD码d1,A=d1 0H SWAPA;A=0 d1H MOVB,0AH;B10 MULAB;d110 MOVR3,A;R3暂存乘积结果 MOVA,R2;A(d1 d0)BCD ANLA,0FH;取低位BCD码d0,A=0 d0H ADDA,R3;d110+d0 MOVR2,A;送出口参数 RET;子程序返回,三、代码转换程序设计例3-17 将20H单元中BCD数转换成两位ASCII字符存于21H(高位)、22H(低位)单元中。入口参数:待转换的BCD码存于20H单元。出口参数:转换结果存21H(高位)、22H(低位)单元中。,ORG0500HBCD2AS:MOVR0
47、,#22H;设置结果单元 MOVR0,#00H;清零 MOV A,20H;20H中BCD数送A XCHD A,R0;低位BCD数至22H ORL22H,#30H;完成低位BCD数转换 SWAP A;高位BCD数送低4位 ORLA,#30H;完成高位BCD数转换 MOV 21H,A;存入21H单元 RET,lVBO:MOVR0,#40H MOV4AH,#00 MOV4BH,#00 CLRC MOVA,4AH ADDA,R0;求低字节和 MOV4AH,A MOVA,4BH ADDCA,#00;存进位位,高字节 MOV4BH,A INCR0 CJNER0,#48H,LOOP;若数据未处理完则转移 M
48、OVR2,#3;右移三次,相当于除8 ACALL RRLOOP RET,五、算术运算程序设计例3-20 试计算片内RAM区40H47H八个单元中数的算术平均值,结果存放在4AH(低字节)、4BH单元中(高字节)。,右移n位子程序,入口参数R2:CLR C MOV A,4BH RRC A MOV 4BH,A;高字节 MOV A,4AH RRC A MOV 4AH,A;低字节 DJNZ R2,RRLOOP RET,LOOP:,RRLOOP:,六、延时子程序设计,指令的时间属性:机器周期数,每条指令执行都有其固定的时间。,典型的循环结构,通过执行一个具有固定运行时间的循环体实现延时。,空操作指令NO
49、P:No Operation,NOP,;,PC=PC+1,等待一个机器周期,例、设计延时100ms子程序(单片机晶振分别为6MHz,12MHz),1、6MHz单片机,每机器周期2us,2、12MHz单片机,每机器周期1us,10000022250100,10000041250100,DJNZ R2,$,MOV R2,#250,DJNZ R3,LOOP,LOOP:,MOV R3,#100,DEL100:,RET,;2机器周期,DJNZ R2,LOOP1,NOP,NOP,MOV R2,#250,LOOP1:,DJNZ R3,LOOP2,LOOP2:,MOV R3,#100,DEL100:,RET,;1机器周期,;1机器周期,;2机器周期,