430 likes | 626 Views
第 3 章 MCS-51 系列单片机的 寻址方式及指令系统. 伪指令,数据形式 3.1 MCS-51 指令系统的寻址方式 3.2 MCS-51 单片机指令系统. 退出. 伪指令. 1. 定位伪指令: ORG m m 是 16 位二进制数,指出汇编语言源程序汇编成机器语言程序后在程序存储器中存放的起始地址。 ORG 伪指令总是出现在每段源程序或数据块的开始,它可以使程序员把主程序、子程序或数据块存放到存储器的任何位置。. 2. 定义字节伪指令. 标号: DB ( 项或项表 )
E N D
第3章 MCS-51系列单片机的 寻址方式及指令系统 • 伪指令,数据形式 • 3.1 MCS-51指令系统的寻址方式 • 3.2 MCS-51单片机指令系统 退出
伪指令 • 1. 定位伪指令:ORG m • m是16位二进制数,指出汇编语言源程序汇编成机器语言程序后在程序存储器中存放的起始地址。ORG伪指令总是出现在每段源程序或数据块的开始,它可以使程序员把主程序、子程序或数据块存放到存储器的任何位置。
2. 定义字节伪指令 • 标号:DB (项或项表) • 项是指单字节的十进制或十六进制数据。功能:把项或项表的数值存人从标号开始的连续单元中。用于定义一个常数表。 3.定义字伪指令 • 标号:DW(项或项表) • DW的功能与DB的功能基本相似,两者的区别在于DB的项是一个字节,而DW的项是一个字(两个字节,16位二进制数)。所以,DW常用来定义地址表。
数据形式:# • 1. 二进制:10101010B • 2. 十进制:32 • 3. 八进制:45O • 4. 十六进制:12H, 0F7H
3.1 寻址方式 • 寻找确定参与操作的操作数本身或操作数地址的方式。 • 1、寄存器寻址 • 寄存器寻址是指操作数存放在寄存器中。 • 例如:MOV A,R0 • 2、直接寻址 • 直接寻址是将操作数的地址直接存放在指令中。 • 例如:MOV A,30H
3、寄存器间址 • 寄存器间址是指操作数存放在以寄存器内容为地址的单元中。 • 例如:MOV A,@R0 • 4、立即寻址 • 将操作数直接存放在指令中,作为指令的一部分存放在代码段里。立即寻址中的数,称为立即数。 • 例如指令:MOV A,#30H
5、基址加变址寻址 • 操作数存放在变址寄存器和基址寄存器的内容相加形成的数为地址的单元中。其中累加器A作变址寄存器、程序计数器PC或寄存器DPTR作基址寄存器。 • 例如: MOVC A, @A+DPTR • MOVC A, @A+PC
3.2 MCS-51单片机指令系统 • 按指令的功能分类,MCS-51指令系统可分为下面五类:(1)数据传送 (2)算术操作 (3)逻辑运算(4)控制转移 (5)位操作类 • 指令的一些符号的意义 Rn:当前选中的寄存器区中的8个工作寄存器R0~R7(n=0~7)。 Ri:当前选中的寄存器区中可作为间接寻址寄存器用的两个工作寄存器R0,R1(i=0,1)。 direct::直接地址,即内部RAM或特殊功能寄存器的8位地址。
#data:8位立即数,包含在指令中的8位常数。 #datal6:16位立即数,包含在指令中的16位常 数。 rel: 8位的带符号的偏移量。用于SJMP或所有的条件转移指令中。偏移量按下一条指令的第一个字节地址与跳转后指令第一个字节地址之差计算,在-128~+127范围内取值。 Bit:内部RAM或特殊功能寄存器中直接寻址位 CY:进位标志位,或位处理机中的累加器。
3.2.1 数据传送类指令 1. 以累加器为目的操作数的指令 • MOV A,Rn • MOV A,@Ri • MOV A,direct • MOV A,#data 2.以Rn为目的操作数的指令 • MOV Rn,A • MOV Rn,direct • MOV Rn,# data
3.以直接地址为目的操作数的指令 • MOV direct,A • MOV direct,Rn • MOV direct,direct • MOV direct,@Ri • MOV direct,#data 4.以寄存器间接地址为目的操作数的指令 • MOV @Ri,A • MOV @Ri,direct • MOV @ Ri,#data 5. 16位数据传送指令 • MOV DPTR,#data16 把高8位立即数送人DPH,低8位立即数送人DPL
6.堆栈操作指令 在MC5-51内部RAM中可以设定一个后进先出LIFO作为一个堆栈。特殊功能寄存器中的堆栈指针SP指出栈顶的位置。 (1)进栈指令: PUSH direct; (SP)+1,((SP)) =(direct) 例3-1(1)若(SP)=60H,(DPH)=70H,(DPL)=30H,则: PUSH DPL; (SP)=(SP)+1=61H ,(61H)=(DPL)=30H PUSH DPH; (SP)=(SP)+1=62H ,(62H)=(DPH)=70H 结果(SP)=62H,(62H)=70H,(61H)=30H (2)退栈指令:POP direct; (direct)=((SP)),(SP)=(SP)-1 例3-1(2)若(SP)=62H,(62H)=70H,(61H)=30H,则: POP DPH;(DPH)=((SP)),(SP)=(SP)-1 POP DPL;(DPL)=((SP)),(SP)=(SP)-1 结果:(DPTR)=7030H,(SP)=60H。
7.累加器A与外部数据存储器传送指令 MOVX A,@DPTR MOVX A,@Ri MOVX @DPTR,A MOVX @Ri,A 这组指令的功能是把外部RAM或外部I/0口单元的数据读入累加器A;或把累加器A中的数据写人外部RAM或外部I/0口单元。 8. 查表指令 (1)MOVC A,@A+PC;(PC)=(PC)+1,(A)=((A)+(PC)) 这条指令以PC作基址寄存器,A的内容作为无符号整数和PC的内容(下一条指令的起始地址)相加后得到一个16位的地址,由该地址指出的程序存储单元的内容送到累加器A。
例3-2若(A)=30H,执行地址1000H处的指令: 1000H: MOV A,@A+PC 本指令占用一个单元,下一条指令的地址为1001 H,即(PC)=1001 H,再加上A中的30H得1031H,结果将程序存储器中地址为 1031H单元中的内容送人A。 优点:不改变PC和DPTR的状态,根据A的内容就可以取出表格中 的常数。 缺点:表格只能存放在该条查表指令后面的256个单元之内,表格的大小和位置受到限制,而且表格只能被一段程序所利用。
(2)MOVC A,@A+DPI'R; (A)=((A)+(DPTR)) 这条指令以DPTR作为基址寄存器,A的内容作为无符号数和DPTR的内容相加得到一个16位的地址,由该地址指出的程序存储器单元的内容送到累加器A。 例3-3 若(DPTR)=8100H,(A)=40H,执行指令: MOVC A,@A+DPTR 将程序存储器中8140H单元内容送入累加器A。 优点:执行结果只和指针DPPR及累加器A的内容有关,与该条指令存放的地址及常数表格存放的地址无关,因此表格的大小和位置可以在64KB程序存储器中任意安排,一个表格可以为各个程序块共用。 缺点:改变DPTR。
9. 数据交换指令 (1)寄存器内容与累加器内容交换 XCH A,Rn (2)内部RAM内容与累加器内容交换 XCH A,@Ri (3)内部RAM或特殊功能寄存器与累加器内容交换 XCH A,direct (4)内部RAM低4位内容与累加器低4位内容交换 XCHD A,@Ri (5)累加器内容低4位与高4位交换 SWAP A
3.2.2 算术操作类指令 算术操作类指令完成加、减、乘、除四则运算及加1、减和二、十进制调整操作。 • 1.加法指令 • ADD A .Rn • ADD A,direct • ADD A,@Ri • ADD A,#data • 2.带进位加法指令 • ADDC A,Rn • ADDC A,direct • ADDC A,@Ri • ADDC A,#data
3 增量指令 INC A INC Rn INC direct INC @Ri INC DPIR 4.十进制调整指令 DA A 这条指令对累加器A中由两个变量(压缩的BCD码)相加的结果进行十进制调整,使A中的结果为二位BCD码的数。在应用十进制调整指令时,对用户来讲,只要在BCD码加法指令后紧跟一条十进制调整指令DA A就可以了。 例3-7 若(A)=56H, (R5)=67H为两个压缩的BCD数,则执行:ADD A, R5 DA A 结果: (A)=23H,CY=1
5. 减法指令 SUBB A,Rn SUBB A,direct SUBS A,@Ri SUBB A,#data 6.减1指令 DEC A DEC Rn DEC direct DEC @Ri
7.乘法指令 MUL AB 把累加器A和寄存器B中的位无符号数相乘,其16位积的低位字节放在累加器A中,高位字节放在寄存器B中。如果乘积大于255,则置位滥出标志位OV,否则清零OV。进位标志CY总是清零。 8.除法指令 DIV AB 把累加器A中8位无符号整数除以B中的8位符号整数,所得的商(为整数)存放在累加器A中,余数存放在寄存器B中,清零进位标志CY和溢出标志OV。若(B)=0, 则结果A、 B内容不定,OV为1。
3.2.3 逻辑运算类指令 • 1.清零指令 • CLR A • 2. 取反指令 • CPL A • 3. 左环移指令 • RL A • 该条指令的功能是将累加器A的内容向左环移1位,A.7移入位A.0
4.带进位左环移指令 RLC A 该条指令的功能是将累加器A的内容和进位标志CY一起向左环移1位,A.7移入进位标志CY中,CY中的数移入A.0
5.右环移指令 RR A 该条指令的功能是将累加器A的内容右环移1位,A.0移人A.7,不影响任何标志。 6.带进位右环移指令 RRC A 这条指令的功能是将累加器A的内容和进位标志CY一起向有环移1位,A.0移入CY,CY移入A.7,不影响AC、0V标志。
7.累加器半字节交换指令 SWAP A 将累加器A的高半字节(A.7~A.4)与低半字节 (A.3~A.0)互换。 8.逻辑与指令 ANL A,Rn ANL A,direct ANL A,#data ANL A,@Ri ANL direct,A ANL direct,#data
9. 逻辑或指令 ORI. A,Rn ORL A,#data ORL A,direct ORL A,@Ri ORL direct,A ORL direct,#data 10. 逻辑异或指令 XRL A, Rn XRL A, direct XRL A, @Ri XRL A, #data XRL direct,A XRL direct,#data 结果存到目的变量寄存器或存储单元中去。
3.2.4 控制转移类指令 1.无条件转移指令 (1) 绝对短转移指令 AJMP addrl11; (PC)=(PC)+2,(PC10~0)=addr10~0 • 这是2KB范围内的无条件转移指令。转移目标地址必须与AJMP下一条指令的第一个字节在同一2K个字节范围内。 (2)长转移指令 • LJMP addrl6; PC= addr15~0 • 这条指令执行时把addrl6的二个字节分别装人PC的高位和低位字节中,无条件地转向指定地址。转移的目标地址可以在64K程序存储器地址空间的任何地方。
(3)相对转移指令 SJMP rel; (PC)=(PC)+2,(PC)=(PC)+rel 这条指令在执行时在PC加2之后,把指令的带符号的单字节偏移量ref加到PC上,计算出转移的目标地址。因此转移的目标地址可以在这条指令前128字节到后126字节之间。 (4)散转指令 JMP @A+DPTR; (PC)=(A)+(DPIR) 这是一条间接长转移指令,其功能是把累加器A中8位无符号数与数据DPTR中的16位数相加,结果作为下一条要执行的指令地址送入PC,不改变累加器A和数据指针DPTR的内容。利用这条指令能实现程序的散转。
2. 条件转移指令 条件转移指令是依某种特定条件而转移的指令。条件满足时转移,条件不满足时按顺序执行其下一条指令。转移的目标地址在以下一条指令首地址为中心的256个字节范围内(-128~+127)。 JZ rel; 如果累加器A为零,则执行转移 JNZ rel; 如果累加器A不为零,则执行转移 JC rel; 如果进位标志CY为1,则执行转移 JNC rel; 如果进位标志CY为0,则执行转移 JB bit,rel; 如果直接寻址的位值为1.则执行转移 JNB bit,rel; 如果直接寻址的位值为0,则执行转移 JBC bit,rel; 如果直接寻址的位值为1.则执行转移, 然 后清零直接寻址酌位。
3.比较不相等转移指令 这组指令的功能是比较前面两个操作数的大小。如果它们的值不相等则转移。如果第一个操作数(无符号整数)小于第二个操作数(无符号整数),则置位进位标志CY,否则清零CY。不影响任何一个操作数的内容:不影响AC、OC、P标志。 CJNE A, direct, rel CJNE A,#data, rel CJNE Rn, #data, rel CINE @Ri, #data, rel
4.减1不为0转移指令 这组指令的功能是将源操作数减1,结果回送到源操作数寄存器或存储单元中去。如果结果不为零则转移。用户可以利用该组指令把内部RAM单元用作程序循环计数器。 DJNZ Rn,rel DJNZ direct,rel
5.调用子程序指令 (1)短调用指令: ACALL addr11 ;(PC)=(PC)+2; (SP)=(SP)+1 ; ((SP))=(PC7~0); (SP)=(SP)+1; ((SP))=(PC15~8);(PC10~0)=addr10~0 这是2K范围内的调用子程序的指令。执行时先把PC加2获得下一条指令的首字节地址,把此于程序返回地址压入堆栈中保护,再把PC的高5位和addr11连接获得子程序入口地址并送入PC,转向执行子程序。所调用的子程序入口地址必须与ACALL下一条指令的第一个字节在同一 个2K区域内。 (2)长调用指令: LCALL addr16 ;(PC)=(PC)+3; (SP)=(SP)+1 ; ((SP))=(PC7~0); (SP)=(SP)+1; ((SP))=(PC15~8);PC=addr15~0 所调用的子程序入口地址可在64K范围内程序存储器的任何一个地方。
6.返回指令 (1)子程序返回指令:RET ;(PC15~8)=((SP)); (SP)=(SP)-1; (PC7~0)=((SP));(SP)=(5P)-1 这条指令的功能是从堆栈中退出PC的高位和低位字节,把栈指针减2,从PC值开始继续执行程序。不影响任何标志。 在于程序的结尾必须是返回指令RET,才能从子程序返回主程序。 (2)中断返回指令: RETI 这条指令的功能与RET指令相似。不同的是清除MCS-51内部的中断状态标志,将在中断一章中详细讨论。 7.空操作指令 NOP 只执行(PC)=(PC)+1操作。
3.2.5 位操作类指令 位地址可以是内部RAM的20H一2FH单元中连续的128个位00H~7FH;或是特殊功能寄存器中的可寻址位,位地址分布在80H~FFH,但不是连续的。在位处理机中,进位标志的作用相当于一般CPU中的累加器,故称CY为位累加器。 1.数据位传送指令 2.位变量修改指令 • MOV C,bit CLR C • MOV bit,C CLR bit 3.位变量逻辑与逻辑或指令 CPL C • ANL C,bit CPL bit • ANL C,/bit SETB C • ORL C,bit SETB bit • ORL C,/bit
4. 位条件转移指令 • (1)依据CY转移指令 • JC rel • JNC rel • (2)依据直接寻址位转移指令 • JB bit,rel • JNB bit,rel • JBC bit,rel
例1:已知电路如下图所示,实现如下功能: • (1) 红黄绿灯亮50ms,灭50ms,闪烁。 • (2) 红黄绿灯轮流点亮50ms • (3) 若S1、S2均闭合,红灯亮;若S1,S2均断开,绿灯亮;其余情况,黄灯亮。
(1) ORG 0000H • MOV P1, #00H • MAIN: ACALL DELAY • CPL P1 • AJMP MAIN • DELAY: MOV R7,#200 • DEL1: M0V R6, #125 • DEL2: DJNZ R6,DEL2 ;125*2=250s • DJNZ R7,DELl ;0.25ms* 200=50ms • RET
(2) ORG 0000H • MAIN: MOV A, #01H • LOOP: MOV P1,A • LCALL DELAY • RL A • CJNE A, # 08H, LOOP • LJMP MAIN • DELAY: MOV R7,#200 • DEL1: M0V R6, #125 • DEL2: DJNZ R6,DEL2 ;125*2=250s • DJNZ R7,DELl ;0.25ms* 200=50ms • RET
(3) ORG 0000H • MAIN: MOV P1, #0FFH • MOV A, P1 • ANL A, #0C0H • JZ RED • CPL A • ANL A,#0C0H • JZ GRN • SETB P1.2 • CLR P1.0 • CLR P1.1 • AJMP MAIN • RED: SETB P1.0 • CLR P1.1 • CLR P1.2 • AJMP MAIN • GRN: SETB P1.1 • CLR P1.0 • CLR P1.2 • AJMP MAIN
例2. 简单的交通灯控制。交通灯硬件配置电路如下图所示。编写程序实现交通灯的正常控制。
ORG 0000H MAIN: MOV P1, #10111011B ;东西绿,南北红 ACALL DELAY ;延时 ACALL YELL ;黄灯闪烁 MOV P1, #11010111B ;东西红,南北绿 ACALL DELAY ;延时 ACALL YELL ;黄灯闪烁 LJMP MAIN
YELL: MOV R1, #8H • ;黄灯闪烁时间控制 • YL: CPL P1.7 ;东西黄灯 • CPL P1.4 ;南北黄灯 • MOV A, #3H ;时间常数 • ACALL DELAY • DJNZ R1, YL • RET
DELAY: MOV R7,#200 • DEL1: M0V R6, #125 • DEL2: DJNZ R6,DEL2 ;125*2=250s • DJNZ R7,DELl ;0.25ms* 200=50ms • RET