0000H
FFFFH
0000H
FFFFH
ROM 内 RAM 外 RAM
00H
FFH
寄存器区位寻址区数据缓冲区
SFR
20H
30H
80H
E0H
A
第 3章 MCS- 51指令系统指令的格式:
LOOP,MOV A,R0 ;将 R0的内容送 A
[标号 ] 操作码 第一操作数 第二操作数 [注释 ]
(目的操作数) (源操作数)
注:白色的内容不是必须的
3.2 数据传输类指令
1,以累加器 A为目的操作数的指令
MOV A,# data ; A← # data
MOV A,Rn ; n=0~7,A← (Rn)
MOV A,@Ri ; i=0,1,A← ((Ri))
MOV A,direct ; A← (Rn) direct为内部 RAM或 SFR地址注:
MOV A,@Ri 以 Ri的内容为地址,把该地址中的内容送到 A中去。 A← ((Ri))
MOV A,R0
MOV A,#20H ; (A) = 20H
MOV A,20H ; (A) = (20H),注意两组指令不同点
MOV R0,#30H
MOV 30H,#60H
MOV A,@R0
(A)=
2,以 Rn为目的操作数的指令
MOV Rn,A ; Rn ← (A),n=0~7
MOV Rn,direct ; Rn ← (direct)
MOV Rn,# data ; Rn ← # data
3.以直接地址为目的操作数的指令
MOV direct,A ; direct← (A)
MOV direct,Rn ; direct← (R n),n=0~7
MOV direct,@Ri ; direct← (( R i ) ),i=0,1
MOV direct,direct ; direct← (direct)
MOV direct,#data ; direct← # data
4,以寄存器间接地址为目的操作数指令
MOV @Ri,A ; (Ri)← (A),i=0,1
MOV @Ri,direct ; (Ri)← (direct)
MOV @Ri,# data ; (Ri)← # data
应用举例 1
MOV P1,#0FEH ; 11111110B
可以使 P1.0上的发光二极管点亮
MOV P1,#0F0H ; 11110000B
可以使 P1口上的上面 4个发光二极管点亮
P1.0 a
P1.1 b
P1.2 c
P1.3 d
P1.4 e
P1.5 f
P1.6 g
P1.7 dp
5v
8段数码管显示
P1.0 a
P1.1 b
P1.2 c
P1.3 d
P1.4 e
P1.5 f
P1.6 g
P1.7 dp
5v
MOV P1,#00H ; 显示 8.
MOV P1,#0F8H ; 显示 7
MOV P1,#88H ; 显示 A
应用举例 2
一个引脚的高低电平,可以通过,光电耦合器” 控制继电器,从而以“弱电”控制“强电”。
3.1 寻址方式指令的格式:
LOOP,MOV A,R0 ;将 R0的内容送 A
[标号 ] 操作码 第一操作数 第二操作数 [注释 ]
(目的操作数) (源操作数)
注:白色的内容不是必须的寻址方式:寻找(或确定)操作数所在单元地址的方式。
寻址方式越多,计算机寻址能力越强,但指令系统也越复杂。
说明:以下讨论的寻址方式都是针对源操作数的。但实际上目的操作数也有寻址问题。
3.1.1 寄存器寻址 MOV A,Rn
操作数在寄存器中,如 R0~R7,A,B,Cy(位),DPTR
3.1.2 直接寻址 MOV A,40H
操作数直接以单元地址形式给出(也可以寄存器名称形式给出,但 A B DPTR 除外)
如,MOV A,P0 ; MOV R0,TH0
3.1.3 寄存器间接寻址 MOV A,@R1
操作数是通过寄存器间接得到的。
3.1.4 立即寻址 MOV A,#40H
操作数在指令中直接给出。
3.1.5 基址寄存器加变址寄存器寻址以 DPTR或 PC为基址寄存器,以 A为变址寄存器,
以两者相加形成的 16位地址为操作数的地址。
MOVC A,@A+DPTR
MOVC A,@A+PC
5,16位数据传输指令
MOV DPTR,#data16; DPTR← # data16
DPTR----数据指针,为 SFR中 (DPH),(DPL)
MOV DPTR,#2010H
相当于,MOV DPH,#20H
MOV DPL,#10H
6,堆栈操作指令退栈指令 POP direct
如,(SP)=62H,(62H)=70H,(61H)=30H 时,执行
POP DPH ; ((SP)) →DPH,(SP) - 1=61H→SP
POP DPHL ; ((SP)) →DPL,(SP) - 1=60H→SP
结果,(DPTR)=7030H,(SP)=60H
进栈指令 PUSH direct
如,(SP)=60H,(A)=30H,(B)=70H 时,执行
PUSH Acc ; (SP)+1=61H→SP,(A) → 61H
PUSH B ; (SP)+1=62H→SP,(B) → 62H
结果,(61H)=30H,(62H)=70H,(SP)=62H
堆栈的存储原则:先进后出
(SP)
(SP+1)
(SP+2)
(SP+3)
7,累加器 A与外部数据传输指令
MOVX A,@DPTR ; A← ((DPTR))
地址范围 64K
MOVX A,@Ri ; A← ((Ri))
地址范围 0~ 255
MOVX @DPTR,A ; (DPTR) ←(A)
MOVX @Ri,A ; (Ri) ←(A)
8,查表指令
( 1) MOVC A,@A+DPTR; A ←((A)+(DPTR))
例,(DPTR)=0300H,( A)= 02H
ROM中 (0302H)=55H
执行:
MOVC A,@A+DPTR
结果,(A)=55H
( 2) MOVC A,@A+PC
A ←((A)+(pc))
PC--程序指针,指向下一条指令的地址例:根据 A中的内容( 0~ 9)查平方表
MOVC A,@A+PC 例子:
地址 机器码 源程序
ORG 0000H
0000 7403 MOV A,#03H
0002 83 MOVC A,@A+PC
0003 00 DB 00H
0004 01 DB 01H
0005 04 DB 04H
0006 09 DB 09H
0007 10 DB 10H
0008 19 DB 19H
0009 24 DB 24H
000A 31 DB 31H
000B 40 DB 40H
000C 51 DB 51H
(顺便讲解如何查机器码) END
9,字节交换指令
XCH A,Rn ; (A) ← → (Ri)
XCH A,direct ; (A) ← → (direct)
XCH A,@Ri ; (A) ← → (Ri)
例,(A)=80H,(R7)=97H
执行,XCH A,R7
结果,(A)=97H,(R7)=80H
例:将片内 RAM 60H单元与 61H单元的数据交换。
XCH 60H,61H ← 对吗?
习题
1,MOV A,#1000H ; A←1000H
2,MOVX A,1000H ; A←(1000H) 片外 RAM
3,MOVC A,1000H ; A←(1000H) 片外 ROM
4,MOVX 60H,A ;片外 RAM(60H)←A
5,MOV R0,60H ;片内 RAM,(61H)←(60H)
MOV 61H,@R0
6,XCH R1,R2 ; R1←→R2
7,MOVX DPTR,#2000H ; DPTR←2000H
8,MOVX 60H,@DPTR ; 片内 RAM← 片外 RAM
下列指令是否错误,如错请改正:
10.半字节交换指令
XCHD A,@Ri ; (A)0-3 ← → ((Ri )) 0-3
例,(R0)=60H,(60H)=3EH,(A)=59H
执行,XCHD A,@R0
结果,( A) = 5E H
( 60H)= 39 H
3.2.2 算术操作类指令
1,加法指令( Addtion)
2,带进位加法指令
3,加 1指令 ( Increase)
4,十进制调整指令
5,带借位减法指令( Subtraction)
6,减 1指令( Decrease)
7,乘法指令( Multiplication)
8,除法指令( Division)
1,加法指令( Addtion)
ADD A,Rn ; A← ( A) +( Rn)
ADD A,@Ri ; A← ( A) +( (Ri))
ADD A,direct ; A← ( A)+(direct)
ADD A,# data ; A← ( A)+#data
对标志位的影响
Cy ------ 进位位
AC ------ 半进位位
OV ------ 溢出位
PSW寄存器
C y AC F0 RS1 RS0 OV — P
Cy:进位标志位
AC:辅助进位标志位
F0,供用户使用的标志位
OV:溢出标志位
P:奇偶标志位
A中数据的奇偶性。当 1的个数为奇数,P=1,否则 P=0。
RS1 RS0
0 0 区 0(地址,00H~ 07H)
0 1 区 1(地址,08H~ 0FH)
1 0 区 2(地址,10H~ 17H)
1 1 区 3(地址,18H~ 1FH)
2,带进位加法指令
ADDC A,Rn ; A←(A)+(R n)+(Cy)
ADDC A,@Ri ; A←(A)+((R i )) +(Cy)
ADDC A,direct ; A← ( A)+(direct) +(Cy)
ADDC A,# data ; A← ( A)+#data +(Cy)
对标志位的影响与 ADD相同
3,加 1指令
INC A ; A←(A)+1
INC Ri ; Ri← ( A)+1
INC direct ; direct← ( direct)+1
INC @Ri ; (Ri)←((R i))+1
INC DPTR ; DPTR←(DPTR)+1
对标志位不产生影响若,( A)= 0FFH,(Cy)=0
执行,INC A
结果:( A)= 00H,(Cy)=0
4,十进制调整指令
DA A
用途:紧跟在 BCD码加法指令(不包括减法)之后,进行十进制调整。
( 96H 为压缩 BCD码,表示十位为 9,个位为 6,)
如两 BCD码加:
MOV A,#35H
ADD A,#46H
(A)=7BH,并不是 81H
但,DA A
后,( A)= 81H
5,带借位减法指令
( Subtraction)
SUBB A,Rn ; A← ( A)-(Rn)-(Cy)
SUBB A,@Ri ; A← ( A)-((Ri) ) -(Cy)
SUBB A,direct ; A← ( A)-(direct) -(Cy)
SUBB A,# data ; A← ( A)-#data -(Cy)
对标志位的影响
Cy ------ 进位位
AC ------ 半进位位
OV ------ 溢出位
6,减 1指令( Decrease)
DEC A ; A←(A) - 1
DEC Ri ; Ri← ( A)- 1
DEC direct ; direct← ( direct)- 1
DEC @Ri ; (Ri)←((R i))- 1
对标志位不产生影响若,( A)= 00H,(Cy)=0
执行,DEC A
结果:( A)= 0FFH,(Cy)=0
无 DEC DPTR 指令
7,乘法指令
( Multiplication)
MUL AB ; (A)× (B) 低 8位 → A
高 8位 → B
A,B中都是无符号整数如果积大于 255,OV= 1,否则 OV= 0;
进位标志总是清零 Cy= 0
8,除法指令( Division)
DIV AB ; (A)÷ (B) 商 → A
余数 → B
A,B中都是无符号整数如果除数 B为,0”,OV= 1,否则 OV= 0;
进位标志总是清零 Cy= 0
3.2.3 逻辑运算指令
1,简单逻辑操作指令
CLR A ; A←,0”
CPL A ; A← A
SWAP A ; A0~3 A4~7
例,(A)=3AH,CPL A,(A)=0C5H
0011 1010B → 1100 0101B
(A)=3AH,SWAP A,(A)=0A3H
2,循环指令左循环指令 ( Rotate Accumulator Left)
RL A
例 ( A)= 6CH = 0110 1100B
RL A
(A)=1101 1000B=0D8H
a7 ← a 0 C
带进位左循环指令( Rotate Accumulator
Left through Carry flag)
RLC A
例 ( A)= 6CH = 0110 1100B,(C) =1
RLC A
(A)=1101 1001B=0D9H
a7 ← a 0 C
右循环指令( Rotate Accumulator
Right)
RR A
例 ( A)= 6CH = 0110 1100B
RR A
(A)=0011 0110B=36H
a7 ← a 0 C
带进位右循环指令( Rotate A Right with C)
RRC A
例 ( A)= 6CH = 0110 1100B,(C) =1
RRC A
(A)=1011 0110B=0B6H
a7 ← a 0 C
2,逻辑与指令
ANL A,Rn
ANL A,direct
ANL A,# data
ANL A,@Ri
ANL direct,A
ANL direct,# data
∧ --,与,,,有 0即 0,全 1为 1”
0000 0111
∧ ) 1111 1101
0000 0101 B = 05H
3,逻辑或指令
ORL A,Rn
ORL A,direct
ORL A,# data
ORL A,@Ri
ORL direct,A
ORL direct,# data
∨ --,或,,,有 1即 1,全 0为 0”
0000 0110
∨ ) 0110 1101
0110 1111 B = 6FH
4,逻辑异或指令
XRL A,Rn
XRL A,direct
XRL A,# data
XRL A,@Ri
XRL direct,A
XRL direct,# data
--,异或,,,相异为 1,相同为 0”
0000 0110
) 0110 1101
0110 1011 B = 6BH
例 ( A) =01×××××× B,× 表示随机状态,为 1或 0,执行下述一组指令执行后 A的值如何?
XRL A,#0C0H ;将累加器 A的内容 D7,D6取反 0 1××××××
ORL A,#03H ;将累加器 A的内容 D1,D0置 1 1 1 0 1 0 0 0 0
ANL A,#0E7H ;将累加器 A的内容 D4,D3清 0 1 0××××××
0 0 0 0 0 0 1 1
1 0 ×××× 1 1
1 1 1 0 0 1 1 1
1 0 × 0 0 × 1 1
解,执行上述指令后,( A) =10× 00× 11B。
习题 1,如何将累加器 A中的数据高 4位清 0,低位不变?
习题 2,如何将寄存器 R2中的数据奇数位取反,偶数位不变?
3.2.4 控制转移类指令
1,跳转指令短跳指令 AJMP addr11
PC←addr11,跳转范围 2k
长跳指令 LJMP addr16
PC←addr16,跳转范围 64k
间接跳转指令 JMP @A+DPTR
PC← ( A)+( DPTR)
相对转移指令 SJMP rel
rel--机器码的相对偏移量,为 8位补码转移范围:前 128~后 127字节
rel=(目的地址-转移指令地址-转移指令字节数) 补
=(目的地址- PC当前值) 补编程时,可用标号代替转移目的地址,
rel 交给编译程序计算。
SJMP NEXT (或 AJMP NEXT,SJMP NEXT)
…
NEXT,…
原地踏步指令的指令,
HERE,SJMP HERE
常写成,SJMP $
PC←(PC)+2
PC←(PC)+rel
地址 机器码 源程序 注释
ORG 0000H ; 整个程序起始地址
0000 20 00 30 LJMP MAIN ; 跳向主程序
ORG 0030H ; 主程序起始地址
0030 C3 MAIN,CLR C ; MAIN为程序标号
0031 E6 LOOP,MOV A,@R0
0032 37 ADDC A,@R1
0033 08 INC R0
0034 DA FB DJNZ R1,LOOP ;相对转移
0036 80 03 SJMP NEXT
0038 78 03 MOV R0,#03H
003A 18 NEXT,DEC R0
003B 80FE SJMP $ ; HERE,SJMP HERE
END ; 结束标记程序中标号与地址之间的关系
2,条件转移指令
JZ rel ;( A)= 0,转移
JNZ rel ;( A) ≠0,转移
3,比较不相等转移指令
CJNE A,#data,rel; (A)=#data,继续 C←0
(A)> #data,转 C←0
(A)< #data,转 C←1
特点:只有<时,C←1
CJNE A,direct,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
4,减 1 不为 0 转移指令
DJNZ Rn,rel ; Rn ←(Rn ) - 1
(Rn ) ≠0,转移
(Rn ) = 0,继续
DJNZ direct,rel
例,延时子程序
delay,MOV R7,#03H
delay0,MOV R6,#19H
delay1,DJNZ R6,delay1
DJNZ R7,delay0
RET
5,调用子程序指令短调用指令
ACALL addr11
长调用指令
LCALL addr16
编程时,可用标号代替转移目的地址,
addr11,addr16 交给编译程序计算。
7,中断返回指令
NOP
6,子程序返回指令
8,空操作指令
RETI
RET
RET指令从堆栈弹出保存的 PC地址,实现子程序返回。
3.2.5 位操作指令
1,数据位传送指令
MOV C,bit ; bit 可直接寻址位 C←(bit)
MOV bit,C ; C 进位位 (bit) ← C
例:将位地址 20H的一位数传送到位地址 30H中:
MOV C,20H
MOV 30H,C
2,位变量修改指令
CLR C ; 将 C= 0
CLR bit
CPL C ; 将 C求反再存入 C
CPL bit ; 将 bit求反再存入 bit
SETB C ; 将 C= 1
SETB bit ; (bit) ← 1
3,位变量逻辑指令
ANL C,bit
ANL C,bit
ORL C,bit
ORL C,bit
4,条件转移类指令
JC rel ;如 C=1,转移
JNC rel ;如 C=0,转移
JB bit,rel ;如 bit=1,转移
JNB bit,rel ;如 bit=0,转移
JBC bit,rel ;如 bit=1,转移并 bit= 0
FFFFH
0000H
FFFFH
ROM 内 RAM 外 RAM
00H
FFH
寄存器区位寻址区数据缓冲区
SFR
20H
30H
80H
E0H
A
第 3章 MCS- 51指令系统指令的格式:
LOOP,MOV A,R0 ;将 R0的内容送 A
[标号 ] 操作码 第一操作数 第二操作数 [注释 ]
(目的操作数) (源操作数)
注:白色的内容不是必须的
3.2 数据传输类指令
1,以累加器 A为目的操作数的指令
MOV A,# data ; A← # data
MOV A,Rn ; n=0~7,A← (Rn)
MOV A,@Ri ; i=0,1,A← ((Ri))
MOV A,direct ; A← (Rn) direct为内部 RAM或 SFR地址注:
MOV A,@Ri 以 Ri的内容为地址,把该地址中的内容送到 A中去。 A← ((Ri))
MOV A,R0
MOV A,#20H ; (A) = 20H
MOV A,20H ; (A) = (20H),注意两组指令不同点
MOV R0,#30H
MOV 30H,#60H
MOV A,@R0
(A)=
2,以 Rn为目的操作数的指令
MOV Rn,A ; Rn ← (A),n=0~7
MOV Rn,direct ; Rn ← (direct)
MOV Rn,# data ; Rn ← # data
3.以直接地址为目的操作数的指令
MOV direct,A ; direct← (A)
MOV direct,Rn ; direct← (R n),n=0~7
MOV direct,@Ri ; direct← (( R i ) ),i=0,1
MOV direct,direct ; direct← (direct)
MOV direct,#data ; direct← # data
4,以寄存器间接地址为目的操作数指令
MOV @Ri,A ; (Ri)← (A),i=0,1
MOV @Ri,direct ; (Ri)← (direct)
MOV @Ri,# data ; (Ri)← # data
应用举例 1
MOV P1,#0FEH ; 11111110B
可以使 P1.0上的发光二极管点亮
MOV P1,#0F0H ; 11110000B
可以使 P1口上的上面 4个发光二极管点亮
P1.0 a
P1.1 b
P1.2 c
P1.3 d
P1.4 e
P1.5 f
P1.6 g
P1.7 dp
5v
8段数码管显示
P1.0 a
P1.1 b
P1.2 c
P1.3 d
P1.4 e
P1.5 f
P1.6 g
P1.7 dp
5v
MOV P1,#00H ; 显示 8.
MOV P1,#0F8H ; 显示 7
MOV P1,#88H ; 显示 A
应用举例 2
一个引脚的高低电平,可以通过,光电耦合器” 控制继电器,从而以“弱电”控制“强电”。
3.1 寻址方式指令的格式:
LOOP,MOV A,R0 ;将 R0的内容送 A
[标号 ] 操作码 第一操作数 第二操作数 [注释 ]
(目的操作数) (源操作数)
注:白色的内容不是必须的寻址方式:寻找(或确定)操作数所在单元地址的方式。
寻址方式越多,计算机寻址能力越强,但指令系统也越复杂。
说明:以下讨论的寻址方式都是针对源操作数的。但实际上目的操作数也有寻址问题。
3.1.1 寄存器寻址 MOV A,Rn
操作数在寄存器中,如 R0~R7,A,B,Cy(位),DPTR
3.1.2 直接寻址 MOV A,40H
操作数直接以单元地址形式给出(也可以寄存器名称形式给出,但 A B DPTR 除外)
如,MOV A,P0 ; MOV R0,TH0
3.1.3 寄存器间接寻址 MOV A,@R1
操作数是通过寄存器间接得到的。
3.1.4 立即寻址 MOV A,#40H
操作数在指令中直接给出。
3.1.5 基址寄存器加变址寄存器寻址以 DPTR或 PC为基址寄存器,以 A为变址寄存器,
以两者相加形成的 16位地址为操作数的地址。
MOVC A,@A+DPTR
MOVC A,@A+PC
5,16位数据传输指令
MOV DPTR,#data16; DPTR← # data16
DPTR----数据指针,为 SFR中 (DPH),(DPL)
MOV DPTR,#2010H
相当于,MOV DPH,#20H
MOV DPL,#10H
6,堆栈操作指令退栈指令 POP direct
如,(SP)=62H,(62H)=70H,(61H)=30H 时,执行
POP DPH ; ((SP)) →DPH,(SP) - 1=61H→SP
POP DPHL ; ((SP)) →DPL,(SP) - 1=60H→SP
结果,(DPTR)=7030H,(SP)=60H
进栈指令 PUSH direct
如,(SP)=60H,(A)=30H,(B)=70H 时,执行
PUSH Acc ; (SP)+1=61H→SP,(A) → 61H
PUSH B ; (SP)+1=62H→SP,(B) → 62H
结果,(61H)=30H,(62H)=70H,(SP)=62H
堆栈的存储原则:先进后出
(SP)
(SP+1)
(SP+2)
(SP+3)
7,累加器 A与外部数据传输指令
MOVX A,@DPTR ; A← ((DPTR))
地址范围 64K
MOVX A,@Ri ; A← ((Ri))
地址范围 0~ 255
MOVX @DPTR,A ; (DPTR) ←(A)
MOVX @Ri,A ; (Ri) ←(A)
8,查表指令
( 1) MOVC A,@A+DPTR; A ←((A)+(DPTR))
例,(DPTR)=0300H,( A)= 02H
ROM中 (0302H)=55H
执行:
MOVC A,@A+DPTR
结果,(A)=55H
( 2) MOVC A,@A+PC
A ←((A)+(pc))
PC--程序指针,指向下一条指令的地址例:根据 A中的内容( 0~ 9)查平方表
MOVC A,@A+PC 例子:
地址 机器码 源程序
ORG 0000H
0000 7403 MOV A,#03H
0002 83 MOVC A,@A+PC
0003 00 DB 00H
0004 01 DB 01H
0005 04 DB 04H
0006 09 DB 09H
0007 10 DB 10H
0008 19 DB 19H
0009 24 DB 24H
000A 31 DB 31H
000B 40 DB 40H
000C 51 DB 51H
(顺便讲解如何查机器码) END
9,字节交换指令
XCH A,Rn ; (A) ← → (Ri)
XCH A,direct ; (A) ← → (direct)
XCH A,@Ri ; (A) ← → (Ri)
例,(A)=80H,(R7)=97H
执行,XCH A,R7
结果,(A)=97H,(R7)=80H
例:将片内 RAM 60H单元与 61H单元的数据交换。
XCH 60H,61H ← 对吗?
习题
1,MOV A,#1000H ; A←1000H
2,MOVX A,1000H ; A←(1000H) 片外 RAM
3,MOVC A,1000H ; A←(1000H) 片外 ROM
4,MOVX 60H,A ;片外 RAM(60H)←A
5,MOV R0,60H ;片内 RAM,(61H)←(60H)
MOV 61H,@R0
6,XCH R1,R2 ; R1←→R2
7,MOVX DPTR,#2000H ; DPTR←2000H
8,MOVX 60H,@DPTR ; 片内 RAM← 片外 RAM
下列指令是否错误,如错请改正:
10.半字节交换指令
XCHD A,@Ri ; (A)0-3 ← → ((Ri )) 0-3
例,(R0)=60H,(60H)=3EH,(A)=59H
执行,XCHD A,@R0
结果,( A) = 5E H
( 60H)= 39 H
3.2.2 算术操作类指令
1,加法指令( Addtion)
2,带进位加法指令
3,加 1指令 ( Increase)
4,十进制调整指令
5,带借位减法指令( Subtraction)
6,减 1指令( Decrease)
7,乘法指令( Multiplication)
8,除法指令( Division)
1,加法指令( Addtion)
ADD A,Rn ; A← ( A) +( Rn)
ADD A,@Ri ; A← ( A) +( (Ri))
ADD A,direct ; A← ( A)+(direct)
ADD A,# data ; A← ( A)+#data
对标志位的影响
Cy ------ 进位位
AC ------ 半进位位
OV ------ 溢出位
PSW寄存器
C y AC F0 RS1 RS0 OV — P
Cy:进位标志位
AC:辅助进位标志位
F0,供用户使用的标志位
OV:溢出标志位
P:奇偶标志位
A中数据的奇偶性。当 1的个数为奇数,P=1,否则 P=0。
RS1 RS0
0 0 区 0(地址,00H~ 07H)
0 1 区 1(地址,08H~ 0FH)
1 0 区 2(地址,10H~ 17H)
1 1 区 3(地址,18H~ 1FH)
2,带进位加法指令
ADDC A,Rn ; A←(A)+(R n)+(Cy)
ADDC A,@Ri ; A←(A)+((R i )) +(Cy)
ADDC A,direct ; A← ( A)+(direct) +(Cy)
ADDC A,# data ; A← ( A)+#data +(Cy)
对标志位的影响与 ADD相同
3,加 1指令
INC A ; A←(A)+1
INC Ri ; Ri← ( A)+1
INC direct ; direct← ( direct)+1
INC @Ri ; (Ri)←((R i))+1
INC DPTR ; DPTR←(DPTR)+1
对标志位不产生影响若,( A)= 0FFH,(Cy)=0
执行,INC A
结果:( A)= 00H,(Cy)=0
4,十进制调整指令
DA A
用途:紧跟在 BCD码加法指令(不包括减法)之后,进行十进制调整。
( 96H 为压缩 BCD码,表示十位为 9,个位为 6,)
如两 BCD码加:
MOV A,#35H
ADD A,#46H
(A)=7BH,并不是 81H
但,DA A
后,( A)= 81H
5,带借位减法指令
( Subtraction)
SUBB A,Rn ; A← ( A)-(Rn)-(Cy)
SUBB A,@Ri ; A← ( A)-((Ri) ) -(Cy)
SUBB A,direct ; A← ( A)-(direct) -(Cy)
SUBB A,# data ; A← ( A)-#data -(Cy)
对标志位的影响
Cy ------ 进位位
AC ------ 半进位位
OV ------ 溢出位
6,减 1指令( Decrease)
DEC A ; A←(A) - 1
DEC Ri ; Ri← ( A)- 1
DEC direct ; direct← ( direct)- 1
DEC @Ri ; (Ri)←((R i))- 1
对标志位不产生影响若,( A)= 00H,(Cy)=0
执行,DEC A
结果:( A)= 0FFH,(Cy)=0
无 DEC DPTR 指令
7,乘法指令
( Multiplication)
MUL AB ; (A)× (B) 低 8位 → A
高 8位 → B
A,B中都是无符号整数如果积大于 255,OV= 1,否则 OV= 0;
进位标志总是清零 Cy= 0
8,除法指令( Division)
DIV AB ; (A)÷ (B) 商 → A
余数 → B
A,B中都是无符号整数如果除数 B为,0”,OV= 1,否则 OV= 0;
进位标志总是清零 Cy= 0
3.2.3 逻辑运算指令
1,简单逻辑操作指令
CLR A ; A←,0”
CPL A ; A← A
SWAP A ; A0~3 A4~7
例,(A)=3AH,CPL A,(A)=0C5H
0011 1010B → 1100 0101B
(A)=3AH,SWAP A,(A)=0A3H
2,循环指令左循环指令 ( Rotate Accumulator Left)
RL A
例 ( A)= 6CH = 0110 1100B
RL A
(A)=1101 1000B=0D8H
a7 ← a 0 C
带进位左循环指令( Rotate Accumulator
Left through Carry flag)
RLC A
例 ( A)= 6CH = 0110 1100B,(C) =1
RLC A
(A)=1101 1001B=0D9H
a7 ← a 0 C
右循环指令( Rotate Accumulator
Right)
RR A
例 ( A)= 6CH = 0110 1100B
RR A
(A)=0011 0110B=36H
a7 ← a 0 C
带进位右循环指令( Rotate A Right with C)
RRC A
例 ( A)= 6CH = 0110 1100B,(C) =1
RRC A
(A)=1011 0110B=0B6H
a7 ← a 0 C
2,逻辑与指令
ANL A,Rn
ANL A,direct
ANL A,# data
ANL A,@Ri
ANL direct,A
ANL direct,# data
∧ --,与,,,有 0即 0,全 1为 1”
0000 0111
∧ ) 1111 1101
0000 0101 B = 05H
3,逻辑或指令
ORL A,Rn
ORL A,direct
ORL A,# data
ORL A,@Ri
ORL direct,A
ORL direct,# data
∨ --,或,,,有 1即 1,全 0为 0”
0000 0110
∨ ) 0110 1101
0110 1111 B = 6FH
4,逻辑异或指令
XRL A,Rn
XRL A,direct
XRL A,# data
XRL A,@Ri
XRL direct,A
XRL direct,# data
--,异或,,,相异为 1,相同为 0”
0000 0110
) 0110 1101
0110 1011 B = 6BH
例 ( A) =01×××××× B,× 表示随机状态,为 1或 0,执行下述一组指令执行后 A的值如何?
XRL A,#0C0H ;将累加器 A的内容 D7,D6取反 0 1××××××
ORL A,#03H ;将累加器 A的内容 D1,D0置 1 1 1 0 1 0 0 0 0
ANL A,#0E7H ;将累加器 A的内容 D4,D3清 0 1 0××××××
0 0 0 0 0 0 1 1
1 0 ×××× 1 1
1 1 1 0 0 1 1 1
1 0 × 0 0 × 1 1
解,执行上述指令后,( A) =10× 00× 11B。
习题 1,如何将累加器 A中的数据高 4位清 0,低位不变?
习题 2,如何将寄存器 R2中的数据奇数位取反,偶数位不变?
3.2.4 控制转移类指令
1,跳转指令短跳指令 AJMP addr11
PC←addr11,跳转范围 2k
长跳指令 LJMP addr16
PC←addr16,跳转范围 64k
间接跳转指令 JMP @A+DPTR
PC← ( A)+( DPTR)
相对转移指令 SJMP rel
rel--机器码的相对偏移量,为 8位补码转移范围:前 128~后 127字节
rel=(目的地址-转移指令地址-转移指令字节数) 补
=(目的地址- PC当前值) 补编程时,可用标号代替转移目的地址,
rel 交给编译程序计算。
SJMP NEXT (或 AJMP NEXT,SJMP NEXT)
…
NEXT,…
原地踏步指令的指令,
HERE,SJMP HERE
常写成,SJMP $
PC←(PC)+2
PC←(PC)+rel
地址 机器码 源程序 注释
ORG 0000H ; 整个程序起始地址
0000 20 00 30 LJMP MAIN ; 跳向主程序
ORG 0030H ; 主程序起始地址
0030 C3 MAIN,CLR C ; MAIN为程序标号
0031 E6 LOOP,MOV A,@R0
0032 37 ADDC A,@R1
0033 08 INC R0
0034 DA FB DJNZ R1,LOOP ;相对转移
0036 80 03 SJMP NEXT
0038 78 03 MOV R0,#03H
003A 18 NEXT,DEC R0
003B 80FE SJMP $ ; HERE,SJMP HERE
END ; 结束标记程序中标号与地址之间的关系
2,条件转移指令
JZ rel ;( A)= 0,转移
JNZ rel ;( A) ≠0,转移
3,比较不相等转移指令
CJNE A,#data,rel; (A)=#data,继续 C←0
(A)> #data,转 C←0
(A)< #data,转 C←1
特点:只有<时,C←1
CJNE A,direct,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
4,减 1 不为 0 转移指令
DJNZ Rn,rel ; Rn ←(Rn ) - 1
(Rn ) ≠0,转移
(Rn ) = 0,继续
DJNZ direct,rel
例,延时子程序
delay,MOV R7,#03H
delay0,MOV R6,#19H
delay1,DJNZ R6,delay1
DJNZ R7,delay0
RET
5,调用子程序指令短调用指令
ACALL addr11
长调用指令
LCALL addr16
编程时,可用标号代替转移目的地址,
addr11,addr16 交给编译程序计算。
7,中断返回指令
NOP
6,子程序返回指令
8,空操作指令
RETI
RET
RET指令从堆栈弹出保存的 PC地址,实现子程序返回。
3.2.5 位操作指令
1,数据位传送指令
MOV C,bit ; bit 可直接寻址位 C←(bit)
MOV bit,C ; C 进位位 (bit) ← C
例:将位地址 20H的一位数传送到位地址 30H中:
MOV C,20H
MOV 30H,C
2,位变量修改指令
CLR C ; 将 C= 0
CLR bit
CPL C ; 将 C求反再存入 C
CPL bit ; 将 bit求反再存入 bit
SETB C ; 将 C= 1
SETB bit ; (bit) ← 1
3,位变量逻辑指令
ANL C,bit
ANL C,bit
ORL C,bit
ORL C,bit
4,条件转移类指令
JC rel ;如 C=1,转移
JNC rel ;如 C=0,转移
JB bit,rel ;如 bit=1,转移
JNB bit,rel ;如 bit=0,转移
JBC bit,rel ;如 bit=1,转移并 bit= 0