数据传送指令
概况:数据传送指令一共有29条,用到的助记符有8种,可以概括为5类:
- 片内传送:MOV;
- 片外传送:MOVX;
- 查表传送:MOVC;
- 累加器交换:XCH,XCHD,SWAP;
- 堆栈操作:PUSH POP;
MOV类传送指令
格式:MOV <目标字节>,<源字节> 源字节内容不变 以A为目标:
- 立即数送累加器:MOV A,#data
- 寄存器内容送累加器:MOV A,Rn(n = 0-7)(寄存器组由RS0,RS1确定)
- 内部RAM或SFR内容送累加器:MOV A,direct
- 内部RAM内容送累加器:MOV A,@Ri(i=0,1) 以Rn为目标:
- 立即数送寄存器:MOV Rn,#data;
- 累加器内容送寄存器:MOV Rn,A;
- 内部RAM或者SFR内容送寄存器:MOV Rn,direct; 以直接地址为目标:
- 立即数送内部RAM/SFR : MOV direct,#data;
- 累加器内容送内部RAM或SFR: MOV direct,A;
- 寄存器内容送内部RAM或者SFR: MOV direct,Rn;
- 内部RAM/SFR之间直接传送: MOV direct 1,direct 2;
唯一的十六位数据传送指令: MOV DPTR ,#data 16;
堆栈操作
栈顶地址的绝对值是随着数据存入向上生长的。 堆栈操作可以用于终端程序的保护现场和恢复现场。
在8051复位后,SP被初始化为07H.因此在实际编程时会将SP指向30H或者更高的空间(保证在数据缓冲区的上方) 堆栈增长方式:先增后压。比如SP为07H,现在执行指令PUSH A; 那么实际执行为:SP+1,将A的值存到08H
MOV A,#55H;
PUSH A ;
POP PSW ;
算术运算指令
C(CY): Carry Flag 进位标志,用在无符号数的加法 OV: Over Flow 溢出标志,用于有符号数运算。 逻辑上是D6向D7进位和D7向外进位的异或操作 可以直观理解成两个正数相加变负数或者两个负数相加变正数,OV置1 AC(Auxiliary Carry): 辅助进位标志位,当低四位向高四位进位,AC =1 P(Parity Bit): 奇偶校验位:P = 1: 表示累加器 A 中含“1”的位数为奇数。
二-十进制调整:DA A 应用场景:已知一字节可以存储两个BCD码(0-99),现在有两字节的BCD码.我们要将两个BCD码相加,在进行ADD过后,需要通过DA A修正。 修正逻辑:
- 低 4 位修正: 如果 A 的低 4 位(D0~D3)大于 9,或者辅助进位标志 AC = 1,则 A 的低 4 位加 6
- 高 4 位修正: 如果 A 的高 4 位(D4~D7)大于 9,或者进位标志 CY = 1,则 A 的高 4 位加 6
加一减一操作: INC DEC
乘法指令: MUL AB(第八位A高八位B) 结果如果B中有值,则OV置1 DIV AB(商A余数B) 若除数为0,OV置1
单操作数逻辑运算指令:
- A清零指令: CLR A
- A取反指令: CPL A
- A循环左移:RL A(所有位左移,A7->A0)(8位循环移位)
- A协同C循环左移: RLC A (所有位左移,A7->C,C->A0)(9位循环移位)
- 右移同理: RR A; RRC A; (可以通过循环实现快速翻倍或者/2)
双操作数逻辑运算指令:
- 逻辑与指令:ANL A, Rn ( A <- (A) ^ (Rn) ) 用法:屏蔽某些不用的位
- 逻辑或指令: ORL A, Rn ( A <- (A) + (Rn) )
- 异或指令: XRL A, Rn
位操作: 哪些区域可以按位操作: RAM(20H-2FH) SFR 如何表示:25H.0 PSW.2 06H(20H.6)(起始位+偏移量) CLR C: 置0 SETB C: 置1 /P1.2 : 取反操作(不会影响P1.2本身)
控制转移操作: 无条件转移指令: AJMP addr11: 跳转范围:2KB页内任何一处地点 操作方式:PC+2,保留高5位(页地址)+指令的11位地址 LJMP: LJMP addr16:实现64KB全空间跳转 SJMP: SJMP rel 属于相对跳转,目标地址=(PC+2+rel) JMP: JMP @A+DPTR 基址+变址(指令长度:1Byte) 条件转移指令 JZ rel JNZ rel JC rel( Carry ) JNC rel JB Bit, rel ( PC+3 ) JNB Bit, rel ( PC+3 ) JBC Bit, rel ( 先将bit指令再转移 ) CJNE A, direct, rel ( PC+3 ) DJNZ Rn, rel ( PC +2 , Rn = Rn-1 Rn不等于0跳转 )
逻辑运算指令
ANL经典用途:Masking(数字提取,比如说我只想看一个数据的某几位) ORL经典用途:Setting Bits (位操作) XRL经典用途:全部取反