51单⽚机的汇编指令(操作码)系统
AT89C51汇编语⾔指令系统有42种助记符和111种指令,按指令长度可分单字节指令、双字节和三字节指令,按执⾏时间可分为单机器周期指令(64种)、双机器周期指令(45种)和四周期指令(只有乘、除法指令两种)。
汇编语⾔的指令格式⼀般为:
[标号:] 操作码 [操作数1][,操作数2][,操作数3][;注释]
标号:⽤符号表⽰该条指令的⾸地址,以字母开头,以冒号结束,根据需要设置。
操作码:是由助记符表⽰的字符串,以规定指令实现何种功能,是指令语句中必须的。
操作数:⽤字母、字符和数字等表⽰,可以是数据、地址、寄存器等。操作数个数因指令不同⽽不同,可多⾄3个,各操作数之间⽤”,”分隔。
注释:必须以”;”开始,是为便于阅读⽽对指令的附加说明,可⽤汉字。
注:每条指令必须有操作码,⽅括号内所包含的内容可选;标号不能⽤系统中已定义的字符;标号与操
作码间要有”:”分隔;操作码和操作数之间⼀定要有空格;操作数之间必须⽤”,”分隔;每⾏只能有⼀条指令。
汇编语⾔指令系统中除表⽰操作码的42种助记符外还使⽤了⼀些符号,含义如下:
Rn:当前选中的⼯作寄存器组中的8个寄存器R0~R7(n=0~7)。
Ri:当然选中的⼯作寄存器组中的2个寄存器R0、R1(i=0、1)。
direct:8位直接地址,可以是⽚内RAM的地址(00H~7FH)或特殊功能寄存器地址。
#data8:包含在指令中的8位⼆进制数。
#data16:包含在指令中的16位⼆进制数。
Addr16:16位⼆进制地址,⽤于LCALL、LJMP等指令中,能到64kB地址的任何地⽅。
Addr11:⽤于ACALL和AJMP指令中,在下条指令⾸地址所在页的2kB范围内。
rel:是⽤补码表⽰的单字节带符号偏移字节数,取值范围为-128~+127。
DPTR:数据指针,可⽤作16位⼆进制的地址寄存器。
Bit:位,⽚内RAM及SFR中的可寻址位。
A:累加器。
B:特殊功能寄存器,常⽤于乘、除指令MUL和DIV中。
C:进位标志或进位位,或位处理器中的累加器,也可⽤Cy表⽰。
@:间址寄存器或基址寄存器的前缀,如@Ri、@DPTR。
/:位操作的前缀,表⽰对该位操作数取反,如/bit。
(X):X中的内容。
((X)):X中的内容为地址的空间中的内容。
←:⽤箭头右边的内容取代箭头左边的内容。
$:指本条指令的⾸地址。
按指令功能可把111种指令分为5类:数据传送类(29种)、算术操作类(24种)、逻辑操作类(24种)、控制程序转移类(17种)、布尔变量操作类(即位操作类)(17种)。
1. 数据传送指令:
数据传送类指令有29种,可分为⽚内RAM数据传送指令(MOV类)、⽚外RAM数据传送指令(MOVX类)、程序存储器ROM数据传输指令(MOVC类)、堆栈操作指令、数据交换指令。数据传送指令操作数⼀般为两个,即“操作数1”和“操作数2”,这时“操作数
2”可称为“源操作数”,“操作数1”可称为“⽬的操作数”。
1)⽚内RAM数据传送指令:
此类指令的特征是操作码为MOV。表中列出了⽚内RAM数据传送指令、功能、机器码和执⾏机器周期。
指令功能操作机器代码(16进制)机器周期
MOV A,#data(A)
汇编语言结束指令
←data 74 data1
MOV Rn,#data(Rn)78~7F data1 MOV @Ri,#data((Ri))76~77 data1 MOV direct,#data(direct)75 direct data2 MOV DPTR,#data16(DPTR)90 data15~8 data7~02
MOV A,direct(A)
←(direct)E5 direct1
MOV Rn,direct(Rn)A8~AF direct2
MOV @Ri,direct((Ri))A6~A7 direct2 MOV direct1,direct2(direct1)←(direct2)85 direct2 direct12 MOV @Ri,A((Ri))←(A)F6~F71
MOV A,Rn(A)←(Rn)E8~EF1
MOV Rn,A(Rn)←(A)F8~FF1
MOV direct,A(direct)←(A)F5 direct1
MOV direct,Rn(direct)←(Rn)88~8F direct2
MOV A,@Ri(A)←((Ri))E6~E71 MOV direct,@Ri(direct)←((Ri))86~87 direct2 2)⽚外RAM数据传送指令:
此类指令的特征是操作码为MOVX。表中列出了⽚外RAM数据传送指令、功能、机器码和执⾏机器周
期。
指令功能操作机器代码(16进制)机器周期MOVX A,@Ri(A)←(Ri)E2~E32
MOVX @Ri,A((Ri))←(A)F2~F32
MOVX A,@DPTR(A)←((DPTR))E02
MOVX @DPTR,A((DPTR))←(A)F02
该类指令均涉及对⽚外RAM的64kB地址单元操作,⽽指令MOXV A,@Ri和MOVX @Ri,A中Ri只提供⽚外RAM地址的低8位地址,所以⾼8位应由P2提供。
3)ROM数据传送指令(查表指令):
这类指令共有2条,其特征操作码为MOVC,涉及ROM的寻址空间均为64kB。表中列出了ROM数据传送指令、功能、机器码和执⾏机器周期。
指令功能操作机器代码(16进制)机器周期MOVC A,@A+DPTR(A)←((A)+(DPTR))932
MOVX A,@A+PC(PC)←(PC)+1  (A)←((A)+(PC))832
A中的内容称为变址,DPTR、PC中内容称为基址。MOVC A,@A+DPTR指令⾸先执⾏A中的内容与DPTR中的内容进⾏16位⽆符号数的加法操作,获得基址与变址之和,将和作为地址,再将该地址中的内容传送到累加器A中。低8位相加产⽣进位时,直接加到⾼位,并不影响进位标志。
MOVC A,@A+PC指令⾸先将PC值修正到指向该指令的下⼀条指令地址,然后执⾏16位⽆符号数加法操作,获得基址与变址之和,将和作为地址,再将该地址中的内容传送到累加器A中。低8位相加产⽣进位时,直接加到⾼位,并不影响进位标志。
4)堆栈操作指令:
表中列出了堆栈操作指令、功能、机器码和执⾏机器周期。
指令功能操作机器代码(16进制)机器周期PUSH direct(SP)←(SP)+1  ((SP))←(direct)C0 direct2
POP direct(direct)←((SP))  (SP)←(SP)-1D0 direct2
第⼀条指令称为⼊栈指令,⽤于把direct地址中的内容传送到堆栈中去。这条指令执⾏时分为两步执⾏,第⼀步使SP中的值加1,使之指向新的栈顶单元;第⼆步是把direct中的数据压⼊由(SP)为地址的栈顶单元中,即((SP))←(direct)。
第⼆条指令称为弹出指令。这条指令也分两步执⾏,第⼀步把栈顶单元中的数据传送到direct单元中,即(direct)←((SP));第⼆步是使SP 中的原栈顶地址减1,使之指向新的栈顶地址。
堆栈操作指令对堆栈指针SP⽽⾔是寄存器间接寻址指令,对direct⽽⾔是直接寻址,编写程序时应注意direct所表⽰的是直接地址。
例如:KEIL中认定A、R1位寄存器,⽽ACC、01H为直接地址,所以PUSH ACC、PUSH 01H、POP 01H、POP ACC为正确格式,⽽PUSH A、PUSH R1、POP R1和POP A错误。
5)数据交换指令:
表中列出了数据交换指令、功能、机器码和执⾏机器周期。
指令功能操作解释机器代码(16进制)机器周期XCH A,Rn(A)←(Rn)  C8~CF1
A中的内容和⽚内RAM单元中的内
容相交换
XCH A,direct(A)←(direct)  C5 direct1 XCH A,@Ri(A)←((Ri))  C6~C71 XCHD A,@Ri(A)←((Ri))  低4位相交换,⾼4位不变D6~D71 SWAP A(A3~0)←(A7~4)  同⼀字节中⾼、低4位互换D6~D71
2. 算术运算类指令:
算术运算类指令有24种,包括加、减、乘、除4种基本算术指令,能对8位⽆符号数进⾏直接的运算,借助溢出标志可对带符号数进⾏补码运算。有些算术运算类指令执⾏的结果将会影响程序状态字(PSW)中的标志位C、AC、OV,但是加1和减1指令并不影响这些标志位。表中列出了对进位标志位C、辅助进位标志位AC、溢出标志OV位有影响的所有指令。
影响标志位影响标志位指令
C OV AC C OV AC
ADD  ADDC  SUBB√√√CPL  C√
MUL  DIV0√CJNE√
DA√ANL C,bit√
SETB  C1ORL C,bit√
CLR  C0ANL C,bit-√
MOV C,bit√ORL C,bit-√
RRC  RLC√
1)加法指令:
表中列出了加法指令、功能、机器码和执⾏机器周期。
指令功能操作机器代码(16进制)机器周期ADD A,Rn(A)←(A)+(Rn)  28~2F1
ADD A,direct(A)←(A)+(direct)  25 direct1
ADD A,@Ri(A)←(A)+((Ri))  26~271
ADD A,#data(A)←(A)+data  24 data1
这些指令分别将⼯作寄存器中的数据、⽚内RAM单元中的数据、以Ri的内容为地址的单元中的数据或8位⼆进制⽴即数和累加器A中的数相加,并将相加所得的和存放在A中。若相加时第3位或第7位有进位时,则分别将AC、C标志位置1,否则为0。
2)带进位C的加法指令:
表中列出了带进位C的加法指令、功能、机器码和执⾏机器周期。
指令功能操作机器代码(16进制)机器周期ADDC A,Rn(A)←(A)+(Rn)+C38~3F1
ADDC A,direct(A)←(A)+(direct)+C  35 direct1
ADDC A,@Ri(A)←(A)+((Ri))+C  36~371
ADDC A,#data(A)←(A)+data+C  34 data1
这些指令执⾏后,累加器A中内容为“和”。若相加时第3位或第7位有进位时,则分别将AC、C标志位置1,否则为0。
3)加1指令:
表中列出了加1指令、功能、机器码和执⾏机器周期。
指令功能操作机器代码(16进制)机器周期
INC Rn(Rn)←(Rn)+108~0F1
INC direct(direct)←(direct)+1 05 direct1
INC @Ri((Ri))←((Ri))+1  06~071
INC A(A)←(A)+1 041 INC DPTR(DPTR)←(DPTR)+1  A32
这些指令执⾏后,不影响PSW中的标志位C、AC、OV。
4)带进位C减法指令:
表中列出了带进位C的减法指令、功能、机器码和执⾏机器周期。
指令功能操作机器代码(16进制)机器周期SUBB A,Rn(A)←(A)-(Rn)-C98~9F1
SUBB A,direct(A)←(A)-(direct)-C  95 direct1
SUBB A,@Ri(A)←(A)-((Ri))-C  96~971
SUBB A,#data(A)←(A)-data-C  94 data1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。