前言
想不到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位的寄存器
DPH
和DPL
组成 - 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标志位
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.
Comments | 0 条评论