单片机原理 51单片机寄存器,寻址方式,指令,伪指令汇总

2020-05-24   87 次阅读


前言

想不到51单片机的汇编指令集是个CISC,太拉垮了,一堆指令,寻址方式。RISC它不香吗,不说了,因为太多了所以到这边来个汇总

1.寄存器

① PSW(程序状态字寄存器)

  • Cy (PSW.7)
    进位标志,在进行加减运算时,如果操作结果中最高位有进位或者借位时,Cy由硬件置为“1”,否则清“0”
  • Ac (PSW.6)
    辅助进位标志,在进行加或减运算时,低四
    位数向高四位产生的进位或借位,将由硬件置“ “1” ” ,否则清“ “0”
  • F0(PSW.5)
    用户标志位
  • RS1,RS0(PSW.4 PSW.3)
    工作寄存器组指针
  • OV(PSW.2)
    溢出标志,算术运算产生溢出OV置“1”
  • F1(PSW.1)
    用户标志位
  • P(PSW.0)
    奇偶标志位,始终跟踪累加器A内容中“1”的奇偶性,当累加器A内容中有奇数个“1”时 P置1,否则为0,改变累加器A中内容的指令都会影响标志位P

② PC(程序计数器)

PC中存放即将执行的下一条指令的地址,改变PC中的内容就可以改变程序执行的方向

  • 是一个16位寄存器,可对64KB程序存储器直接寻址
  • 是一个独立的寄存器,随时指向将要执行的指令地址,有内容自动加一的功能
  • 没有给用户提供其物理地址

③ IR(指令寄存器)

指令寄存器IR存放指令代码

④ SFR(特殊功能寄存器)

是各功能部件的状态及控制寄存器,反映了单片机的内部工作状态及工作方式

  • 采用寄存器直接寻址访问
  • 部分SFR可以进行位寻址

⑤ SP(堆栈指针)

堆栈指针是一个8位的专用寄存器,用于指明堆栈顶部在内部RAM中的位置,可由软件设置初值
堆栈存取数据时遵循“先进后出,后进先出”的原则,其中的存储单元在使用时是不能按照字节任意访问的

⑥ DPTR(DPTR0)

DPTR是一个16位专用寄存器

  • 由两个8位的寄存器DPHDPL组成
  • DPTR主要用来存放16位的地址
  • 当对64KB外部数据存储器空间寻址时,作为间址寄存器
  • 在访问程序存储器时,DPTR作为基址寄存器使用

⑦ 寄存器 B

寄存器B是为了执行乘法和除法设置的
在不执行乘除操作的情况下,可被当做普通寄存器使用

⑧ SBUF(串行数据缓冲器)

位于串行口内部的数据缓冲器

  • 由两个独立的寄存器组成,一个是发送缓冲器,一个是接收缓冲器
  • 地址只有一个 99H
  • 写入SBUF的数据存放在发送寄存器用于串行发送
  • 从SBUF读取的数据接收自接收缓冲器,读取的是刚刚收到的数据

⑨ SCON(串行控制寄存器)

SCON主要用来选择串行通信的工作方式,接受或发送控制,设置状态标志

2.寻址方式

① 立即寻址方式

在指令中直接给出其操作数,该操作数被称为立即数,立即数需要在前边加上#

MOV A, #30H

② 直接寻址

指在指令中直接给出存放数据的地址(只限于片内RAM范围

  • 直接寻址只能访问特殊功能寄存器、内部存储器的低128个字节区域

MOV A, 30H

③ 寄存器寻址

指令中的操作数为寄存器中的内容

MOV A, R1

④ 寄存器间接寻址

指令中的操作数在寄存器的内容所指的地址单元中

MOV R1, #30H
MOV A, @R1

⑤ 变址寻址

用于访问程序存储器中的一个字节

该字节的地址是:
基址寄存器(DPTR或PC)的内容与变址寄存器A中的内容之和

MOV DPTR ,#3000H ;立即数3000H 送DPTR
MOV A ,#02H 	  ;立即数02H 送A
MOVC A ,@A+DPTR ;取ROM 中3002H 单元中的数送A

⑥ 相对寻址

以PC当前值为基准,加上相对偏移量rel形成转移地址
转移范围: 以PC当前值起始地址,相对偏移在-128~127字节单元之间

目的地址 = PC当前值起始地址 + rel = 转移指令所在地址 + 转移指令字节数 + rel

⑦ 位寻址

是指对片内RAM的位寻址(20H~2FH),可以位寻址的特殊功能寄存器(SFR)的各位,并进行位操作的寻址方式

MOV C ,00H ;把直接位地址00H 位(20H 单元中D0 位)的值送C 位
MOV P1.3,C ;把C位中的值送P1 口的D3位
SETB 2AH.7 ;把位寻址区2AH 单元D7 位(直接位地址为57H)置1

3.指令

MOV

以累加器为目的操作数

MOV A ,Rn       ;(Rn)→A ,n=0~7
MOV A ,@Ri      ;((Ri))→A ,i=0,1
MOV A ,direct   ;(direct)→A
MOV A ,#data    ;#data→A

以Rn为目的操作数的指令

MOV Rn, A      ; (A) -> (Ri), n=0~7
MOV Rn, direct ; (direct) -> Rn, n=0~7
MOV Rn, #data  ; #data->Rn, n=0~7 

以直接地址为目的操作数的指令

MOV direct, A           ; (A) -> direct
MOV direct, Rn		; (Rn)->direct, n = 0~7
MOV direct1, direct2	; (direct2)->direct1
MOV direct, @Ri		; ((Ri))->direct, i=0,1
Mov direct, #data	; #data -> direct

以寄存器间接寻址地址为目的操作数的指令

MOV @Ri, A		;(A)->(Ri) i=0,1
MOV @Ri, direct		;(direct)->(Ri) i=0,1
MOV @Ri, #data		;#data->(Ri) i=0,1

位传送

MOV C,bit   ;(bit) -> Cy
MOV bit,C   ;(Cy) -> bit

举例子:
MOV P1.5, C ;把Cy中的值送到P1.5口线输出

16位数据传送指令

MOV DPTR, #data16

PUSH

入栈
PUSH direct ; SP先加1,再将数据压栈

POP

出栈
POP direct ; 数据先出栈,再SP减1

MOVX

用于累加器A与外部数据存储器传送指令

  • 采用DPTR间接寻址,外部数据存储器的地址为16位
MOVX A, @DPTR	;((DPTR))->A, 读外部RAM或者I/O口
MOVX @DPTR, A	;(A)->(DPTR), 写外部RAM或者I/O口
  • 采用Ri间接寻址,外部数据存储器的地址为8位
MOVX A, @Ri	
MOVX @Ri, A	

比如将外部RAM的80H单元内容移到A中

MOV R0, #80H
MOVX A, @R0

MOVC

查表指令,是单向指令,用于读取程序存储器中的数据表格

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

XCH

XCH指令为整个字节相互交换

XCH A,Rn
XCH A,direct
XCH A,@Ri

XCHD

XCHD指令为低4位相互交换
XCHD A, @Ri

SWAP

该指令为ACC中的高低4位互换
SWAP A

ADD

不带进位的加法指令

ADD A,Rn
ADD A,direct
ADD A,@Ri
ADD A,#data
  • 如果第七位有进位,则进位标志Cy置1,否则清0
  • 如果第三位有进位,则辅助进位标志Ac置“1”,否则清0
  • 如果位6有进位而位7无进位,或者位6没有进位而位7进位,溢出标志OV置1,否则置0

ADDC

带进位的加法指令
ADDC比起ADD多加了Cy的值
以第一条指令为例子

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

INC

增1指令
指令的功能是将操作数中的内容+1
除了对A操作影响P外不影响任何标志

INC A
INC Rn
INC direct
INC @Ri
INC DPTR

如果原来的内容为FFH,加1后变为00H

SUBB

带借位的减法指令
将第一操作数减去第二操作数,再减去Cy的值,然后将结果存在A中

SUBB A,Rn
SUBB A,direct
SUBB A,@Ri
SUBB A,#data

没有不带借位的减法指令
将之前的Cy清零:CLR C

  • 如果第七位要借位,Cy置1,否则为0
  • 如果第三位要借位,Ac置1,否则清0
  • 如果位6有借位而位7无借位,或者位6没有借位而位7借位,则溢出位OV置1,否则清0

DEC

减一指令,将操作数中的内容减1
除了对A操作影响P之外不影响任何标志

DEC A
DEC Rn
DEC direct
DEC @Ri

没有对DPTR的减1操作指令
若原来的内容为00H,减1后变为FFH

MUL

乘法指令
MUL AB ; (A)X(B) ->BA

  • 当乘积大于255时,也就是乘积的高字节B不为0时,置OV-1,否则清0
  • Cy位总是0
  • 运算结果影响P

DIV

除法指令
DIV AB ; (A)/(B): 商->A, 余数->B`

  • 无符号数相除,当除数(B)=0时,结果为无意义,并且OV置1
  • Cy位恒为0
  • 运算结果影响P

DA

当两个BCD码数进行加法时,必须增加一条DA A指令,否则结果就会出错

  • 若低四位>9或者(Ac)=1,则低四位 +6调整
  • 若高四位>9或者(Cy)=1,高四位+6调整
  • 若高四位=9且低四位>9,则高四位和低四位分别+6调整

DA指令只能跟在加法指令后面使用
调整前参与运算的两数是BCD码数
DA指令不能与减法指令配对使用

ADD A ,#59H   ;实现38+59 = 97 的操作
DA A 	      ; 调整

CLR

清0指令
CLR A ;将累加器A的内容清0
不影响Cy,Ac,OV位

CPL

CPL A ;对累加器A的内容各位求反
不影响标志位

RL , RR , RLC , RRC

四条指令都仅对A有效

  • RL,RR不带Cy位的诸位循环移位一次指令,不影响PSW
  • RLC,RRC带Cy位的诸位循环移位,影响Py,P标志位
    1.PNG

ANL

逻辑“与”操作
两个操作数之间按位与,结果放到第一操作数

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

可用于屏蔽某些数位

ORL

逻辑“或”操作
两个操作数之间按位或,结果放到第一操作数

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

XRL

两个操作数之间按位“异或”操作,结果放到第一操作数中

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

LJMP

长转移指令
LJMP addr16 ; addr16 ->PC
转移目标地址可以在64K程序存储器范围内的任何位置

AJMP

绝对(短)转移指令
AJMP addr11 ;addr11 -> PC10~0
AJMP指令的转移目标地址必须与AJMP下一条指令的第一个字节在同一个2Kbyte区范围内(转移目标地址必须与下一条指令的高五位一致)

SJMP

相对转移指令
SJMP rel ;(PC)+rel -> PC
指令执行时,把指令的有符号的偏移量rel加到PC上,计算出目标地址
因此跳转的目的地址可以在下一条指令为起点的(-128~+127)个字节的偏移范围内

JMP

间接转移指令
JMP @A+DPTR ; (A) + (DPTR) -> PC
目的地址由指针DPTR作为基址,和变址A(无符号数)的内容之和形成
本指令不改变A和DPTR的内容,也不影响标志位

JZ JNZ

累加器判0转
JZ rel ; A=0, 转 PC = PC(当前) + rel
JNZ rel ; A!=0 跳转

JC JNC

JC rel ;Cy=1, 转PC = PC(当前)+rel
JNC rel ;Cy=0 转

JB JNB JBC

可寻址位条件判转(三字节)

JB bit,rel   ;(bit)=1,转PC = PC(当前) + rel
JNB bit,rel  ;(bit)=0转
JBC bit,rel  ;(bit)=1转,并将该位清零

CJNE

比较不相等转移指令

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

功能为两数比较不相等转移,操作过程为第一操作数减去第二操作数
若相减结果小于0,Cy置1,否则清0,不改变原来的操作数

范围,以下一条指令的首地址为起点的-128~+127字节内

DJNZ

减1不为0转移指令

DJNZ Rn,rel       ;n=0~7
DJNZ direct,rel   

指令功能是将源操作数(Rn或者direct减1),结果送回源操作数中
如果结果不为0就转到目的地去,否则继续下面一条指令执行

LCALL

长调用指令

 LCALL addr16    ;(PC)+3 -> PC
		 ;(SP)+1 -> SP,(PC7~0) -> (SP)
		 ;(SP)+1 -> SP,(PC15~8) ->(SP)
		 ;addr16 -> PC

ACALL

绝对(短)

ACALL addr11    ;(PC)+2 -> PC
		;(SP)+1 -> SP, (PC7~0) -> (SP)
		;(SP)+1 -> SP, (PC15~8) -> (SP)
		;addr11 -> PC10~0

RET

子程序返回指令

RETI

中断返回指令

除了具有RET指令的所有功能之外,还将自动清除优先级寄存器的优先级状态
RETI指令在中断服务子程序中作为最后一条返回指令

NOP

空操作指令
指令不执行任何实际操作,执行时间为一个机器周期,占1个字节

SETB

SETB C     ; 将Cy置1
SETB bit   ;将bit位置置1

举例:
SETB P1.7 ; 1 -> P1.7

4.伪指令

ORG

汇编起始地址伪指令
指令格式
ORG m
m为十六进制或者十进制数,它规定了下面的程序或者数表应从ROM的m地址处开始存放

ORG 0000H

END

汇编结束伪指令
END
用于终止源程序的汇编工作,一般一个源程序只能有一个END,位于程序的最后

EQU

赋值伪指令
指令格式
标号名称 EQU 汇编符号或者数

EQU右边的数或者汇编符号赋给左边的标号名称,在整个程序有效

LONG EQU 50H

DB

定义字节伪指令
指令格式
标号 DB 字节常数或者数表
表明从该标号地址单元开始定义一个或者若干个字节的数
十进制数自动转化为十六进制数,字母按照ASCII码存储

ORG 1000H
TAB: DB 30H,40H,24,"C","B"
表示从1000H单元开始存放数,汇编后

(1000H) = 30H
(1001H) = 40H
(1002H) = 18H (十进制24转化为16进制的数)
(1003H) = 43H (字符C的ASCII码)
(1004H) = 42H


### DW
定义字伪指令 
```ORG 2000H
   TAB1: DW 1234H,9AH,10

汇编后

(2000H) = 12H
(2001H) = 34H
(2002H) = 00H
(2003H) = 9AH
(2004H) = 00H
(2005H) = 0AH

DS

预留空间伪指令
指令格式
标号 DS 表达式
TAB2: DS 100

BIT

位地址符号伪指令
指令格式
标号名称 BIT 位地址

M0 BIT 20H.0
MOV C,M0

———————————————————————————未完待续—————————————————————————————

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议