单片机编程之汇编语言基础(3)

1. 指令格式——单片机编程之汇编语言基础(1)
详见以上链接,点击蓝字。

2. 寻址方式——单片机编程之汇编语言基础(2)
详见以上链接,点击蓝字。

3. 指令系统

89C51指令系统由111条指令组成,共有255种指令代码,42种助记符。

按字节分:

  • 单字节指令49条
  • 双字节指令45条
  • 三字节指令17条

按指令执行时间分:

  • 单周期指令64条
  • 双周期指令45条
  • 四周期指令2条

按类型分:

  • 数据传输指令28条
  • 算术运算指令24条
  • 逻辑运算及移位指令25条
  • 控制转移指令17条
  • 位操作指令或布尔操作17条
3.1 数据传输指令

“传送”即是把源地址单元中的内容传送到目的地址单元中去,而源地址单元内容不变;或源地址与目的地址单元内容互换

MOV是传送指令的操作数助记符,其功能是将源字节的内容传送到目的字节,源字节的内容不变。

1. 以累加器A为目的操作数的指令(4条,即4种寻址方式)

MOV A, Rn       ;(Rn) -> A
MOV A, direct   ;(direct) -> A 
MOV A, @Ri      ;((Ri)) -> A
MOV A, #data    ;#data -> A

将第二操作数的内容以及立即数传送到由第一操作数所指定的累加器A中

2.以寄存器Rn为目的操作数的指令(3条)

MOV Rn, A       ;(A) -> Rn
MOV Rn, direct  ;(direct) -> Rn
MOV Rn, #data   ;#data -> Rn

把源操作数所指定的内容送到当前工作寄存器组R0 ~ R7中的某个寄存器中。

例如:(A) = 78H, (R5) = 47H, (70H) = F2H

MOV R5, A       ;(A) -> R5, (R5) = 78H 
MOV R4, 70H     ;(70H) -> R5, (R5) = F2H
MOV R5, #A3H    ;A3H -> R5, (R5) = A3H

注意:89C51指令系统中没有"MOV Rn, Rn"传送指令

3.以直接地址为目的操作数的指令(5条)

MOV direct, A       ;(A) -> direct
MOV direct, Rn      ;(Rn) -> direct
MOV direct, direct  ;(源direct) -> (目的direct)
MOV direct, @Ri     ;((Ri) -> direct)
MOV direct, #data   ;#data -> direct

把源操作数所指定的内容送入由直接地址direct所指出的片内存储单元中。

4.以间接地址为目的数的指令(3条)

MOV @Ri, A        ;(A) -> Ri
MOV @Ri, direct   ;(direct) -> (Ri)
MOV @Ri, #data    ;data -> (Ri)

(Ri)表示Ri中的内容为指定的RAM单元

5.16位数据传送指令(1条)

MOV DPTR, #data16   ;data H -> DPH, dataL -> DPL

将高8位立即数dataH送入DPH,低8位立即数dataL送入DPL,高位在前,低位在后

6.查表指令(2条)

MOVC A, @A + DPTR   ;先(PC) + 1 -> PC,后((A) + (DPTR)) -> A  
MOVC A, @A + PC     ;先(PC) + 1 -> PC,后((A) + (PC)) -> A  

第一条指令以DPTR为基址寄存器进行查表,使用前,先给DPTR赋予任一地址,所以查表范围可达整个程序存储器的64KB空间,称为远程查表。

注意:若DPTR已赋值待用,装入新值之前必须保存其原值,可以用栈指令PUSH保存。

1000H: MOV A, #10H          ;10H -> A
1002H: PUSH DPH             ;DPH入栈
1004H: PUSH DPL             ;DPL入栈,保护DPTR
1006H: MOV DPTR, #7000H     ;7000H -> DPTR
1009H: MOVC A, @A + DPTR    ;(10H + 7000H) -> A
100AH: POP DPL              ;DPL出栈
100CH: POP DPH              ;DPH出栈,恢复DPTR,先进后出

第二条指令PC的内容先自动加1,将新的PC内容与累加器A中的内容相加形成地址,取出该地址单元中的内容送入累加器A。

只能查找指令所在地址以后256字节范围内的代码或常数,成为近程查表。

1000H: MOV A, #0DH        ;0DH -> A, 查表的偏移量
1002H: MOVC A, @A + PC    ;(0DH + 1003H) -> A
1003H: MOV R0, A          ;(A) -> R0

7.累加器A与片外RAM传送指令(4条)

MOVX A, @Ri      ;(Ri) -> A,
MOVX A, @DPTR    ;((DPTR) -> A)
MOVX @Ri, A      ;(A) -> Ri
MOVX @DPTR, A    ;(A) -> (DPTR)

第1和第3条指令是用R0或R1作低8位地址指针,由P0口送出,寻址范围是256字节(此时,P2口仍可用作通用I/O口)。这两条指令完成以R0或R1为地址指针的片外数据存储器与累加器A之间的数据传送。

第2和第4条指令是以DPTR为片外数据存储器16位地址指针,寻址范围达64KB。其功能是在DPTR所指定的片外数据存储器与累加器A之间传送数据。

8.栈操作指令(2条)

PUSH direct   ;先(SP) + 1 -> (SP),后(direct) -> (SP),入栈
POP direct    ;先((SP)) -> direct,后(SP) - 1 -> (SP),出栈

入栈操作进行时,栈指针(SP) + 1指向栈顶的上一个空单位,将直接地址(direct)寻址的单元内容压入当前SP所指示的堆栈单元中。本操作不影响操作位。

出栈操作将栈指针(SP)所指示的内部RAM单元中内容送入由直接地址寻址的单元中,然后(SP) - 1 -> (SP)。本操作不影响标志位。

堆栈中数据的压入和弹出遵循“先进后出”的规律。

9.交换指令(4条)

XCH A, Rn       ;(A) <-> (Rn)
XCH A, direct   ;(A) <-> (direct)
XCH A, @Ri      ;(A) <-> ((Ri))
XCHD A, @Ri     ;(A) <-> ((Ri)0-3)

第1-3条,将第二操作数所指定的内容与累加器A的中的内容互换。

第4条,将Ri所指出的片内RAM单元的低4位与累加器A中内容的低4位互换,各自的高4位内容不变。该操作只影响标志位P。

3.2 算术运算指令

1. 加法类指令(4条)

ADD A, Rn       ;(A) + (Rn) -> A
ADD A, direct   ;(A) + (direct) -> A
ADD A, @Ri      ;(A) + ((Ri)) -> A
ADD A, #data    ;(A) + #data -> A

将8位无符号二进制数和累加器A中的数相加,所得的“和”存放于累加器A中,当“和”的第3位或第7位有进位时,分别将AC和CY标志位置1,否则都为0。

上述指令都执行都将影响标志位AC、CY、OV和P,其中,溢出标志位OV只有带符号数运算才有用。

;设(A) = 0C3H,(R0) = 0AAH
ADD A, R0   ;0C3H + 0AAH = 6DH -> A

​ (A): 1100 0011
+(R0): 1010 1010
= 1 0110 1101
标志位CY = 1,OV = 1,AC = 0

2. 带进位加法指令(4条)

ADDC A, Rn       ;(A) + (CY) +(Rn) -> A
ADDC A, direct   ;(A) + direct + CY -> A
ADDC A, Ri       ;(A) + (direct) + CY -> A
ADDC A, #data    ;(A) + #data + CY -> A

把操作数所指出的内容和进位标志位CY都加到累加器A中,结果存放在A中,当“和”的第3位或第7位有进位时,分别将AC和CY和OV标志位置1,否则都为0。

上述指令都执行都将影响标志位AC、CY、OV和P。

;设(A) = 0C3H,(R0) = 0AAH,(CY) = 1
ADDC A, R0   ;0C3H + 001H + 0AAH = 6EH -> A

​ (A): 1100 0011
+(CY): 0000 0001
​ = 1100 0100
+(R0): 1010 1010
= 1 0110 1110
标志位CY = 1,OV = 1,AC = 0

3. 带借位减法指令(4条)

SUBB A, Rn       ;(A) - CY - (Rn) -> A
SUBB A, direct   ;(A) - CY - (direct) -> A
SUBB A, @Ri      ;(A) - CY - ((Ri)) -> A
SUBB A, #data    ;(A) - CY - #data -> A

从累加器A中减去源操作数所指出的内容及进位位CY的值,差值保留在累加器A中。在多字节减法运算中,低字节差有时会向高字节产生借位(CY置1),所以在高字节运算时,就要用带借位减法指令,由于89C51指令系统中没有不带借位的减法指令,如果需要,则可以在使用“SUBB”之前用“CLR C”指令将CY清0。

两个数相减时,如果为7有借位,则CY置1;否则清0,若位3有借位,则AC置1;否则清0。两个带符号数相减,还要注意OV标志,若OV置1,则表示差数溢出,破坏了正确结果的符号位。

;设(A) = (0C9H),(R2) = 054H,(CY) = 1
SUBB A, R2;0C9H - 001H - 054H = 74H -> A

(A): 1100 1001
-(CY): 0000 0001
= 1100 1000
-(R2): 0101 0100
= 0111 0100
标志位CY = 0,AC = 0,OV = 1

4. 乘法指令(1条)

MUL AB 

把累加器A和累加器B中两个8位无符号数相乘,所得16位积的低字节存放在A中,高字节存放在B中,若乘积大于0FFH,则OV置1;否则清0(即B的内容为0,CY总是被清0)

;设(A) = 4EH,(B) = 5DH
MUL AB;(4EH) * (5DH) = 1C56H,1CH -> (B),(56H) -> (A),OV = 1

5. 除法指令(1条)

DIV AB

把累加器A和累加器B中两个8位无符号数相除,商的整数存于A中,余数存于B中,CY和OV均被清0,若原(B)=00H,则结果无法确定,用OV=1表示,而CY仍为0。

;设(A) = BFH,(B) = 32H
DIV AB;BFH / 32H = 03.29H,03H -> (A),29H -> (B),CY = 0,OV = 0

6. 加1指令(5条)

INC A        ;(A) + 1 -> (A)
INC Rn       ;(Rn) + 1 -> (A)
INC direct   ;(direct) + 1-> (direct)
INC @Ri      ;((Ri)) + 1 -> (Ri)
INC DPTR     ;(DPTR) + 1 -> DPTR

将操作数所指定的单元内容加1,其操作不影响PSW。若原单元内容为FFH,加1后溢出为00H,也不会影响PSW标志。

“INC A”和“ADD A, #01H”这两条指令都将累加器A的内容加1,但后者对标志位CY有影响。

7. 减1指令(4条)

DEC A        ;(A) - 1 -> A
DEC Rn       ;(Rn) - 1 -> Rn
DEC direct   ;(direct) - 1 -> direct
DEC @Ri      ;((Ri)) - 1 -> (Ri)

将操作数所指定的内容减1,其操作数不影响标志位CY。若原单元内容为00H,则减1后为FFH,也不会影响标志位。

7. 十进制调整指令(1条)

DA A   ;调整累加器内容为BCD数
3.3 逻辑操作指令

1. 简单操作指令(2条)

CLA A   ;0 -> A,清空累加器A,只影响标志位P
CPL A   ;累加器A取反指令,不影响标志位

2. 移位指令(4条)

RL A   ;累加器A循环左移指令
RR A   ;累加器A循环右移指令
RLC A  ;累加器连同进位位循环左移指令
RRC A  ;累加器联通进位位循环右移指令

通常用“RLC A”指令将累加器A的内容做乘2运算

;(A) = 10111101B = BDH, CY = 0
RLC A   ;(A) = 01111010B = 7AH, CY = 1, 17AH正好是BDH的两倍

3. 累加器半字节交换指令

SWAP A   ;将累加器A的高低两半字节交换
;(A) = FAH
SWAP A   ;(A) = AFH

4. 逻辑“与”指令(6条)

ANL A, Rn           ;
ANL A, direct       ;
ANL A, @Ri          ;
ANL A, #data        ;
ANL direct, A       ;
ANL direct, #data   ;

这组指令中前4条指令是将累加器A的内容和源操作数所指的内容按位进行逻辑“与”,结果放在A中,后两条指令的结果直接存入直接地址单元中。

5. 逻辑“或”指令(6条)

ORL A, Rn           ;
ORL A, direct       ;
ORL A, @Ri          ;
ORL A, #data        ;
ORL direct, A       ;
ORL direct, #data   ;

这组指令中前4条指令是将累加器A的内容和源操作数所指的内容按位进行逻辑“或”,结果放在A中,后两条指令的结果直接存入直接地址单元中。

6. 逻辑“异或”指令(6条)

XRL A, Rn           ;
XRL A, direct       ;
XRL A, @Ri          ;
XRL A, #data        ;
XRL direct, A       ;
XRL direct, #data   ;

这组指令中前4条指令是将累加器A的内容和源操作数所指的内容按位进行逻辑“异或”,结果放在A中,后两条指令的结果直接存入直接地址单元中。

3.4 控制程序转移类指令

更新中…

3.5位操作类指令

更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值