前面我们讲到了七种单片机寻址方式,大家都有了一点印象,这次我们来进一步巩固与与加深印象。
内部传送指令 ( MOV ):片内数据存储器、寄存器数据(就是前面我们说到单片机内部RAM 128B,增强型的是256B,低128B是内部RAM区,高128B是SFR特殊功能寄存器区)传送
外部传送指令( MOVX ):片外数据存储器数据传送(就是前面我们到单片机片外有64KB的数据存储器)
查表指令( MOVC ): 程序存储器数据传送(64KB的程序存储器,因为程序存储器只读不写)
堆栈操作指令( PUSH,POP ):片内数据存储器数据传送
交换指令( XCH,XCHD,SWAP ): 片内数据存储器、寄存器数据传送
传送类指令不影响PSW(除P位),位就是程序状态寄存器PSW的最低位。
dir是8位直接字节地址(片内RAM和SFR特殊功能寄存器地址 共256B从00H到FFH,其中内部RAM区为00H~7FH,SFR从80H ~FFH)
这个图大家肯定要记住,这是内部传送指令的,A是特殊功能寄存器的累加器A
A到寄存器就是寄存器寻址
**#**就是立即寻址
dir是内部RAM的地址,地址到寄存器就是直接寻址
直接寻址的寻址对象为:1.内部数据寄存器2.特殊功能寄存器
@就是寄存器间接寻址(能够进行寄存器间接寻址的寄存器有R0,R1、DPTR)
Ri:指的是当前工作寄存器组的R0,R1(其中i=0,1)
注意这是以A为目的操作数。
直接寻址的寻址对象为:1.内部数据寄存器2.特殊功能寄存器
Rn刚开始我们也说过,也是一个字节地址
剩下的两种大家很容易就看出来了,这里就不推了。
MOV指令使用注意:
1.一条指令中不能同时出现两个工作寄存器:
非法指令:
MOV R1,R2
MOV R2,@R0
MOV @R0,@R1
2. 间址寄存器只能使用 R0、R1。
非法指令: MOV A,@R2
3. SFR区只能直接寻址或寄存器寻址,不能用寄存器间接寻址。
非法指令::MOV R0,#80H MOV A,@R0
51单片机采用不同的寻址方式,访问外部的数据存储器用MOVX,访问程序存储器用MOVC
查表指令MOVC 注:①只能从程序存储器读取数据到A累加器。 ②只能使用变址寻址方式 多用于查常数表程序,直接求取常数表中的函数值
1)DPTR为基址寄存器
MOVC A,@A+DPTR ;A←(A+DPTR)
查表范围为 64KB 程序存储器任意空间。
2)PC为基址寄存器
MOVC A,@A+PC ;A← (A+PC)
常数表只能在查表指令后 256B 范围内。
算术类指令的操作意义非常明确,不一一赘述,注意减指令只有带借位减,因此在多字节减法中,最低字节作减法时,注意先清CY位。
逻辑运算是按位进行的,两数运算的运算法则是:
与:有“0”则“0”;
或:有“1”则“1”
异或:同为“0” , 异为“1”;
与“0”异或值不变:与“1”异或值变反。
逻辑指令常用于对数据位进行加工。
这一类指令的功能是改变指令的执行顺序,转到指令指示的新的PC地址执行。
MCS-51单片机的控制转移指令有以下类型:
2)无条件转移: 无需判断,执行该指令就转移到目的地址。
2)条件转移:需判断标志位是否满足条件,满足条件转移到目的地址,否则顺序执行。
2)绝对转移:转移的目的地址用绝对地址指示,通常为无条件转移。
2)相对转移:转移的目的地址用相对于当前PC的偏差(偏移量)指示,通常为条件转移。
2)长转移或长调用:目的地址距当前PC 64KB地址范围内。
2)短转移或短调用:目的地址距当前PC 2KB地址范围。
LCALL addrl16 ;addr16→PC0~15
说明:
(1)该指令功能是
①保护断点,即将当前PC(本指令的下一条指令的首地 址)压入堆栈。
②子程序的入口地址 addr16 送PC,转子程序执行。
(2)本指令为64KB地址范围内的调子程序指令,子程序可在64KB地址空间的任一处。
(3)本指令的机器码为三字节 12 addr16。
ACALL addr11 ; PC¬PC+2 ;PC10~0¬add10~0
;PC15~11不变
说明:
(1)该指令的功能是
①保护断点,即当前PC压入堆栈。
② addrl11→PC0~10,而PC11~15保持原值不变。
(2)本指令为2KB地址范围的调子程序指令,子程序入口距当前PC不得超过2KB地址范围。
(3)本指令的机器码为二字节,设addr11的各位是a10a9a8…a2a1a0,则ACALL指令机器码a10a9a810001a7a6a5a4a3a2a1a0,其中10001是ACALL指令的操作码。
RET ;从调用子程序返回。
功能:从栈顶弹出断点到PC。
RETI ; 从中断服务程序返回。
功能:从栈顶弹出断点到PC,并恢复中断优先级状态触发器。
AJMP addr11 ;addr11→PC0~10
说明:
①转移范围:本指令为2KB地址范围内的转移指令。对转移目的地址的要求与ACALL指令对子程序入口地址的要求相同。
②机器码形式:本指令为2字节指令。设addr11的各位是a10a9a8…a2a1a0,则指令的机器码为a10a9a800001a7a6a5a4a3a2a1a0。
LJMP addr16 ;addr16→PC0~15
说明:
①本指令为64KB程序存储空间的全范围转移指令。转移地址可为16位地址中的任意值。
②本指令为3字节指令02 addr16。
JMP @A+DPTR ;PC¬A+DPTR
指令转移范围:64KB。
SJMP Rel8 ;PC¬PC+2,PC¬PC+Rel8
相对偏移量 Rel8 为8位补码。
指令转移范围:前128~后127字节
相对偏移量 Rel8 的计算式:
Rel8 =目的地址 -当前PC值
=目的指令地址 -(SJMP指令地址+2)
在实际编程中,转移的目的地址不管是addr11、addr16、还是rel ,均是一符号地址表示的,转移指令的操作数交给汇编程序计算。例: LJMP NEXT; AJMP NEXT; SJMP NEXT
程序中经常遇到,需要重点把握
1)累加器为零(非零)转移
JZ rel
;A=0 则转移(As+2+rel→PC)
JNZ rel
;A≠0 程序顺序执行,机器码为60rel
(2)减 1 不等于零转移
DJNZ Rn , rel ;Rn-1
DJNZ dir , .rel
本指令有自动减 1 功能。
3)比较转移指令
CJNE A,dir , rel
CJNE A , #data , rel
CJNE Rn , #data , rel
CJNE @Ri , #data , rel
(5) 空操作指令
NOP 机器码 00
该指令经取指,译码后不进行任何操作(空操作)而转到下一条指令,常用于生产一个机器周期的延时,或上机修改程序时作填充指令,以方便增减指令。
大家还记得吧,就是机器周期由12个时钟周期组成12/fosc
(6) 位操作指令
★ 位寻址方式复习 ★
位寻址方式是使用位地址访问位寻址区;
可供位寻址的区域
片内RAM的20H2FH为位寻址空间(位地址:007FH)
某些SFR:其字节地址都能被8整除,共11个。
1.位清零
CLR C ;0→CY
CLR bit ;0→bit
2.位置 1
SETB C ;1→CY
SETB bit ; 1→bit
3.位取反
CPL C ; CY →CY
CPL bit ; bit → bit
4.位与
ANL C,bit ;CY ∧(bit)→CY
ANL C,/bit ;CY∧(bit)→CY
5.位或
ORL C,bit ;CY∨(bit)→CY
ORL C,/bit ;CY∨(bit)→CY
6. 位传送
MOV C,bit ;(bit)→CY
MOV bit,C ;CY→bit
7. 位转移
位转移根据位的值决定转移,均为相对转移指令,设As为下面各指令的首地址。
JC rel ;CY=1,则转移(As+2+rel→PC),
否则程序顺序执行
JNC rel ;CY=0,则转移(As+2+rel→PC),
否则程序顺序执行
JB bit,rel ;(bit)=1,则转移(As+3+rel→PC),
否则程序顺序执行
JNB bit,rel ;(bit)=0,则转移(As+3+rel→PC),
否则程序顺序执行
JBC bit,rel ;(bit)=1,则转移(As+3+rel→PC),
且该位清零;否则程序顺序执行
1) 凡是对A 操作指令(包括传送指令)都将A中1个的奇偶反映到PSW的P标志位上。即A中奇数个“1”,P=1;偶数个“1”,P=0。
2) 传送指令、加 1、减 1 指令、逻辑运算指令不影响Cy、 OV、AC 标志位。
3) 加减运算指令影响标志位,乘除指令使Cy=0,当乘积大于255,或除数为0时,OV置1。
4) 对进位位Cy(指令中用C表示)进行操作的指令和大环移指令,显然会影响Cy。
标志位的状态是控制转移指令的条件,因此指令对标志位的影响应该记住。
指令是程序设计的基础,应重点掌握传送指令、算术运算指令、逻辑运算指令、控制转移指令和位操作指令,掌握常用指令的功能,操作的对象和结果,对标志位的影响,应要求熟记。