MCS-51 指令
1.定位伪指令:ORG
2.定义字节伪指令:DB
3.定义字伪指令:DW
4.赋值伪指令:EQU
5.定义存储空间伪指令:DS
6.定义位地址符号伪指令:BIT
7.数据地址赋值伪指令:DATA
8.汇编结束伪指令:END
MCS-51 指令表
MCS-51指令中所用符号和含义
Rn——当前工作寄存器组的8个工作寄存器(n=0~7)。
Ri—— 可用于间接寻址的寄存器,只能是当前寄存器组中的2个寄存器R0、R1(i=0,1)。
direct——内部RAM中的8位地址(包括内部RAM低128单元地址和专用寄存器单元地址)。
#data——8位常数。
#data16——16位常数。
addr16——16位目的地址,只限于在LCALL和LJMP指令中使用。
addr11——11位目的地址,只限于在ACALL和AJMP指令中使用。
rel——相对转移指令中的8位带符号偏移量。
DPTR——数据指针,16位寄存器,可用作16位地址寻址。
SP——堆栈指针,用来保护有用数据。
bit——内部RAM或专用寄存器中的直接寻址位。
A——累加器。
B——专用寄存器,用于乘法和除法指令或暂存器。
C——进位标志或进位位,或布尔处理机中的累加器。
@——间接寻址寄存器的前缀标志,如@Ri,@DPTR。
/——位操作数的前缀,表示对位操作数取反,如/bit。
(×)——以×的内容为地址的单元中的内容,X为表示指针的寄存器Ri(i=0、1)、DPTR、SP(Ri、DPTR、SP的内容均为地址)或直接地址单元。如:为了区别地址单元与立即数如30H单元与立即数30H,注释时,表述地址单元时用括号如(30H),立即数直接表示30H。
$——表示当前指令的地址。
<=>——表示数据交换。
←——箭头左边的内容被箭头右边的内容所代替。
指令系统是指一组指令,不出现相同的指令
程序是指一组指令堆放在一起,并且能够完成一个功能。其中会出现相同的指令。
(1).MCS-51有8中寻址方式
MCS-51汇编语言指令格式:
[标点:]操作码(空格)[操作数1],[操作数2],[操作数3];[注释]
第一部分是标号(可以没有)。它为用户定义的符号,标号实际上为符号地址,标号值代表这条指令在程序存储器中的存放地址,标号以字母开头,后跟1~8个英文字母或数字,并以冒号结尾。
第二部分为操作码。他反映了指令功能,是汇编指令中唯一不可缺少的部分。
第三部分为操作数。可以有1~3个操作数。它是给指令的操作提供数据或数据地址的。
第四部分为注释。(可以没有)
寻址就是寻找指令中操作数或操作码所在的地址。
MCS-51的8种寻址方式:直接寻址,立即寻址,寄存器寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,页面寻址。
一、直接寻址是指在指令中直接给出操作数所在存储单元的地址。
直接寻址访问以下三种存储空间:
1.特殊功能寄存器 | 例:MOV A,P1 ;(P1)→A
2.内部数据存储器的低128字节 | 例:MOV A,5AH ;(5AH)→A
3.位地址空间
二、立即寻址即操作数以指令字节形式存放于程序存储器中
立即寻址的操作数存放的是操作数的数值;直接寻址的操作数存放的是操作数数值的地址。
例:MOV A,5AH ;(5AH)→A [直接寻址]
MOV A,#5AH ;5AH→A [立即寻址]
三、寄存器寻址由指令指出某个寄存器为内容为操作数
例:MOV A,R0 ;(R0)→A
四、寄存器间接寻址将指定寄存器内容作为地址进行操作
例:MOV A,@R0 ;((R0))→A
五、变址寻址是基址寄存器加变址寄存器间接寻址的寻址方式,是以16位是程序计数器PC和数据指针DPTR作为基址寄存器,以8位的累加器作为变址寄存器,基址寄存器和变址寄存器的内容相加成新的16位的地址,该地址位操作数的地址。(该类寻址只有两条命令)
MOVC A,@A+DPTR
MOVC A,@A+PC
六、相对寻址是以当前的程序计数器PC值加上指令中给定的偏移量rel所得的结果作为转移地址。
目的地址=源地址+相对转移指令字节数+rel
例:JC 75H ;(PC)+2+75H→PC
七、位寻址不仅可以进行按字节单位进行存储和操作,还可以按位的单位进行存储和操作
例:MOV C,01H ;01H为位地址
八、页面寻址:当用R0,R1作为地址指针访问片外RAM时的寻址方式。
例:MOVX @R0,A ;(A)→0A001H
(2).MCS-51的指令系统
一.数据传送类指令
这类指令有:MOV,MOVX,MOVC,XCH,XCHD,SWAP,POP,PUSH
MOV是移动指令,例子上面已有列出。
查表指令:MOVC
1.MOVC A,@A+PC ;((A)+(PC))→A
2.MOVC A,@A+DPTR ;((A)+(DPTR))→A
MOVX是累加器A与片外数据存储器传送指令
堆栈操作指令
1.PUSH direct ;直接寻址,(SP)+1→SP,(direct)→(SP)
2.POP direct ;直接寻址,((SP))→direct,(SP)-1=SP
交换指令
1.XCH A,Rn ;即操作数进行交换
2.XCHD A,@Ri ;半字节交换指令,即累加器A中的底四位与操作数中的底四位进行交换
3.SWAP A ;自身半字节交换指令,即累加器A中底四位与高四位进行交换。
二.算术运算指令
这类指令有:ADD,ADDC,INC,SUBB,DEC,DA,MUL,DIV
ADD是不带进位的加法指令 |例:ADD A,70H ;(A)+(70H)→A
ADDC是带进位的加法指令 |例:ADDC A,R0 ;(A)+(R0)+CY→A
CY是进位标志
SUBB是带进位的减法指令 |例:SUBB A,Rn ;(A)-(Rn)-CY→A
增量指令 |例:INC A ;(A)+1→A
减量指令 |例:DEC A ;(A)-1→A
乘法指令 |例:MUL AB ;A*B的位数少于8位,则OV=0;否则OV=1
除法指令 |例:DIV AB ;就是A除B,结果的商放在A中,余数放在B中
三.逻辑运算类指令
这类指令有:CLR,CPL,RL,RLC,RR,RRC,ANL,ORL,XRL
CLR是清零操作,CPL是取非操作
RL是左循环移位1位,RR是右循环移位1位,
RLC是累加器A与进位标志CY一起向左循环移位1位,RRC是累加器A与进位标志CY一起向右循环移位1位
ANL是逻辑与运算,ORL是逻辑或运算,XRL是逻辑异或运算
四.位操作类指令
这类指令有:MOV,CLR,CPL,SETB,ANL,ORL,JC,JNC,JB,JNB,JBC
MOV是位变量传送指令
CLR,CPL,SETB是位变量修改指令
ANL,ORL是位变量逻辑运算指令
JC,JNC,JB,JNB,JBC是位变量条件转移指令,这些指令是对PC或bit先进行判断,然后进行操作
五.控制转移类指令
这类指令有:AJMP,SJMP,LJMP,JZ,JNZ,CJNE,DJNZ,ACALL,LCALL,RET,RETI,NOP
1.无条件跳转指令
AJMP是绝对短跳转指令,在程序存储器中每个2K的空间内进行跳转,但是不能从一个2K空间跳倒另一个2K空间里
SJMP是相对短跳转指令,在程序存储器里,以当前位子为中心进行-128~127范围的跳转
LJMP是长跳转指令,在64K的程序存储器里任意跳转
JMP间接跳转指令
2.条件转移指令
判零跳转指令:
1.JZ rel ;当(A)=0时,执行跳转操作。2.JNZ rel ;当(A)!=0时,执行跳转操作
比较不相等跳转指令:
1.CJNE A,direct,rel ;当A与direct相等的时候不执行跳转;当A>direct的时候,执行跳转,CY至0;当A<direct的时候,执行跳转操作,CY至1
减1不为0跳转指令:DJNZ
调用返回指令:短调用指令,ACALL addr11
长调用指令,LCALL addr16
从子程序返回指令:RET
从子程序返回指令:RET
从中断返回指令:RETI
空操作指令:NOP ;(PC)+1→PC 即这个指令就是没有任何效果