1、单片机原理及应用,第四章 汇编语言程序设计,单片机原理及应用,单片机原理及应用,第一节 伪指令,伪指令汇编时不产生机器代码,仅提供汇编控制信息。 1. 定位ORG mm:十六位地址值ORG指令出现在程序或数据的开始,指明语句后的程序,数据的起始地址。例:ORG 0030H,单片机原理及应用,单片机原理及应用,2. 等值字符名称 EQU 使两边的两个量等值,例如:TEST EQU 76HCOUN EQU 5,单片机原理及应用,单片机原理及应用,3. 定义字节, DB 项或项表指一个字节或用逗号分开的字节数据,或用引号括起的字符串。DB指令将指定的字节数据存入程序存储器的数据区,左边的标号就是DB
2、定义的第一个字节数据的存储地址。例: ORG 2000HFIRST DB 12H,34HSECOND DB ERROR,单片机原理及应用,单片机原理及应用,4. 定义字, DW 项或项表指一个字或用逗号分开的字数据。DW常用来定义16位地址,例:ADDR DW 2000H 注意:高八位在前,低八位在后。,单片机原理及应用,单片机原理及应用,5. 定义存储区, DS 标号所指的单元开始,保留一定数量的内存单元,以备后用。 6. 位地址赋值字符名称 BIT n n:位地址 将位地址n赋给字符名称,程序中用字符名称用作位地址。,单片机原理及应用,单片机原理及应用,7. 汇编结束END 告诉汇编程序,
3、该程序段已结束。END后的源程序将不进行汇编处理。,3,单片机原理及应用,单片机原理及应用,第二节 汇编语言程序设计,一、顺序程序设计 例 4-2 将一个字节内的两位压缩BCD码拆开并转换成相应的ASCII码,存入两个RAM单元。,单片机原理及应用,单片机原理及应用,ORG 0100H MOV R0, #90H MOV A, R0 PUSH ACC ANL A, #0FH ORL A, #30H INC R0 MOV R0, A POP ACC ANL A, #0F0H SWAP A ORL A, #30H INC R0 MOV R0, A SJMP $ END,R0:地址指针,入栈保存,两位
4、BCD码送A,低位BCD转换,存ASCII码,存ASCII码,高位BCD转换,取BCD码,单片机原理及应用,单片机原理及应用,二、分支程序设计 例4-5 两个带符号数分别存于ONE和TWO单元,试比较它们的大小,并将较大者存入MAX单元中。两数相等则将任一个存入MAX即可。 解:将其相减结果的正负和溢出(OV)标志结合在一起判断大小。,单片机原理及应用,单片机原理及应用,(1)结果若为正则: ACC.7=0,OV=0,XYACC.7=0,OV=1,XY (2)结果若为负则:ACC.7=1,OV=0,XYACC.7=1,OV=1,X Y,单片机原理及应用,单片机原理及应用,ONE EQU 30H
5、 TWO EQU 31H MAX EQU 32HCLR CMOV A, ONESUBB A, TWOJZ XMAX JB ACC.7, NEGJB OV, YMAXSJMP XMAX NEG: JB OV, XMAX YMAX: MOV A, TWOSJMP RMAX XMAX: MOV A, ONE RMAX: MOV MAX, ASJMP $,X-Y,为负转NEG,X=Y转XMAX,正:溢出,Y大;无溢出,X大,负:溢出,X大 无溢出,Y大,较大值送MAX,单片机原理及应用,单片机原理及应用,三、循环程序设计,例4-6 内部RAM中30H开始存放有10个单字节无符号数,试编程求和,并将所求
6、得的和存放到3EH和3FH单元中,3EH存放和的低字节。y=xi化为 0 y,1 i y+xi y,i+1 i;in,单片机原理及应用,单片机原理及应用,MUAD: MOV 3EH,#0MOV 3FH,#0MOV R0,#30HMOV R7,#10MU1: MOV A,R0ADD A,3EHMOV 3EH,ACLR AADDC A,3FHMOV 3FH,AINC R0DJNZ R7,MU1SJMP $,累加和清0,R7循环次数,R0地址指针,8位相加,修改指针,进位位加和高8位,未加完继续,单片机原理及应用,单片机原理及应用,例1:指针值作为循环终止条件。将内部RAM中30H32H的内容左移4
7、位,移出部分送R2。,5 6,0 0,A,R0: 32H,思路:利用字节交换和半字节交换指令累加器A与R0所指的单元内容交换,单片机原理及应用,单片机原理及应用,RL43: MOV R0,#32HCLR A LOOP: XCHD A,R0SWAP AXCH A,R0DEC R0CJNE R0,#2FH,LOOPSWAP AMOV R2,ARET,半字节交换,字节交换,高低字节交换,单片机原理及应用,单片机原理及应用,例2:多重循环,延时程序。DEL: MOV R7,#200 1DEL1: MOV R6,#123 1NOP 1DEL2: DJNZ R6,DEL2 2DJNZ R7,DEL1 2R
8、ET 2,12M晶振,机器周期为1s。(2*123+1+1+2)*200+1+2=50.003ms,单片机原理及应用,单片机原理及应用,四、查表程序设计把事先计算或实验数据按一定顺序编成表格,存于程序存储器内,然后根据输入参数值,从表中取得结果。查表程序可完成数据补偿、计算和转换等功能。 线性表:n个元素a0、a1、.an-1,具有线性(一维)的位置关系,每个元素占L个存储单元。addr(ai)=addr(a0)+i*L,单片机原理及应用,单片机原理及应用,例 4-9 某求函数Y=X!(X=0,7)的值。设自变量存放在ABC单元,表头的地址为TABL,Y值为双字节存放在R2和R3 中,R3存放
9、低位。采用“MOVC A, A+DPTR”指令实现表格以BCD码的格式存放Y值0001,0001,0002,0006,0024,0120,0720,5040,高八位先放,低八位后放,单片机原理及应用,单片机原理及应用,ORG 0100H ABC EQU 30H L1: MOV DPTR, #TABLMOV A,ABCADD A,ABCMOV R3,AMOVC A,A+DPTRXCH A,R3INC AMOVC A,A+DPTRMOV R2,ASJMP $ TABL DB 01,00,01,00,02,00,06,00DB 24H,00,20H,01,20H,07,40H,50H,DPTR表格首
10、址,X2,查低字节送A,查高字节送R2,高字节的偏移,BCD码格式存放的Y值,单片机原理及应用,单片机原理及应用,例4-10 已知R0低4位有一个十六进制数,请编程将它转换成相应ASCII码并送入R0。 解:采用“MOVC A, A+PC”指令实现。 注意:必须将累加器A中的变址值作相应修正,其修正值为“MOVC A, A+PC”指令与数据表首地址之间的偏移量,本例中为3个字节。,单片机原理及应用,单片机原理及应用,MOV A, R0ANL A, #0FHADD A, #03H MOVC A, A+PCMOV R0, A ;该指令占1字节SJMP $ ;该指令占2字节 ASCTAB:DB 0,
11、 1, 2, 3DB 4, 5, 6, 7DB 8, 9, A, BDB C, D, E, F,1位BCD送A,用偏移量对A进行修正,查表得ASCII,1/2,3,单片机原理及应用,单片机原理及应用,五、散转程序设计散转程序是分支程序的一种,它根据某种输入或运算的结果,分别转向各个处理程序。使用AT89C52指令“JMP A+DPTR”,可以容易地实现散转功能。,单片机原理及应用,单片机原理及应用,1.使用转移指令表的散转程序 例4-12根据R2的内容,转向各个处理程序。根据R2的内容是0,1,2,n,分别转向处理程序0,1,2,n,我们用AJMP或LJMP指令组成一个转移表,首址送DPTR。
12、,单片机原理及应用,单片机原理及应用,JMP1:MOV DPTR,#TABMOV A,R2ADD A,R2JNC NADDINC DPHNADD:JMP A+DPTRTAB: AJMP PRG0AJMP PRG1AJMP PRGn 注意:AJMP、TAB和处理程序在同一2K内,转移指令表,散转,首址,R2*2,单片机原理及应用,单片机原理及应用,2.使用转移地址表的散转程序 当转向范围较大时,可以直接使用转向地址表的方法。 例4-14各处理程序的入口地址组成表格,使用查表指令,按R2内容查表,找到对应的转向地址,送DPTR,清A,用JMP A+DPTR指令转向各个处理程序。,单片机原理及应用,
13、单片机原理及应用,JMP2:MOV DPTR,#TAB1MOV A,R2ADD A,R2JNC NADDINC DPH NADD:MOV R3,AMOVC A,A+DPTRXCH A,R3INC AMOVC A,A+DPTR,取高八位地址,DPH加1,首址,R2*2,取低八位地址,单片机原理及应用,单片机原理及应用,MOV DPL,AMOV DPH,R3CLR AJMP A+DPTRTAB1:DW PRG0DW PRG1DW PRGn 说明:A实现64K范围内的散转,n256,转移地址表,散转,单片机原理及应用,单片机原理及应用,六、子程序设计,1. 用工作寄存器或累加器传递参数 例4-16编
14、制 c=a2+b2程序。设a和b均为小于10的整数,a、b、c放在内部RAM XA、XB、XC三个单元中。通过A累加器传递参数。,单片机原理及应用,单片机原理及应用,XA EQU 40H XB EQU 41H XC EQU 42HMOV A, XALCALL SQRMOV XC, AMOV A, XBLCALL SQRADD A, XCMOV XC, ASJMP $ SQR: MOV B,AMUL ABRET,取出数a到累加器,调子程序,调子程序,取出数b到累加器,乘法子程序,c=a2+b2,单片机原理及应用,单片机原理及应用,2. 用指针寄存器传递参数,数据放在存储器中(内部或外部RAM),
15、用地址指针指示数据位置。 例3:将R0和R1指出的内部RAM中的两个3字节无符号数相加,结果送R0所指的内部RAM中。,单片机原理及应用,单片机原理及应用,NADD: MOV R7,#3CLR C NADD1: MOV A,R0ADDC A,R1 MOV R0,ADEC R0 DEC R1DJNZ R7,NADD1RET,指针R0R1,单片机原理及应用,单片机原理及应用,3. 用堆栈传递参数,例4-15在寄存器R2中存放有两位16进制数,试将它们分别转换成ASCII码存入Y1和Y1+1单元。 解:由于要进行两次转换,故可通过调用子程序的方式来完成,用堆栈完成参数传递。,单片机原理及应用,单片机
16、原理及应用,HASC: DEC SPDEC SPPOP ACC ANL A,#0FHMOVC A,A+DPTR PUSH ACCINC SPINC SPRET TAB DB 01234567DB 89ABCDEF,如何取出参数?,取出参数,参数进栈,得到ASCII,Y1 EQU 30HMOV DPTR, #TABPUSH 02HACALL HASCPOP Y1,ASCII码表,R2进栈,单片机原理及应用,单片机原理及应用,调用上述的子程序,将R2单元的两位十六进制数转换为ASCII码送Y1和Y1+1单元。,Y1 EQU 30HMOV SP, #5FH MOV DPTR, #TAB PUSH 0
17、2HACALL HASCPOP Y1MOV A, R2SWAP APUSH ACCACALL HASCPOP Y1+1SJMP $,设SP,十六进制数入栈,转换低位,ASCII出栈,转换高位,高低四位交换,DPTR表格首址,单片机原理及应用,单片机原理及应用,(4) 程序段参数传递,大量常数,可用程序段来传递,常数作为程序代码的一部分,放在程序存储器中,用MOVC指令取出。,单片机原理及应用,单片机原理及应用,七、运算程序设计 例4-20 已知以BLK1和BLK2为首地址的片内RAM存储区中,分别有5字节无符号被减数和减数(低位在前、高位在后),试编写一多字节减法子程序,把差放入以BLK1为起始地址的存储单元。,单片机原理及应用,单片机原理及应用,DSUBB: MOV R0, # BLK1MOV R1, # BLK2MOV R2, # 05HCLR C LOOP: MOV A, R0SUBB A, R1MOV R0, AINC R0INC R1DJNZ R2, LOOPRET,被减数指针R0,循环次数R2,带进位位相减,减数指针R1,4,