3.1 MCS-51单片机汇编指令格式和寻址方式
AT89C51单片机的基本指令共111条,按指令在程序存储器所占的字节来分,可分为以下3种:
(1)单字节指令,共49条;
(2)双字节指令,共45条;
(3)三字节指令,共17条。
按指令的执行时间来分,可分为以下3种:
(1)1个机器周期(12个时钟振荡周期)的指令,共64条;
(2)2个机器周期(24个时钟振荡周期)的指令,共45条;
(3)只有乘、除两条指令的执行时间为4个机器周期(48个时钟振荡周期)。
1.指令格式
MCS-51单片机的指令格式与8086类似,一条指令通常由两部分组成:操作码和操作数。AT89C51单片机的汇编语言指令的书写格式如下:
例如,一条数据传送指令:
其中,MOV是操作码,A和4CH是操作数,“;”后面的内容是注释。
需要注意的是,在汇编程序中使用的“;”“:”和“,”为英文的分号、冒号和逗号,而非中文下的“;”“:”和“,”。
1)操作码
操作码是由助记符表示的字符串,它规定了指令的操作功能。操作码是指令的核心,不可缺少。
2)操作数
操作数是指参加操作的数据或数据的地址。MCS-51单片机的指令系统中指令的操作数个数可以是0~3。不同功能的指令,操作数的个数和作用有所不同。例如,传送类指令多数有两个操作数。紧跟在操作码后面的第一操作数称为目的操作数,表示操作结果存放的地址;后面的第二操作数称为源操作数,给出操作数或操作数的来源地址。
3)标号
标号即用符号代表其后面指令的首地址。标号由1~8个字符组成,第一个字符必须是字母,其余字符可以是字母、数字或其他特定符号,标号放在操作码前面,与操作码之间必须用“:”隔开。标号起标记作用,在指令中是可选项,一般用在一段功能程序的第一条指令前面。
4)注释
注释是为了便于阅读该条指令所做的说明,注释是可选项,即可有可无。为了提高程序可读性,多数程序需要进行适当注释。
5)其他
由指令格式可见,操作码与操作数之间必须用空格分隔;操作数与操作数之间必须用“,”分开;注释与指令之间必须用“;”分开。操作码和操作数有对应的二进制代码,指令代码由若干字节组成。不同的指令字节数不一定相同,MCS-51单片机的指令系统中有单字节、双字节和三字节指令。
2.寻址方式
寻址方式就是在指令中说明操作数所在地址的方法。AT89C51单片机的指令系统有以下7种寻址方式。
1)寄存器寻址方式
寄存器寻址方式就是操作数在寄存器中,因此指定了寄存器就能得到操作数。例如,指令
表示把寄存器Rn的内容传送到累加器中,由于操作数在Rn中,因此在指令中指定了从寄存器Rn中取得源操作数,所以称为寄存器寻址方式。寄存器寻址方式的寻址范围包括:
① 4组通用工作寄存器区,共32个工作寄存器组。但只能寻址当前工作寄存器区的8个工作寄存器组,因此指令中的寄存器名称只能是R0~R7。
② 部分特殊功能寄存器,如累加器、寄存器以及数据指针寄存器等。
2)直接寻址方式
在直接寻址方式中,指令中直接以单元地址的形式给出操作数。该单元地址中的内容就是操作数。例如,指令
表示把内部RAM地址为26H单元的内容传送到累加器。源操作数采用的是直接寻址方式。
直接寻址的操作数在指令中以存储单元的形式出现,因为直接寻址方式只能使用8位二进制数表示的地址,因此,直接寻址方式的寻址范围只限于:
① 内部RAM的128个单元。
② 特殊功能寄存器。
特殊功能寄存器除了以单元地址的形式给出,还可以用寄存器符号的形式给出。例如,指令
表示把P1端口(地址为90H)的内容传送给A,也可写为
这也表示把P1端口(地址为90H)的内容传送给A,两条指令是等价的。
直接寻址方式是对所有特殊功能寄存器读写的唯一寻址方式。
3)寄存器间接寻址方式
前述的寄存器寻址方式,在寄存器中存放的是操作数,而寄存器间接寻址方式在寄存器中存放的是操作数的地址,即先从寄存器中找到操作数的地址,再按该地址找到操作数。由于操作数是通过寄存器间接得到的,因此称为寄存器间接寻址。为了区别寄存器寻址和寄存器间接寻址,在寄存器间接寻址方式中,应在寄存器名称前面加前缀标志“@”。例如,指令
其中,Ri中的内容为26H,即从Ri中找到源操作数所在单元的地址26H,把该地址中的内容传送给A,即把内部RAM中地址为26H的单元的内容传送到A。
4)立即寻址方式
立即寻址方式就是直接在指令中给出操作数。出现在指令中的操作数也称立即数。为了与直接寻址指令中的直接地址加以区别,须在操作数前面加前缀标志“#”。例如,指令
表示把立即数55H传送给A,55H这个常数是指令代码的一部分。采用立即寻址方式的指令是双字节的。第一字节是操作码,第二字节是立即数。因此,立即数就是放在程序存储器内的常数。
5)基址寄存器加变址寄存器间接寻址方式
基址寄存器加变址寄存器间接寻址方式用于读出程序存储器中的数据到累加器中。该寻址方式是以DPTR或PC作为基址寄存器,以累加器作为变址寄存器,并以两者内容相加形成的16位地址作为操作数的地址,以达到访问数据表格的目的。例如,指令
假设A的原有内容为10H,DPTR的内容为0210H,该指令执行的结果是把程序存储器0220H单元的内容传送给A。
下面对该寻址方式做如下说明。
① 该寻址方式只能对程序存储器进行寻址,寻址范围可达64KB。
② 该寻址方式的指令只有3条:
其中,前两条指令是读程序存储器指令,最后一条指令是无条件转移指令。
6)位寻址方式
AT89C51单片机具有位处理功能,可以对数据位进行操作,因此就有相应的位寻址方式,而8086指令系统不具备该寻址功能。位寻址方式中可以直接使用位地址,例如,指令
其功能是把位地址为55H的值传送到C。位寻址方式的寻址范围包括如下两种情况。
(1)内部RAM中的位寻址区。
单元地址为20H~2FH,共16个单元,128位,位地址是00H~7FH,对这128位的寻址使用直接地址表示。寻址位有两种表示方法,一种是位地址,如55H;另一种是单元地址加上位,如“(2AH).5”,它指的是2AH单元中的第6位。55H与(2AH).5是等价的。
(2)特殊功能寄存器中的可寻址位。
可供位寻址的特殊功能寄存器见表2-8,其中有4位没有定义。这些可寻址位在指令中有如下4种表示方法。
①直接使用位地址。例如,PSW寄存器位5的位地址为0D5H。
②位名称的表示方法。例如,PSW寄存器位5是F0标志位,则可使用F0表示该位。
③单元地址加位数的表示方法。例如,0D0H单元(即PSW寄存器)位5,表示为(0D0H).5。
④特殊功能寄存器符号加位数的表示方法。例如,PSW寄存器的位5表示为PSW.5。
7)相对寻址方式
相对寻址方式是为解决程序转移而专门设置的,为转移指令所采用。在相对寻址的转移指令中,给出了地址偏移量,以Rel表示,即PC的当前值加上偏移量就构成了程序转移的目的地址。但这里的PC当前值是紧接在转移指令后的下一条指令的PC值,即转移指令的PC值加上它的字节数。因此,转移的目的地址可用下式表示:
目的地址=转移指令所在的地址+转移指令的字节数+Rel
其中,Rel是一个带符号的8位二进制数补码数,它所能表示的数的范围是-128~+127。因此,相对转移是以转移指令的下一条指令所在地址为基点,向地址增加方向最大可转移127个单元地址,向地址减少方向最大可转移128个单元地址。
AT89C51单片机指令系统的7种寻址方式见表3-1。
表3-1 AT89C51单片机指令系统的7种寻址方式