第三章
MCS-51单片机指令系统
3.1 MCS-51单片机指令格式
一条汇编语言指令中最多包含 4个区段, 如下所示:
? 标号:操作码 目的操作数, 源操作数 ;注释
? 标号与操作码之间,,”隔开;
? 操作码与操作数之间用, 空格, 隔开;
? 目的操作数和源源操作数之间有,,, 分隔;
? 操作数与注释之间用, ;, 隔开 。
3.1 MCS-51单片机指令格式
标号是由用户定义的符号组成, 必须用英文大写字母
开始 。 标号可有可无, 若一条指令中有标号, 标号代表该
指令所存放的第一个字节存储单元的地址, 故标号又称为
符号地址, 在汇编时, 把该地址赋值给标号 。
操作码是指令的功能部分, 不能缺省 。 MCS— 51指令系统
中共有 42种助记符, 代表了 33种不同的功能 。 例如 MOV是
数据传送的助记符 。
操作数是指令要操作的数据信息 。 根据指令的不同功
能, 操作数的个数有 3,2,1或没有操作数 。 例如 MOV A,
#20H,包含了两个操作数 A和 #20H,它们之间用,,, 隔
开 。 注释可有可无, 加入注释主要为了便于阅读, 程序设
计者对指令或程序段作简要的功能说明, 在阅读程序或调
试程序时将会带来很多方便 。
3.2 寻址方式
所谓寻址方式,通常是指某一个 CPU指令系统中规
定的寻找操作数所在地址的方式,或者说通过什么的
方式找到操作数。寻址方式的方便与快捷是衡量 CPU性
能的一个重要方面,MCS— 51单片机有七种寻找方式。
3.2.1 立即数寻址
立即寻址方式是操作数包括在指令字节中, 指令
操作码后面字节的内容就是操作数本身, 其数值由程
序员在编制程序时指定, 以指令字节的形式存放在程
序存储器中 。 立即数只能作为源操作数, 不能当作目
的操作数 。
例如,MOV A,#52H ; A?52H
MOV DPTR,#5678H ; DPTR?5678H
立即寻址示意图如 3.1所示。
? 图 3.1 立即寻址示意图
3.2.2 直接寻址
在指令中含有操作数的直接地址, 该地址指出了参与
操作的数据所在的字节地址或位地址 。
例如:
MOV A,52H ;把片内 RAM字节地址 52H单元的内
容送累加器 A中。
MOV 52H,A ;把 A的内容传送给片内 RAM的 52H
单元中。
MOV 50H,60H ;把片内 RAM字节地址 60H单元的内
容送到 50H单元中。
MOV IE,#40H ;把立即数 40H送到中断允许寄存器
IE。 IE为专用功能寄存器,其字节
地址为 0A8H。该指令等价于 MOV
0A8H,#40H。
INC 60H ;将地址 60H单元中的内容自加 1。
图 3.2直接寻址方式示意图
3.2.3 寄存器寻址
由指令指出某一个寄存器中的内容作为操作数,
这种寻址方式称为寄存器寻址。寄存器一般指累加器 A
和工作寄存器 R0~R7。例如:
MOV A,Rn ; A?( Rn) 其中 n为 0~7之一,
Rn是工作寄存器。
MOV Rn,A ; Rn?( A)
MOV B,A ; B?( A)
3.2.4 寄存器间接寻址方式
由指令指出某一个寄存器的内容作为操作数,这种
寻址方式称为寄存器间接寻址。寄存器间接寻址只能使
用寄存器 Ro或 Rl作为地址指针,来寻址内部 RAM(00H~
FFH)中的数据。寄存器间接寻址也适用于访问外部 RAM,
可使用 R0,Rl或 DPTR作为地址指针。寄存器间接寻址用
符号, @”表示。
例如:
MOV R0,#60H ; R0?60H
MOV A,@R0 ; A ? ((R0))
MOV A, @R1 ; A ? ((R1))
例如,MOV DPTR,#3456H ; DPTR?3456H
MOVX A,@ DPTR ; A ?(( DPTR)) 是把
DPTR寄存器所指的那个外部数据存储器 ( RAM) 的内容传
送给 A,假设 ( 3456H) =99H,指令运行后 ( A) =99H。
图 3.3 寄存器间接寻址方式示意图
3.2.5 位寻址
MCS-51单片机中设有独立的位处理器。位操作指
令能对内部 RAM中的位寻址区( 20H~ 2FH)和某些有位
地址的特殊功能寄存器进行位操作。
SETB TR0 ; TR0?1
CLR 00H ; (00H)?0
MOV C,57H ;将 57H位地址的内容传送到
位累加器 C中
ANL C,5FH ;将 5FH位状态与进位位 C相与,
结果在 C中
3.2.6 基址寄存器加变址寄存器间接寻址
这种寻址方式用于访问程序存储器中的数据表格,
它以基址寄存器( DPTR或 PC)的内容为基本地址,加
上变址寄存器 A的内容形成 16位的地址,访问程序存储
器中的数据表格。
例如,
MOVC A,@ A + DPTR
MOVC A,@ A + PC
JMP @A+ DPTR
MOVC A,@A+DPTR
图 3.4 变址寻址方式示意图
3.2.7 相对寻址
相对寻址以程序计数器 PC的当前值作为基地址,
与指令中给出的相对偏移量 rel进行相加, 把所得之和
作为程序的转移地址 。 例如:
JZ LOOP
DJNE R0,DISPLAY
3.3 指令系统
3.3.1 指令分类
MCS-51指令系统有 42种助记符,代表了 33种功能,指
令助记符与各种可能的寻址方式相结合,共构成 111条指令。
按指令的功能,MCS-51指令系统可分为下列 5类:
( 1)数据传送类指令( 29条)
( 2)算术运算类指令( 24条)
( 3)逻辑运算及移位类指令( 24条)
( 4)位操作类指令( 17条)
( 5)控制转移类指令( 17条)
3.3.1 指令分类
在分类介绍指令前, 先把描述指令的一些符号的意义作
一简单介绍 。
Rn― 当前选定的寄存器区中的 8个工作寄存器 R0~ R7,
即 n=0~ 7。
Ri― 当前选定的寄存器区中的 2个寄存器 R0,R1,i=0,1。
Direct— 8位内部 RAM单元的地址, 它可以是一个内部
数据区 RAM单元 ( 00H~ 7FH) 或特殊功能寄存器地址 ( I/O端
口, 控制寄存器, 状态寄存器 80H~ 0FFH) 。
#data— 指令中的 8位常数 。
#data16— 指令中的 16位常数 。
addr16— 16位的目的地址, 用于 LJMP,LCALL,可指向
64KB程序存储器的地址空间 。
addr11— 11位的目的地址, 用于 AJMP,ACALL指令 。 目
的地址必须与下一条指令的第一个字节在同一个 2KB程序存
储器地址空间之内 。
rel— 8位带符号的偏移量字节,用于 SJMP和所有条
件转移指令中。偏移量相对于下一条指令的第一个字节
计算,在 — 128~ +127范围内取值。
bit— 内部数据 RAM或特殊功能寄存器中的可直接寻
址位。
DPTR— 数据指针,可用作 16位的地址寄存器。
A— 累加器
B— 寄存器,用于 MUL和 DIV指令中。
C— 进位标志或进位位。
@ — 间接寄存器或基址寄存器的前缀,如@ Ri,@
DPTR。
/ — 位操作的前缀,表示对该位取反。
( X) — X中的内容。
(( X)) — 由 X寻址的单元中的内容。
← — 箭头左边的内容被箭头右边的内容所替代。
3.3.2 数据传送类指令
数据传送类指令一般的操作是把源操作数传送到指
令所指定的目标地址 。 指令执行后, 源操作数保持不变,
目的操作数为原操作数所替代
数据传送类指令用到的助记符有,MOV,MOVX,
MOVC,XCH,XCHD,PUSH,POP,SWAP。
数据一般传送指令的助记符, MOV”表示
格式,MOV [目的操作数 ],[源操作数 ]
功能:目的操作数 ?( 源操作数中的数据 )
源操作数可以是,A,Rn,direct,@Ri,#data
目的操作数可以是,A,Rn,direct,@Ri
数据传送指令一般不影响标志, 只有一种堆栈操作
可以直接修改程序状态字 PSW,这样, 可能使某些标志
位发生变化 。
1,以累加器为目的操作数的内部数据传送指令
MOV A,Rn ; A?( Rn)
MOV A,direct ; A?( direct)
MOV A,@Ri ; A?(( Ri))
MOV A,#data ; A?data
2,数据传送到工作寄存器 Rn的指令
MOV Rn,A ; Rn?( A)
MOV Rn,direct ; Rn?( direct)
MOV Rn,#data ; Rn?data
3.数据传送到内部 RAM单元或特殊功能寄存器 SFR的指令
MOV direct,A ; direct?( A)
MOV direct,Rn ; direct?( Rn)
MOV direct1,direct2 ; direct1 ?( direct2)
MOV direct,@Ri ; direct?(( Ri))
MOV direct,#data ; direct?#data
MOV @Ri,A ; ( Ri?( A )
MOV @Ri,direct ; ( Ri) ?( direct)
MOV @Ri,#data ; ( Ri) ?data
MOV DPTR,#data16 ; DPTR?data16
片内数据 RAM及寄存器的数据传送指令 MOV,PUSH和
POP共 18条, 如图 3.5所示 。
D PTR
@Ri A Rn
#da t a di r ect
D PTR
M O V M O V
M O V
M O V
M O V
M O V
M
O
V
M
O
V
M
O
V
M
O
V
PUSH
POP
4,累加器 A与外部数据存储器之间的传送指令
片外数据存储器数据传送指令 MOVX共 4条,如图 3.6所示。
MOVX A,@DPTR ; A?( DPTR)
MOVX A,@Ri ; A?(( Ri))
MOVX @DPTR,A ; ( DPTR) ?A
MOVX @Ri,A ; ( Ri) ?A
@ D PTR@ Ri
A
M
O V
X M O V
X
图 3.6 片外数据存储器数据传送指令
5,程序存储器内容送累加器
MOVC A,@ A+PC
MOVC A,@ A+DPTR
程序存储器查表指令 MOVC共 2条, 如图 3.7所示 。
图 3.7 片外数据存储器数据传送指令
@ A+DPT R@ A+PC
A
M
O V
C M O V
C
6,堆栈操作指令
PUSH direct
POP direct
例如:进入中断服务程序时, 把程序状态寄存器
PSW,累加器 A,数据指针 DPTR进栈保护 。 设当前 SP为
60H。 则程序段
PUSH PSW
PUSH ACC
PUSH DPL
PUSH DPH
执行后, SP内容修改为 64H,而 61H,62H,63H、
64H单元中依次栈入 PSW,A,DPL,DPH的内容, 当中断
服务程序结束之前, 如下程序段 ( SP保持 64H不变 )
POP DPH
POP DPL
POP ACC
POP PSW
指令执行之后, SP内容修改为 60H,而 64H,63H、
62,61H单元的内容依次弹出到 DPH,DPL,A,PSW中 。
7,字节交换指令
数据交换主要是在内部 RAM单元与累加器 A之间进
行, 有整字节和半字节两种交换 。
( 1) 整字节交换指令
XCH A,Rn ; ( A) ?( Rn)
XCH A,
direct; ( A ) ?
( direct)
XCH A,@Ri ; ( A ) ?
(( Ri))
8位数 据 8位数 据
X C H
( 2) 半字节交换指令
字节单元与累加器 A进行低 4位的半字节数据交换 。
只有一条指令 。
XCHD A,@Ri
( 3) 累加器高低半字节交换指令
只有一条指令:
SWAP A
高4 位 低4 位
S W A P
XC HD
高4 位 低4 位 高4 位 低4 位
【 例 3-1】 ( R0) = 30H,( A) = 65H,( 30H) = 8FH
执行指令:
XCH A,@R0 ;(R0) = 30H,( A) = 8FH,( 30H) = 65H
XCHD A,@ R0;( R0) = 30H,( A) = 6FH,( 30H) = 85H
SWAP A ;( A) = 56H
数据交换指令 XCH,XCHD,和 SWAP共 5条, 如图 3.8所示 。
图 3.8 数据交换指令
A@ Ri Rn
d i r e c tS W AP
XCH
XCHD
XCH
X C
H
3.3.3 算术运算类指令
1.加法指令
加法指令分为普通加法指令、带进位加法指令和加 1
指令。
( 1)普通加法指令
ADD A,Rn ; A?( A) +( Rn)
ADD A,direct ; A?( A) +( direct)
ADD A,@Ri ; A?( A) +(( Ri))
ADD A,#data ; A?( A) + data
【 例 3-2】 ( A) =85H,R0=20H,( 20H) =0AFH,执行指
令:
ADD A,@R0
10000101
+10101111
1 00110100
结果:( A) =34H; Cy=1; AC=1; OV=1。
对于加法,溢出只能发生在两个加数符号相同的
情况。在进行带符号数的加法运算时,溢出标志 OV是
一个重要的编程标志,利用它可以判断两个带符号数
相加,和数是否溢出。
( 2)带进位加法指令
【 例 3-3】 ( A) =85H,( 20H) =0FFH,Cy=1执行指令:
ADDC A,20H
结果:( A) =85H; Cy=1; AC=1; OV=0。
ADDC A,Rn ; A?( A) +( Rn) +( Cy)
ADDC A,direct ; A?( A) +( direct) +( Cy)
ADDC A,@Ri ; A?( A) +(( Ri)) +( Cy)
ADDC A,#data ; A?( A) + data+( Cy)
( 3)增量指令
【 例 3-4】 ( A) = 12H,( R3) = 0FH,( 35H) = 4AH,
( R0) = 56H,( 56H) = 00H
执行如下指令:
INC A ;执行后 ( A) = 13H
INC R3 ;执行后 ( R3) = 10H
INC 35H ;执行后 ( 35H) = 4BH
INC @ R0 ;执行后 ( 56H) = 01H
INC A ; A?( A) +1
INC Rn ; Rn ?( Rn) +1
INC direct ; direct ?( direct) +1
INC @Ri ; ( Ri) ?(( Ri)) +1
INC DPTR ; DPTR ?( DPTR) +1
( 4) 十进制调整指令
DA A
执行该指令时, 判断 A中的低 4位是否大于 9,若满足大
于则低 4位做加 6操作;
同样, A中的高 4位大于 9则高 4位加 6操作 。
例如:有两个 BCD数 36与 45相加, 结果应为 BCD码 81,程
序如下:
MOV A,#36H
ADD A,#45H
DA A
得结果 7BH;第三条指令对累加器 A进行十进制调整,低
4位(为 0BH)大于 9,因此要加 6,最后得到调整的 BCD
码 81。
2,减法指令
( 1)带进位减法指令
( 2)减 1指令
SUBB A,Rn ; A?( A) - ( Rn) - ( Cy)
SUBB A,direct ; A?( A) - ( direct) - ( Cy)
SUBB A,@Ri ; A?( A) - ( Ri) - ( Cy)
SUBB A,#data ; A?( A) - data- ( Cy)
DEC A ; A?( A) - 1
DEC Rn ; Rn?( Rn) - 1
DEC direct ; direct?( direct) - 1
DEC @Ri ;( Ri) ?(( Ri))- 1
3.乘法指令
乘法指令完成单字节的乘法, 只有一条指令:
MUL AB
【 例 3-5】 ( A) = 50H,( B) = 0A0H,执行指令:
MUL AB
结果,( B) = 32H,( A) = 00H( 即乘积为 3200H),
Cy= 0,OV= 1。
4.除法指令
除法指令完成单字节的除法, 只有一条指令:
DIV AB
算术运算类指令包括,ADD,ADDC,SUBB,MUL、
DIV,INC,DEC和 DA,如图 3.9所示。
图 3.9 算术运算类指令
I N C
D E C
@R i A Rn
#dat a
di r ect
B
D PT RD PT R
I N C
D E C
DA
I N C
D E C
I N C
D E C
I N C
ADD, ADDC
SU B B
ADD, ADDC
SU B B
A
D
D
、
A
D
D
C
、
S
U
B
BA
D
D
、
A
D
D
C
、
S
U
B
B
MU L
D I V
3.3.4 逻辑运算指令
1,简单逻辑操作指令
CLR A ;对累加器 A清, 0”
CPL A ;对累加器 A按位取反
RL A ;累加器 A的内容向左循环移 1位
RLC A ;累加器 A的内容带进位标志向左循环移 1位
RR A ;累加器 A的内容向右循环移 1位
RRC A ;累加器 A的内容带进位标志向右循环移 1位
循环左移指令示意图,RL A
循环右移指令示意图,RR A
带进位的循环左移指令示意图,RLC A
带进位的循环右移指令示意图,RRC A
A7 A6 A5 A4 A3 A2 A1 A0
A7 A6 A5 A4 A3 A2 A1 A0
A7 A6 A5 A4 A3 A2 A1 A0CY
A7 A6 A5 A4 A3 A2 A1 A0CY
2.逻辑与指令
【 例 3-6】 ( A) = 37H,( R0) = 0A9H 执行指令:
ANL A,R0
结果:( A)= 21H
ANL A,Rn ; A?( A) ?( Rn)
ANL A,direct ; A?( A) ?( direct)
ANL A,@Ri ; A?( A) ?(( Ri))
ANL A,#data ; A?( A) ?data
ANL direct,A ; direct?( direct) ?( A)
ANL direct,#data ; direct?( direct) ?data
3,逻辑或指令
【 例 3-7】 ( A) = 37H,( P1) = 09H 执行指令:
ORL P1,A
结果:( A)= 3FH
ORL A,Rn ; A?( A) ?( Rn)
ORL A,direct ; A?( A) ?( direct)
ORL A,@Ri ; A?( A) ?(( Ri))
ORL A,#data ; A?( A) ?data
ORL direct,A ; direct?( direct) ?( A)
ORL direct,#data ; direct?( direct) ?data
4,逻辑异或指令
XRL A,Rn ; A?( A) ?( Rn)
XRL A,direct ; A?( A) ?( direct)
XRL A,@Ri ; A?( A) ?(( Ri))
XRL A,#data ; A?( A) ?data
XRL direct,A ; direct ?( direct) ?( A)
XRL direct,#data ; direct?( direct) ?data
图 3.10 逻辑运算类指令
@R i A Rn
#dat a
di r ect
RL, RLC
RR, RRC
CLR, C PL
ANL, O R L ANL, O R L
X R L X R L
ANL, O R L, X R L
A
N
L
、
O
R
L
、
X
R
L
A
N
L
、
O
R
L
、
X
R
L
3.3.5 控制转移指令
1,无条件转移指令
( 1) 绝对转移指令
AJMP addr11
这是 2KB范围内的无条件跳转指令, 执行该指令时,
先将 PC+2,然后将 addr11送入 PC10~ PC0,而 PC15~ PC11
保持不变 。
操作过程可表示为,PC?( PC) + 2
PC10~ 0?addr11
( 2) 相对转移指令
SJMP rel
执行指令时, 先将 PC+2,再把指令中带符号的偏移
量加到 PC上, 得到跳转的目的地址送入 PC。
目标地址 =源地址 +2+rel
( 3) 长跳转指令
LJMP addr16 ; PC ?addr16
执行该指令时, 将 16位目标地址 addr16装入 PC,
程序无条件转向指定的目标地址 。 转移指令的目标地
址可在 64KB程序存储器地址空间的任何地方, 不影响
任何标志 。
( 4) 间接转移指令 ( 散转指令 )
JMP @A+DPTR ; PC ?( A) + ( DPTR)
2,条件转移指令
3,比较转移指令
在 MCS-51中没有专门的比较指令,但提供了下面
4条比较不相等转移指令;
4,减 1不为 0转移指令
DJNZ Rn,rel ; Rn ?( Rn ) - 1?0转移
DJNZ direct,rel ; direct ?( direct)- 1?0转移
JZ rel ; ( A) =0转移
JNZ rel ; ( A) ≠0转移
CJNE A,direct,rel ; ( A) ?( direct) 转移
CJNE A,#data,rel ; ( A) ? data转移
CJNE Rn,#data,rel ; ( Rn) ?data转移
CJNE @Ri,#data,rel ; (( Ri)) ?data转移
5,调用及返回指令
( 1) 绝对调用指令
ACALL addr11
执行该指令时, PC ?PC+ 2
SP?( SP) + 1,( SP) ?( PC) 7~ 0
SP?( SP) + 1,( SP) ?( PC) 15~ 8
PC10~ 0?addr11
( 2) 长调用指令
LCALL addr16
这条指令无条件调用位于 16位地址 addr16的子程序 。
其操作过程如下:
PC ?PC+ 3
SP?( SP) + 1,( SP) ?( PC) 7~ 0
SP?( SP) + 1,( SP) ?( PC) 15~ 8
PC10~ 0?addr16
( 3)子程序返回指令
RET
子程序返回指令是把栈顶相邻两个单元的内容弹
出送到 PC,SP的内容减 2,程序返回 PC值所指的指令
处执行。 RET指令通常安排在子程序的末尾,使程序
能从子程序返回到主程序。
( 4)中断返回指令
RETI
这是指令的功能与 RET指令相类似。通常安排在
中断服务程序的最后。
(5)空操作指令
NOP ; PC ?PC+ 1
空操作也是 CPU控制指令,它没有使程序转移的
功能。只消耗一个机器周期的时间。常用于程序的等
待或时间的延迟。
图 3.11 条件转移类指令
@Ri A Rn
di r ect#da t a
JZ, JN Z
D JN Z
D JN Z
C
J N
Z
C
J
N
Z
CJN Z
C
J
N
Z
r el
- 128
+ 127
3.3.6 位操作指令
1,位数据传送指令
2,位变量修改指令
CLR C ; Cy?0
CLR bit ; bit?0
CPL C ; Cy?( Cy)
CPL bit ; bit?(bit)
SETB C ; Cy?1
SETB bit ; bit?1
3,位变量逻辑与指令
ANL C,bit ; Cy ?( Cy) ?( bit)
ANL C,/bit ; Cy ?( Cy) ?( /bit)
MOV C,bit ; Cy?( bit)
MOV bit,C ; bit?( Cy)
4,位变量逻辑或指令
ORL C,bit ; Cy ?( Cy) ?( bit)
ORL C,/bit ; Cy ?( Cy) ?( /bit)
位操作类指令如图 3.12所示 。
图 3.12 位操作类指令
bi t
bi t
C
CLR
SETB
CPL
CLR
SETB
CPL
M OV
ANL, OR L
A
N
L
、
O
R
L
5,位变量条件转移指令
JC rel ;若 ( Cy) =1,则转移 PC←(PC)+ 2+rel
JNC rel ;若 ( Cy) =0,则转移 PC←(PC)+ 2+rel
JB bit,rel ;若 ( bit) =1,则转移 PC←(PC)+ 3+rel
JNB bit,rel ;若 ( bit) =0,则转移 PC←(PC)+ 3+rel
JBC bit,rel ;若 ( bit) =1,则转移 PC←(PC)+ 3+rel,并 bit← 0
图 3.13 位条件转移指令
以上介绍了 MCS-51指令系统,理解和掌握本章内
容,是应用 MCS-51单片机的一个重要前提。
C
bi t
JC, J NC
r el
- 12 8
+127
JB, J BC, J NB
【 例 3-8】 指出下列程序段的每条指令的源操作数是什么
寻址方式,并写出每步运算的结果。(相关单元的内
容)设程序存储器( 1050H) =5AH:
MOV A,#0FH ; A=0FH, 立即寻址
MOV 30H,#0F0H ; (30H)=F0H,立即寻址
MOV R2,A ; R2=0FH, 寄存器寻址
MOV R1,#30H ; R1=30H, 立即寻址
MOV A,@R1 ; A=F0H, 寄存器间接寻址
MOV DPTR,#1000H ; DPTR=1000H,立即寻址
MOV A,#50H ; A=50H,立即寻址
MOVC A,@ A+ DPTR ; A=5AH,基址变址寻址
JMP @A+DPTR ; PC目标= 105AH,基址变址寻址
CLR C ; C=0,寄存器寻址
MOV 20H,C ; ( 20H) =0,寄存器寻址
【 例 3-9】 用数据传送指令实现下列要求的数据传送。
( 1) R0的内容输出到 R1。
( 2)内部 RAM 20H单元的内容传送到 A中。
( 3)外部 RAM 30H单元的内容送到 R0。
( 4)外部 RAM 30H单元的内容送内部 RAM20H单元。
( 5)外部 RAM 1000H单元的内容送内部 RAM 20H单元。
( 6)程序存储器 ROM 2000H单元的内容送 R1。
( 7) ROM 2000H单元的内容送内部 RAM 20H单元。
( 8) ROM 2000H单元的内容送外部 RAM 30H 单元。
ROM 2000H单元的内容送外部 RAM 1000H单元。
解
(1) MOV A,R0
MOV R1,A
(2) MOV A,20H
(3) MOV R0,#30H 或 MOV R1,#30H
MOVX A,@R0
MOVX A,@R1
MOV R0,A
MOV R0,A
(4) MOV R0,#30H 或 MOV R1,#30H
MOVX A,@R0
MOVX A,@R1
MOV 20H,A
MOV 20H,A
( 5) MOV DPTR,#1000H
MOVX A,@1000H
MOV 20H,A
(6) MOV DPTR,#2000H
CLR A
MOVC A,@A+DPTR
MOV R1,A
(7) MOV DPTR,#2000H
CLR A
MOVC A,@A+DPTR
MOV 20H,A
(8) MOV DPTR,#2000H
CLR A
MOVC A,@A+DPTR
MOV R0,#30H
MOVX @R0,A
(9) MOV DPTR,#2000H
CLR A
MOVC A,@A+DPTR
MOV DPTR,#1000H
MOVX @DPTR,A
MCS-51单片机指令系统
3.1 MCS-51单片机指令格式
一条汇编语言指令中最多包含 4个区段, 如下所示:
? 标号:操作码 目的操作数, 源操作数 ;注释
? 标号与操作码之间,,”隔开;
? 操作码与操作数之间用, 空格, 隔开;
? 目的操作数和源源操作数之间有,,, 分隔;
? 操作数与注释之间用, ;, 隔开 。
3.1 MCS-51单片机指令格式
标号是由用户定义的符号组成, 必须用英文大写字母
开始 。 标号可有可无, 若一条指令中有标号, 标号代表该
指令所存放的第一个字节存储单元的地址, 故标号又称为
符号地址, 在汇编时, 把该地址赋值给标号 。
操作码是指令的功能部分, 不能缺省 。 MCS— 51指令系统
中共有 42种助记符, 代表了 33种不同的功能 。 例如 MOV是
数据传送的助记符 。
操作数是指令要操作的数据信息 。 根据指令的不同功
能, 操作数的个数有 3,2,1或没有操作数 。 例如 MOV A,
#20H,包含了两个操作数 A和 #20H,它们之间用,,, 隔
开 。 注释可有可无, 加入注释主要为了便于阅读, 程序设
计者对指令或程序段作简要的功能说明, 在阅读程序或调
试程序时将会带来很多方便 。
3.2 寻址方式
所谓寻址方式,通常是指某一个 CPU指令系统中规
定的寻找操作数所在地址的方式,或者说通过什么的
方式找到操作数。寻址方式的方便与快捷是衡量 CPU性
能的一个重要方面,MCS— 51单片机有七种寻找方式。
3.2.1 立即数寻址
立即寻址方式是操作数包括在指令字节中, 指令
操作码后面字节的内容就是操作数本身, 其数值由程
序员在编制程序时指定, 以指令字节的形式存放在程
序存储器中 。 立即数只能作为源操作数, 不能当作目
的操作数 。
例如,MOV A,#52H ; A?52H
MOV DPTR,#5678H ; DPTR?5678H
立即寻址示意图如 3.1所示。
? 图 3.1 立即寻址示意图
3.2.2 直接寻址
在指令中含有操作数的直接地址, 该地址指出了参与
操作的数据所在的字节地址或位地址 。
例如:
MOV A,52H ;把片内 RAM字节地址 52H单元的内
容送累加器 A中。
MOV 52H,A ;把 A的内容传送给片内 RAM的 52H
单元中。
MOV 50H,60H ;把片内 RAM字节地址 60H单元的内
容送到 50H单元中。
MOV IE,#40H ;把立即数 40H送到中断允许寄存器
IE。 IE为专用功能寄存器,其字节
地址为 0A8H。该指令等价于 MOV
0A8H,#40H。
INC 60H ;将地址 60H单元中的内容自加 1。
图 3.2直接寻址方式示意图
3.2.3 寄存器寻址
由指令指出某一个寄存器中的内容作为操作数,
这种寻址方式称为寄存器寻址。寄存器一般指累加器 A
和工作寄存器 R0~R7。例如:
MOV A,Rn ; A?( Rn) 其中 n为 0~7之一,
Rn是工作寄存器。
MOV Rn,A ; Rn?( A)
MOV B,A ; B?( A)
3.2.4 寄存器间接寻址方式
由指令指出某一个寄存器的内容作为操作数,这种
寻址方式称为寄存器间接寻址。寄存器间接寻址只能使
用寄存器 Ro或 Rl作为地址指针,来寻址内部 RAM(00H~
FFH)中的数据。寄存器间接寻址也适用于访问外部 RAM,
可使用 R0,Rl或 DPTR作为地址指针。寄存器间接寻址用
符号, @”表示。
例如:
MOV R0,#60H ; R0?60H
MOV A,@R0 ; A ? ((R0))
MOV A, @R1 ; A ? ((R1))
例如,MOV DPTR,#3456H ; DPTR?3456H
MOVX A,@ DPTR ; A ?(( DPTR)) 是把
DPTR寄存器所指的那个外部数据存储器 ( RAM) 的内容传
送给 A,假设 ( 3456H) =99H,指令运行后 ( A) =99H。
图 3.3 寄存器间接寻址方式示意图
3.2.5 位寻址
MCS-51单片机中设有独立的位处理器。位操作指
令能对内部 RAM中的位寻址区( 20H~ 2FH)和某些有位
地址的特殊功能寄存器进行位操作。
SETB TR0 ; TR0?1
CLR 00H ; (00H)?0
MOV C,57H ;将 57H位地址的内容传送到
位累加器 C中
ANL C,5FH ;将 5FH位状态与进位位 C相与,
结果在 C中
3.2.6 基址寄存器加变址寄存器间接寻址
这种寻址方式用于访问程序存储器中的数据表格,
它以基址寄存器( DPTR或 PC)的内容为基本地址,加
上变址寄存器 A的内容形成 16位的地址,访问程序存储
器中的数据表格。
例如,
MOVC A,@ A + DPTR
MOVC A,@ A + PC
JMP @A+ DPTR
MOVC A,@A+DPTR
图 3.4 变址寻址方式示意图
3.2.7 相对寻址
相对寻址以程序计数器 PC的当前值作为基地址,
与指令中给出的相对偏移量 rel进行相加, 把所得之和
作为程序的转移地址 。 例如:
JZ LOOP
DJNE R0,DISPLAY
3.3 指令系统
3.3.1 指令分类
MCS-51指令系统有 42种助记符,代表了 33种功能,指
令助记符与各种可能的寻址方式相结合,共构成 111条指令。
按指令的功能,MCS-51指令系统可分为下列 5类:
( 1)数据传送类指令( 29条)
( 2)算术运算类指令( 24条)
( 3)逻辑运算及移位类指令( 24条)
( 4)位操作类指令( 17条)
( 5)控制转移类指令( 17条)
3.3.1 指令分类
在分类介绍指令前, 先把描述指令的一些符号的意义作
一简单介绍 。
Rn― 当前选定的寄存器区中的 8个工作寄存器 R0~ R7,
即 n=0~ 7。
Ri― 当前选定的寄存器区中的 2个寄存器 R0,R1,i=0,1。
Direct— 8位内部 RAM单元的地址, 它可以是一个内部
数据区 RAM单元 ( 00H~ 7FH) 或特殊功能寄存器地址 ( I/O端
口, 控制寄存器, 状态寄存器 80H~ 0FFH) 。
#data— 指令中的 8位常数 。
#data16— 指令中的 16位常数 。
addr16— 16位的目的地址, 用于 LJMP,LCALL,可指向
64KB程序存储器的地址空间 。
addr11— 11位的目的地址, 用于 AJMP,ACALL指令 。 目
的地址必须与下一条指令的第一个字节在同一个 2KB程序存
储器地址空间之内 。
rel— 8位带符号的偏移量字节,用于 SJMP和所有条
件转移指令中。偏移量相对于下一条指令的第一个字节
计算,在 — 128~ +127范围内取值。
bit— 内部数据 RAM或特殊功能寄存器中的可直接寻
址位。
DPTR— 数据指针,可用作 16位的地址寄存器。
A— 累加器
B— 寄存器,用于 MUL和 DIV指令中。
C— 进位标志或进位位。
@ — 间接寄存器或基址寄存器的前缀,如@ Ri,@
DPTR。
/ — 位操作的前缀,表示对该位取反。
( X) — X中的内容。
(( X)) — 由 X寻址的单元中的内容。
← — 箭头左边的内容被箭头右边的内容所替代。
3.3.2 数据传送类指令
数据传送类指令一般的操作是把源操作数传送到指
令所指定的目标地址 。 指令执行后, 源操作数保持不变,
目的操作数为原操作数所替代
数据传送类指令用到的助记符有,MOV,MOVX,
MOVC,XCH,XCHD,PUSH,POP,SWAP。
数据一般传送指令的助记符, MOV”表示
格式,MOV [目的操作数 ],[源操作数 ]
功能:目的操作数 ?( 源操作数中的数据 )
源操作数可以是,A,Rn,direct,@Ri,#data
目的操作数可以是,A,Rn,direct,@Ri
数据传送指令一般不影响标志, 只有一种堆栈操作
可以直接修改程序状态字 PSW,这样, 可能使某些标志
位发生变化 。
1,以累加器为目的操作数的内部数据传送指令
MOV A,Rn ; A?( Rn)
MOV A,direct ; A?( direct)
MOV A,@Ri ; A?(( Ri))
MOV A,#data ; A?data
2,数据传送到工作寄存器 Rn的指令
MOV Rn,A ; Rn?( A)
MOV Rn,direct ; Rn?( direct)
MOV Rn,#data ; Rn?data
3.数据传送到内部 RAM单元或特殊功能寄存器 SFR的指令
MOV direct,A ; direct?( A)
MOV direct,Rn ; direct?( Rn)
MOV direct1,direct2 ; direct1 ?( direct2)
MOV direct,@Ri ; direct?(( Ri))
MOV direct,#data ; direct?#data
MOV @Ri,A ; ( Ri?( A )
MOV @Ri,direct ; ( Ri) ?( direct)
MOV @Ri,#data ; ( Ri) ?data
MOV DPTR,#data16 ; DPTR?data16
片内数据 RAM及寄存器的数据传送指令 MOV,PUSH和
POP共 18条, 如图 3.5所示 。
D PTR
@Ri A Rn
#da t a di r ect
D PTR
M O V M O V
M O V
M O V
M O V
M O V
M
O
V
M
O
V
M
O
V
M
O
V
PUSH
POP
4,累加器 A与外部数据存储器之间的传送指令
片外数据存储器数据传送指令 MOVX共 4条,如图 3.6所示。
MOVX A,@DPTR ; A?( DPTR)
MOVX A,@Ri ; A?(( Ri))
MOVX @DPTR,A ; ( DPTR) ?A
MOVX @Ri,A ; ( Ri) ?A
@ D PTR@ Ri
A
M
O V
X M O V
X
图 3.6 片外数据存储器数据传送指令
5,程序存储器内容送累加器
MOVC A,@ A+PC
MOVC A,@ A+DPTR
程序存储器查表指令 MOVC共 2条, 如图 3.7所示 。
图 3.7 片外数据存储器数据传送指令
@ A+DPT R@ A+PC
A
M
O V
C M O V
C
6,堆栈操作指令
PUSH direct
POP direct
例如:进入中断服务程序时, 把程序状态寄存器
PSW,累加器 A,数据指针 DPTR进栈保护 。 设当前 SP为
60H。 则程序段
PUSH PSW
PUSH ACC
PUSH DPL
PUSH DPH
执行后, SP内容修改为 64H,而 61H,62H,63H、
64H单元中依次栈入 PSW,A,DPL,DPH的内容, 当中断
服务程序结束之前, 如下程序段 ( SP保持 64H不变 )
POP DPH
POP DPL
POP ACC
POP PSW
指令执行之后, SP内容修改为 60H,而 64H,63H、
62,61H单元的内容依次弹出到 DPH,DPL,A,PSW中 。
7,字节交换指令
数据交换主要是在内部 RAM单元与累加器 A之间进
行, 有整字节和半字节两种交换 。
( 1) 整字节交换指令
XCH A,Rn ; ( A) ?( Rn)
XCH A,
direct; ( A ) ?
( direct)
XCH A,@Ri ; ( A ) ?
(( Ri))
8位数 据 8位数 据
X C H
( 2) 半字节交换指令
字节单元与累加器 A进行低 4位的半字节数据交换 。
只有一条指令 。
XCHD A,@Ri
( 3) 累加器高低半字节交换指令
只有一条指令:
SWAP A
高4 位 低4 位
S W A P
XC HD
高4 位 低4 位 高4 位 低4 位
【 例 3-1】 ( R0) = 30H,( A) = 65H,( 30H) = 8FH
执行指令:
XCH A,@R0 ;(R0) = 30H,( A) = 8FH,( 30H) = 65H
XCHD A,@ R0;( R0) = 30H,( A) = 6FH,( 30H) = 85H
SWAP A ;( A) = 56H
数据交换指令 XCH,XCHD,和 SWAP共 5条, 如图 3.8所示 。
图 3.8 数据交换指令
A@ Ri Rn
d i r e c tS W AP
XCH
XCHD
XCH
X C
H
3.3.3 算术运算类指令
1.加法指令
加法指令分为普通加法指令、带进位加法指令和加 1
指令。
( 1)普通加法指令
ADD A,Rn ; A?( A) +( Rn)
ADD A,direct ; A?( A) +( direct)
ADD A,@Ri ; A?( A) +(( Ri))
ADD A,#data ; A?( A) + data
【 例 3-2】 ( A) =85H,R0=20H,( 20H) =0AFH,执行指
令:
ADD A,@R0
10000101
+10101111
1 00110100
结果:( A) =34H; Cy=1; AC=1; OV=1。
对于加法,溢出只能发生在两个加数符号相同的
情况。在进行带符号数的加法运算时,溢出标志 OV是
一个重要的编程标志,利用它可以判断两个带符号数
相加,和数是否溢出。
( 2)带进位加法指令
【 例 3-3】 ( A) =85H,( 20H) =0FFH,Cy=1执行指令:
ADDC A,20H
结果:( A) =85H; Cy=1; AC=1; OV=0。
ADDC A,Rn ; A?( A) +( Rn) +( Cy)
ADDC A,direct ; A?( A) +( direct) +( Cy)
ADDC A,@Ri ; A?( A) +(( Ri)) +( Cy)
ADDC A,#data ; A?( A) + data+( Cy)
( 3)增量指令
【 例 3-4】 ( A) = 12H,( R3) = 0FH,( 35H) = 4AH,
( R0) = 56H,( 56H) = 00H
执行如下指令:
INC A ;执行后 ( A) = 13H
INC R3 ;执行后 ( R3) = 10H
INC 35H ;执行后 ( 35H) = 4BH
INC @ R0 ;执行后 ( 56H) = 01H
INC A ; A?( A) +1
INC Rn ; Rn ?( Rn) +1
INC direct ; direct ?( direct) +1
INC @Ri ; ( Ri) ?(( Ri)) +1
INC DPTR ; DPTR ?( DPTR) +1
( 4) 十进制调整指令
DA A
执行该指令时, 判断 A中的低 4位是否大于 9,若满足大
于则低 4位做加 6操作;
同样, A中的高 4位大于 9则高 4位加 6操作 。
例如:有两个 BCD数 36与 45相加, 结果应为 BCD码 81,程
序如下:
MOV A,#36H
ADD A,#45H
DA A
得结果 7BH;第三条指令对累加器 A进行十进制调整,低
4位(为 0BH)大于 9,因此要加 6,最后得到调整的 BCD
码 81。
2,减法指令
( 1)带进位减法指令
( 2)减 1指令
SUBB A,Rn ; A?( A) - ( Rn) - ( Cy)
SUBB A,direct ; A?( A) - ( direct) - ( Cy)
SUBB A,@Ri ; A?( A) - ( Ri) - ( Cy)
SUBB A,#data ; A?( A) - data- ( Cy)
DEC A ; A?( A) - 1
DEC Rn ; Rn?( Rn) - 1
DEC direct ; direct?( direct) - 1
DEC @Ri ;( Ri) ?(( Ri))- 1
3.乘法指令
乘法指令完成单字节的乘法, 只有一条指令:
MUL AB
【 例 3-5】 ( A) = 50H,( B) = 0A0H,执行指令:
MUL AB
结果,( B) = 32H,( A) = 00H( 即乘积为 3200H),
Cy= 0,OV= 1。
4.除法指令
除法指令完成单字节的除法, 只有一条指令:
DIV AB
算术运算类指令包括,ADD,ADDC,SUBB,MUL、
DIV,INC,DEC和 DA,如图 3.9所示。
图 3.9 算术运算类指令
I N C
D E C
@R i A Rn
#dat a
di r ect
B
D PT RD PT R
I N C
D E C
DA
I N C
D E C
I N C
D E C
I N C
ADD, ADDC
SU B B
ADD, ADDC
SU B B
A
D
D
、
A
D
D
C
、
S
U
B
BA
D
D
、
A
D
D
C
、
S
U
B
B
MU L
D I V
3.3.4 逻辑运算指令
1,简单逻辑操作指令
CLR A ;对累加器 A清, 0”
CPL A ;对累加器 A按位取反
RL A ;累加器 A的内容向左循环移 1位
RLC A ;累加器 A的内容带进位标志向左循环移 1位
RR A ;累加器 A的内容向右循环移 1位
RRC A ;累加器 A的内容带进位标志向右循环移 1位
循环左移指令示意图,RL A
循环右移指令示意图,RR A
带进位的循环左移指令示意图,RLC A
带进位的循环右移指令示意图,RRC A
A7 A6 A5 A4 A3 A2 A1 A0
A7 A6 A5 A4 A3 A2 A1 A0
A7 A6 A5 A4 A3 A2 A1 A0CY
A7 A6 A5 A4 A3 A2 A1 A0CY
2.逻辑与指令
【 例 3-6】 ( A) = 37H,( R0) = 0A9H 执行指令:
ANL A,R0
结果:( A)= 21H
ANL A,Rn ; A?( A) ?( Rn)
ANL A,direct ; A?( A) ?( direct)
ANL A,@Ri ; A?( A) ?(( Ri))
ANL A,#data ; A?( A) ?data
ANL direct,A ; direct?( direct) ?( A)
ANL direct,#data ; direct?( direct) ?data
3,逻辑或指令
【 例 3-7】 ( A) = 37H,( P1) = 09H 执行指令:
ORL P1,A
结果:( A)= 3FH
ORL A,Rn ; A?( A) ?( Rn)
ORL A,direct ; A?( A) ?( direct)
ORL A,@Ri ; A?( A) ?(( Ri))
ORL A,#data ; A?( A) ?data
ORL direct,A ; direct?( direct) ?( A)
ORL direct,#data ; direct?( direct) ?data
4,逻辑异或指令
XRL A,Rn ; A?( A) ?( Rn)
XRL A,direct ; A?( A) ?( direct)
XRL A,@Ri ; A?( A) ?(( Ri))
XRL A,#data ; A?( A) ?data
XRL direct,A ; direct ?( direct) ?( A)
XRL direct,#data ; direct?( direct) ?data
图 3.10 逻辑运算类指令
@R i A Rn
#dat a
di r ect
RL, RLC
RR, RRC
CLR, C PL
ANL, O R L ANL, O R L
X R L X R L
ANL, O R L, X R L
A
N
L
、
O
R
L
、
X
R
L
A
N
L
、
O
R
L
、
X
R
L
3.3.5 控制转移指令
1,无条件转移指令
( 1) 绝对转移指令
AJMP addr11
这是 2KB范围内的无条件跳转指令, 执行该指令时,
先将 PC+2,然后将 addr11送入 PC10~ PC0,而 PC15~ PC11
保持不变 。
操作过程可表示为,PC?( PC) + 2
PC10~ 0?addr11
( 2) 相对转移指令
SJMP rel
执行指令时, 先将 PC+2,再把指令中带符号的偏移
量加到 PC上, 得到跳转的目的地址送入 PC。
目标地址 =源地址 +2+rel
( 3) 长跳转指令
LJMP addr16 ; PC ?addr16
执行该指令时, 将 16位目标地址 addr16装入 PC,
程序无条件转向指定的目标地址 。 转移指令的目标地
址可在 64KB程序存储器地址空间的任何地方, 不影响
任何标志 。
( 4) 间接转移指令 ( 散转指令 )
JMP @A+DPTR ; PC ?( A) + ( DPTR)
2,条件转移指令
3,比较转移指令
在 MCS-51中没有专门的比较指令,但提供了下面
4条比较不相等转移指令;
4,减 1不为 0转移指令
DJNZ Rn,rel ; Rn ?( Rn ) - 1?0转移
DJNZ direct,rel ; direct ?( direct)- 1?0转移
JZ rel ; ( A) =0转移
JNZ rel ; ( A) ≠0转移
CJNE A,direct,rel ; ( A) ?( direct) 转移
CJNE A,#data,rel ; ( A) ? data转移
CJNE Rn,#data,rel ; ( Rn) ?data转移
CJNE @Ri,#data,rel ; (( Ri)) ?data转移
5,调用及返回指令
( 1) 绝对调用指令
ACALL addr11
执行该指令时, PC ?PC+ 2
SP?( SP) + 1,( SP) ?( PC) 7~ 0
SP?( SP) + 1,( SP) ?( PC) 15~ 8
PC10~ 0?addr11
( 2) 长调用指令
LCALL addr16
这条指令无条件调用位于 16位地址 addr16的子程序 。
其操作过程如下:
PC ?PC+ 3
SP?( SP) + 1,( SP) ?( PC) 7~ 0
SP?( SP) + 1,( SP) ?( PC) 15~ 8
PC10~ 0?addr16
( 3)子程序返回指令
RET
子程序返回指令是把栈顶相邻两个单元的内容弹
出送到 PC,SP的内容减 2,程序返回 PC值所指的指令
处执行。 RET指令通常安排在子程序的末尾,使程序
能从子程序返回到主程序。
( 4)中断返回指令
RETI
这是指令的功能与 RET指令相类似。通常安排在
中断服务程序的最后。
(5)空操作指令
NOP ; PC ?PC+ 1
空操作也是 CPU控制指令,它没有使程序转移的
功能。只消耗一个机器周期的时间。常用于程序的等
待或时间的延迟。
图 3.11 条件转移类指令
@Ri A Rn
di r ect#da t a
JZ, JN Z
D JN Z
D JN Z
C
J N
Z
C
J
N
Z
CJN Z
C
J
N
Z
r el
- 128
+ 127
3.3.6 位操作指令
1,位数据传送指令
2,位变量修改指令
CLR C ; Cy?0
CLR bit ; bit?0
CPL C ; Cy?( Cy)
CPL bit ; bit?(bit)
SETB C ; Cy?1
SETB bit ; bit?1
3,位变量逻辑与指令
ANL C,bit ; Cy ?( Cy) ?( bit)
ANL C,/bit ; Cy ?( Cy) ?( /bit)
MOV C,bit ; Cy?( bit)
MOV bit,C ; bit?( Cy)
4,位变量逻辑或指令
ORL C,bit ; Cy ?( Cy) ?( bit)
ORL C,/bit ; Cy ?( Cy) ?( /bit)
位操作类指令如图 3.12所示 。
图 3.12 位操作类指令
bi t
bi t
C
CLR
SETB
CPL
CLR
SETB
CPL
M OV
ANL, OR L
A
N
L
、
O
R
L
5,位变量条件转移指令
JC rel ;若 ( Cy) =1,则转移 PC←(PC)+ 2+rel
JNC rel ;若 ( Cy) =0,则转移 PC←(PC)+ 2+rel
JB bit,rel ;若 ( bit) =1,则转移 PC←(PC)+ 3+rel
JNB bit,rel ;若 ( bit) =0,则转移 PC←(PC)+ 3+rel
JBC bit,rel ;若 ( bit) =1,则转移 PC←(PC)+ 3+rel,并 bit← 0
图 3.13 位条件转移指令
以上介绍了 MCS-51指令系统,理解和掌握本章内
容,是应用 MCS-51单片机的一个重要前提。
C
bi t
JC, J NC
r el
- 12 8
+127
JB, J BC, J NB
【 例 3-8】 指出下列程序段的每条指令的源操作数是什么
寻址方式,并写出每步运算的结果。(相关单元的内
容)设程序存储器( 1050H) =5AH:
MOV A,#0FH ; A=0FH, 立即寻址
MOV 30H,#0F0H ; (30H)=F0H,立即寻址
MOV R2,A ; R2=0FH, 寄存器寻址
MOV R1,#30H ; R1=30H, 立即寻址
MOV A,@R1 ; A=F0H, 寄存器间接寻址
MOV DPTR,#1000H ; DPTR=1000H,立即寻址
MOV A,#50H ; A=50H,立即寻址
MOVC A,@ A+ DPTR ; A=5AH,基址变址寻址
JMP @A+DPTR ; PC目标= 105AH,基址变址寻址
CLR C ; C=0,寄存器寻址
MOV 20H,C ; ( 20H) =0,寄存器寻址
【 例 3-9】 用数据传送指令实现下列要求的数据传送。
( 1) R0的内容输出到 R1。
( 2)内部 RAM 20H单元的内容传送到 A中。
( 3)外部 RAM 30H单元的内容送到 R0。
( 4)外部 RAM 30H单元的内容送内部 RAM20H单元。
( 5)外部 RAM 1000H单元的内容送内部 RAM 20H单元。
( 6)程序存储器 ROM 2000H单元的内容送 R1。
( 7) ROM 2000H单元的内容送内部 RAM 20H单元。
( 8) ROM 2000H单元的内容送外部 RAM 30H 单元。
ROM 2000H单元的内容送外部 RAM 1000H单元。
解
(1) MOV A,R0
MOV R1,A
(2) MOV A,20H
(3) MOV R0,#30H 或 MOV R1,#30H
MOVX A,@R0
MOVX A,@R1
MOV R0,A
MOV R0,A
(4) MOV R0,#30H 或 MOV R1,#30H
MOVX A,@R0
MOVX A,@R1
MOV 20H,A
MOV 20H,A
( 5) MOV DPTR,#1000H
MOVX A,@1000H
MOV 20H,A
(6) MOV DPTR,#2000H
CLR A
MOVC A,@A+DPTR
MOV R1,A
(7) MOV DPTR,#2000H
CLR A
MOVC A,@A+DPTR
MOV 20H,A
(8) MOV DPTR,#2000H
CLR A
MOVC A,@A+DPTR
MOV R0,#30H
MOVX @R0,A
(9) MOV DPTR,#2000H
CLR A
MOVC A,@A+DPTR
MOV DPTR,#1000H
MOVX @DPTR,A