单片机 (4)
- 格式:pdf
- 大小:832.27 KB
- 文档页数:135
3章MCS51指令系统•汇编语言是一种面向机器的语言,是用符号来表示指令和地址的语言。
单片机的编程,可以使用C语言等高级语言,也可以使用汇编语言。
3.1 寻址方式大多数指令执行时,都需要使用操作数。
寻址方式就是在指令中说明操作数所在地址的方法。
一般说来,寻址方式越多,单片机的功能就越强,灵活性越大,指令系统也就越复杂。
2.1.1 寻址方式MCS-5l单片机有以下7种寻址方式:1)立即数寻址方式⏹立即寻址方式就是操作数在指令中直接给出。
出现在指令中的操作数即为立即数。
立即数前面加前缀标志“#”。
例如指令:⏹MOV A,# 40H所谓寻址,就是寻找操作数的地址,立即数寻址实际上不存在寻址的问题,操作数就是所提供的数值,因此所谓立即数寻址只是一种习惯说法。
2)寄存器寻址方式⏹寄存器寻址方式就是操作数在工作寄存器中,因此,指定了寄存器就能得到操作数。
在寄存器寻址方式的指令中,以符号名称表示寄存器。
例如指令:⏹MOV A,Rn;n=0~7⏹传送实际上是拷贝寄存器寻址范围包括:⏹①4组通用工作寄存区共32个工作寄存器。
但只能针对当前的工作寄存器区的8个工作寄存器进行操作,因此指令中的寄存器的名称只能是R0~R7。
⏹②部分特殊功能寄存器,例如累加器A、寄存器B以及数据指针DPTR(DPH、DPL)等。
3)直接寻址方式⏹直接寻址方式中,指令的操作数直接以单元地址的形式给出。
例如,假设指令执行前地址40H数据存储单元的值为12H,指令:⏹MOV A,40H⏹注意与立即数寻址的区别⏹直接寻址方式只能使用8位二进制数表示的地址,所以直接寻址方式的寻址范围只限于:⏹①内部RAM的低128个单元;⏹②特殊功能寄存器。
寄存器寻址只是直接寻址方式针对寄存器的特定表示方法,在实质上与直接寻址没有区别。
4)寄存器间接寻址方式⏹寄存器中存放的是地址,即操作数是通过寄存器中的地址间接得到的,因此称之为寄存器间接寻址,简称为间址寻址。
例如:⏹MOV A,@R0寄存器间接寻址方式中的寄存器只有R0、R1和DPTR三个。
寄存器间接寻址范围为:⏹①访问内部RAM低128个地址单元,其通用形式为@Ri(i=0,1);⏹②对片外数据存储器的64K字节的间接寻址,只能使用DPTR作间接寻址寄存器,其形式为@DPTR。
例如:⏹MOVX A,@DPTR5)基址寄存器加变址寄存器间接寻址方式⏹这种寻址方式简称为基址加间接寻址,主要用于查程序存储器中的数据表,只能以寄存器DPTR或PC作基址寄存器,以累加器A作为变址寄存器。
并以两者中的数值相加形成的16位数值作为地址寻找操作数,以达到查表的目的。
⏹MOVC A,@DPTR+A⏹这种寻址方式的指令只有3条:⏹ MOVC A,@A+DPTR⏹ MOVC A,@A+PC⏹ JMP @A+DPTR6)位寻址方式⏹MCS-51单片机有位处理功能,可以对数据按位进行操作,因此就有相应的位寻址方式。
位寻址指令中可以直接使用位地址,例如:⏹MOV C,40H⏹区别:MOV A,40H⏹同样一个数值,在指令中是代表字节地址还是代表位地址,除了可以由操作数的类型决定外,也可以由操作码决定,例如:⏹SETB40H⏹位寻址的寻址范围包括:⏹①内部RAM中的位寻址区,字节地址为20H~2FH,共16个字节单元,128个位,位地址是00H~7FH。
⏹对这128个位的寻址使用直接地址表示。
位寻址区中的位有两种表示方法,一种是直接给出位地址;另一种是字节地址加上位数,例如(20H).6。
例如:⏹MOV C,06H⏹MOV C,(20H).6⏹两条指令的作用是等效的。
⏹②特殊功能寄存器可寻址位,有4种表示方法:⏹特殊功能寄存器符号加位数的表示方法。
例如PSW寄存器的位5表示为PSW.5;⏹直接使用位地址。
例如PSW寄存器位5的位地址为0D5H;⏹位名称的表示方法。
例如PSW寄存器位5是F0标志位,可使用F0表示该位;⏹字节地址加位数的表示方法。
例如PSW寄存器位5,因PSW的字节地址为0D5H,可表示为(0D0H).5。
⏹这4种位表示方法相互是等价的。
7)相对寻址方式⏹相对寻址方式是为解决程序转移而专门设置的,为各种转移指令所采用。
这种寻址方式以当前指令所在程序地址(程序指针PC中的值)为基数,加上给定的地址偏移量,从而得到新的执行指令地址(新的PC值)。
例如:⏹JC50H⏹指令当中的“50H”就是所谓的地址偏移量,通常用一个符号(标号)来代替,例如用标号LOOP来代替数值50H,则指令可以写成:⏹JC LOOP所谓“相对寻址方式”,实际上并不存在“寻找操作数地址”的问题,地址偏移量本身就是指令的操作数,根据地址偏移量得到跳转地址是指令自身的功能。
从硬件电路的运行过程看,新的地址由指令译码电路直接获得,跳转类指令并不存在取操作数的过程。
2.1.2 寻址方式符号说明⏹Rn 、Ri 、direct 、#data 、#data16 ⏹rel 、DPTR 、bit 、C或CY⏹addr11 ,addrl6⏹@3.2指令功能分类列表单片机所能执行的指令的集合就是其指令系统。
MCS—51单片机指令系统是—种简明易掌握、效率较高的指令系统,其一大特点是在硬件结构中有一个位处理机(也称布尔处理机),对应这个位处理机,指令系统中相应地设计了一个处理位变量的指令子集,这个子集在开发需大量处理位变量的程序时十分有效、方便,非常适合测量、控制系统的应用。
2.2.1 指令概述指令的表示方法称为指令格式。
一条指令通常由两部分组成,即操作码和操作数。
操作码用来规定指令进行什么操作,而操作数则是指令操作的对象。
操作数可能是一个具体的数据,也可能是指出到哪里取得数据的地址或符号。
对于机器而言,指令实质上就是一些二进制数码(机器码),包括操作码和操作数。
如果用一个个二进制数(机器码)来表示指令,则编程、记录时都不直观,因此,汇编语言采用一些与指令功能相关的英文字母来代表指令操作码,称为助记符,用具有特定含义的符号代表操作数,称为标号或变量名。
⏹在汇编语言指令说明中,一般包括以下几个内容:⏹机器码格式⏹指令字长⏹指令周期数⏹指令执行的过程3.3 指令描述1)ACALL指令⏹指令格式:ACALL addr11⏹指令描述:短调用地址为addr11的子程序。
⏹实际编程时不用这么复杂计算,可以用标号代替addr11,例如:⏹ACALL DISP⏹指令执行时,将调用标号(名称)为DISP的子程序。
2)ADD指令⏹指令格式:ADD A,Rn ;(A)+(Rn) →A,n=0~7⏹ADD A,direct;(A)+(direct) →A⏹ADD A,@Ri;(A)+((Ri)) →A,i=0,1⏹ADD A,#data;(A)+#data→A⏹指令描述:ADD指令称为加法指令,其功能为:将被寻址数据单元的值(或立即数)与累加器A中的值相加,结果保存到累加器A中。
ADD指令的功能也可以简单的描述为:将被寻址数据单元的值加到累加器A中。
ADD指令完成两个8位二进制数加法运算,其中一个加数总是来自累加器A,而另一个加数可由寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等不同的寻址方式得到。
其相加的结果总是放在累加器A中。
⏹使用加法指令时,要注意运算结果对标志位的影响:⏹①如果位7有进位,则置“1”进位标志C,否则清“0”C。
⏹②如果位3有进位,置“1”辅助进位标志AC,否则清“0”AC。
⏹③如果位6、位7没有同时进位,则溢出标志位OV置“1”,否则清“0”OV。
⏹关于溢出的概念,在数字电路中已经学习过,在此说明如下:⏹设两个8位二进制数11111001B(-7)和00001000B(8)相加,结果为00000001B,加的过程中,最高位(位7)和次高位(位6)同时发生了进位,此时结果是正确的,没有发生溢出,加法只影响进位位。
⏹设两个8位二进制数01111111B(127)和01000000B(64)相加,结果为10111111B (-63),显然结果是错误的。
加的过程中,次高位(位6)发生了进位,而最高位(位7)没有发生进位,这就是溢出。
⏹同样,如果两个绝对值较大的负数相加,结果也会变成正数,加的过程中,最高位发生了进位而次高位没有发生进位。
⏹减法运算也有类似的效应,绝对值较大的两个有符号数相减,可能会发生溢出,绝对值较小的两个有符号数相减,不会发生溢出。
⏹因此,判断两数之和(之差)是否溢出,就是看加(减)的过程中最高位和次高位是否同时发生进位(借位),如果同时发生进位(借位)或都不发生进位(借位),则没有溢出,否则就是溢出。
避免加法溢出现象的最简单方法是减少有效数位数,保留两位符号位。
比如两个00111111B(前两位为符号位)相加,结果仍为正数。
因此,在编程时,应注意加数(减数)的绝对值不能过大。
从数字电路的角度来说,只有加、减法运算才会发生溢出。
MCS-51硬件电路中,乘、除法运算也会影响溢出标志位OV,具体影响情况将在相应的指令描述中说明。
3)ADDC指令⏹指令格式:⏹ADDC A,Rn;(A)+(Rn)+C →A,ADDC A,direct;(A)+(direct)+C →A⏹ADDC A,@Ri;(A)+((Ri))+C →AADDC A,#data;(A)+#data+C→A⏹指令描述:ADDC称为带进位加法指令,其进行加法运算的特点是进位标志位C参与运算,因此带进位加法运算是三个数相加。
4)AJMP指令⏹指令格式:AJMP addrl1⏹指令描述:AJMP称为无条件近跳转(转移)指令,指令执行后,将跳转到由addrl1设定的程序地址处执行。
⏹例如:⏹…⏹LOOP1:…⏹…⏹AJMP LOOP1⏹…⏹AJMP LOOP2⏹…⏹LOOP2:…⏹…5)ANL指令⏹指令格式:ANL A,Rn⏹ANL A,direct⏹ANL A,#data⏹ANL A,@Ri⏹ANL direct,A⏹ANL direct,#data ⏹ANL C,bit指令描述:ANL称为逻辑与指令,可以以字节为单位进行逻辑与运算,也可以以位为单位进行逻辑与运算。
①以字节为单位进行逻辑与运算以字节为单位进行逻辑与运算时,基本功能是将源操作数与目标操作数按位进行逻辑与运算,结果放到目标操作数存储单元中。
②以位为单位进行逻辑与运算⏹指令格式中最后一条是以位为单位进行逻辑与运算,其功能是将进位标志位C (位“累加器”)的值与直接寻址位的值进行逻辑与运算,结果存放到进位标志位C 中。
⏹例如,指令:⏹ANL C,50H6)CJNE指令⏹指令格式:CJNE A,direct,rel⏹CJNE A,#data,rel ⏹CJNE Rn,#data,rel ⏹CJNE @Ri,#data,rel⏹指令描述:CJNE称为比较不相等转移指令,当源寻址单元的值与目标存储单元的值(或立即数)不相等时,程序跳转到rel设定的地址处执行,否则,程序顺序执行。