跳转至
阅读量:

汇编指令介绍

一、汇编指令分类

汇编指令总共有7种寻址方式,111条指令!

  • 字节数
  • 单字节指令:49条
  • 双字节指令:46条
  • 三字节指令:16条
  • 运算速度
  • 单周期指令:65条
  • 双周期指令:44条
  • 四周期指令:2条
  • 功能
  • 数据传送类:29条
  • 算术运算类:24条
  • 逻辑运算类:24条
  • 控制转移类:17条
  • 位操作类:17条

二、汇编的指令格式

【标号:】 助记符 【操作数】 【;注释】

  • 标号:表示该指令的位置,相当于标记该指令在ROM中存储的位置;
  • 助记符:这是一条指令中必不可少的部分;
  • 操作数:可以有多个,或者没有,需要根据指令来确定;
  • 注释:用来解释所写的语句的含义,或者一些对程序的描述,可以根据需要来给出。

三、汇编指令种常用符号说明

  • Rn:工作寄存器中的寄存器 R0…R7 中之一
  • Ri:工作寄存器中的寄存器 R0 或 R1
  • #data:8位立即数
  • #data16:16位立即数
  • direct:片内RAM 或 SFR 的地址(8位)
  • @:间接寻址寄存器
  • Bit:片内RAM 或 SFR 中可以位寻址的位地址
  • addr11:11位目的地址
  • addr16:16位目的地址
  • Rel:补码形式的8位地址偏移量
  • $ :当前指令首字节所在地址
  • X:片内RAM的直接地址或寄存器
  • (X):相应地址单元中的内容
  • ←:箭头右边的内容送入箭头左边的单元内
  • →:箭头左边的内容送入箭头右边的单元内

四、数据传送类指令(29条)

指令助记符

MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP

以累加器为目的操作数的指令(4条)

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

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

MOV Rn, A           ;A →Rn  
MOV Rn, direct       ;(direct)→Rn
MOV Rn, #data       ;data→Rn

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

MOV direct, A       ;A→(direct)
MOV direct, Rn      ;Rn→(direct)    
MOV direct1direct2 
MOV direct, @Ri     ;(Ri) →(direct) 
MOV direct, #data   ;data→(direct)

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

MOV @Ri, A          ;A →(Ri)
MOV @Ri, direct     ;(direct) →(Ri)
MOV @Ri, #data      ;data →(Ri)

十六位数的传递指令(1条)

MOV DPTR, #data16

8051是一种8位机,这是唯一的一条16位立即数传递指令。 功能:将一个16位的立即数送入 DPTR 中去。其中高8位送入 DPH,低8位送入 DPL。

累加器A与片外RAM之间的数据传递类指令(4条)

MOVX A, @Ri
MOVX @Ri, A
MOVX A, @DPTR
MOVX @DPTR, A

​ 在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。 ​ 在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。

读程序存储器指令(2条)

MOVC A, @A+DPTR
MOVC A, @A+PC

本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格。说明:查找到的结果被放在A中,因此,本条指令执行前后,A中的值是不相同的。

堆栈操作(2条)

PUSH  direct    ;SP ← SP+1,(SP) ← (direct)
POP   direct    ;(direct) ← (SP), SP←SP-1

第一条为压入指令,就是将direct中的内容送入堆栈中; 第二条为弹出指令,就是将堆栈中的内容送回到direct中。

交换指令(5条)

XCH   A Rn         ;A←→Rn
XCH   A direct     ;A←→(direct)
XCH   A @Ri        ;A←→(Ri)
XCHD  A @Ri        ;A.3~A.0←→(Ri).3~(Ri).0
SWAP  A             ;A.3~A.0←→A.7~A.4

五、算术运算类指令(24条)

助记符

ADD、ADDC、INC、SUBB、DEC、DA、MUL、DIV

加法指令

1.不带进位位的加法指令(4条)

ADD A#data         ;A+data→A
ADD Adirect        ;A+(direct )→A
ADD ARn            ;A+Rn→A
ADD A,@Ri           ;A+(Ri)→A

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

带进位位的加法指令常用于多字节的加法指令中

ADDC ARn           ;A+Rn+CY→A
ADDC Adirect       ;A+(direct )+CY→A
ADDC A,@Ri          ;A+(Ri)+CY→A
ADDC A#data        ;A+data+CY→A

3. 加1指令(5条)

INC  A          ;A+1→A,影响P标志
INC  Rn         ;Rn+1→Rn
INC  direct     ;(direct)+1→(direct)
INC  @Ri        ;((Ri))+1→((Ri))
INC  DPTR       ;DPTR+1→DPTR

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

在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用来对BCD码加法运算结果进行自动修正。

DA  A

例:A = 0001 0101 BCD(代表十进制数15)

ADD  A#8 ;执行完之后,A = 1DH
DA  A     ;调整后,A = 23H

减法指令

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

SUBB ARn           ;A-Rn-CY→A
SUBB Adirect       ;A-(direct )-CY→A
SUBB A,@Ri          ;A-(Ri)-CY→A
SUBB A#data        ;A-data-CY→A

2. 减1指令(4条)

DEC A            ;A-1→A,影响P标志
DEC Rn          ;Rn-1→Rn
DEC direct       ;(direct)-1→(direct)
DEC @Ri         ;(Rn)-1→(Rn)

乘法指令

MUL AB  ;A×B → BA

此指令的功能是将A和B中的两个8位无符号数相乘,两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。 在乘积大于FFH时,0V置1,否则OV为0;而CY总是0。

除法指令

DIV AB  ;A÷B   商→A  余数→B

此此指令的功能是将A中的8位无符号数除B中的8位无符号数(A/B)。除了以后,商放在A中,余数放在B中。 CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么0V=1。

逻辑运算类指令(24条)

逻辑或指令(6条)

ORL ARn           ;A | Rn→A
ORL Adirect       ;A |(direct)→ A
ORL A,@Ri          ;A |(Ri)→A
ORL A#data        ;A | data→A
ORL directA       ;(direct) | A→(direct)
ORL direct#data   ;(direct) | data→(direct)

逻辑与指令(6条)

ANL ARn           ;A & Rn→A
ANL Adirect       ;A &(direct)→ A
ANL A,@Ri          ;A &(Ri)→A
ANL A#data        ;A & data→A
ANL directA       ;(direct) & A→(direct)
ANL direct#data   ;(direct) & data→(direct)

逻辑异或指令(6条)

XRL ARn           ;A ⊕ Rn→A
XRL Adirect       ;A ⊕(direct)→ A
XRL A,@Ri          ;A ⊕(Ri)→A
XRL A#data        ;A ⊕ data→A
XRL directA       ;(direct) ⊕ A→(direct)
XRL direct#data   ;(direct) ⊕ data→(direct)

清零与取反指令(2条)

清零指令
CLR  A      ; #0 → A

取反指令
CPL  A      ; /A → A

循环移位指令(4条)

RL  A       ; 向左移位
RR  A       ; 向右移位
RLC A       ; 向左带进位移位
RRC A       ; 向右带进位移位

控制转移类指令(24条)

共有控制程序转移类指令(不包括位操作类的转移指令)。此类指令一般不影响 PSW。

包括以下类型:

  • 无条件转移和条件转移
  • 相对转移和绝对转移
  • 长转移和短转移
  • 调用与返回指令

无条件转移类指令(4条)

  • 短转移类指令: AJMP addr11
  • 长转移类指令: LJMP addr16
  • 相对转移指令: SJMP rel
  • 间接转移指令: JMP @A+DPTR

上面的前三条指令,统统理解成: PC值改变,即跳转到一个标号处

JMP指令之间的区别:

  • 跳转的范围不同 AJMP addr11 2K LJMP addr16 64K SJMP rel -128 ~ 127
  • 指令构成不同 AJMP、LJMP后跟的是绝对地址,而SJMP后跟的是相对地址。
  • 指令长度不同 原则上LJMP可以代替AJMP和SJMP。

间接转移 JMP @A+DPTR 指令 用途也是跳转,转移地址由A+DPTR形成,并直接送入PC。 指令对A、DPTR和标志位均无影响。 本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。 该指令类似于C语言中的 switch(){case:…}语句的功能。

条件转移类指令(8条)

条件转移指令是指在满足一定条件时进行相对转移,否则程序继续执行本指令的下一条指令。

判断A的值转移指令(2条)

JZ   rel    ;如果A=0,则转移,否则顺序执行。
JNZ  rel    ;如果A≠0,就转移。

转移到相对于当前PC值的8位移量的地址去。即: 新的PC值=当前PC+偏移量rel

我们在编写汇编语言源程序时,可以直接写成: JZ 标号 ;即转移到标号处。

比较不相等转移指令(4条)

CJNE  A   #data,  rel 
CJNE  A   direct, rel
CJNE  Rn  #data,  rel
CJNE  @Ri #data,  rel

此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。 同样地,使用时,我们可以将rel理解成标号。

减1条件转移指令(2条)

DJNZ   Rn     rel
DJNZ   direct rel

DJNZ指令的执行过程: 它将第一个参数中的值减1,然后看这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移到第二个参数所指定的地方去。

评论