第八节 汇编指令一(数据传送/逻辑运算/算术运算)数据传送 数据传送类指令是使用频率最高的一类指令。主要用来给8051单片机系统的内部和外部资源赋值、进行堆栈的存取操作等。数据传送类指令执行前后,对程序状态字PSW一般不产生影响。按其操作方式,又可把它们分为三种 数据传送 -- MOVMOV指令的作用区间主要是内部数据存储器和特殊功能寄存器。
格式为 MOV <目的字节>,<字书>
字节>,<字书>
把第二操作数指定的字节变量传送到由第一操作数指定的单元中,源字节内容不变,一般不影响别的寄存器或标志
立即数送累加器A和Rn、内部RAM、SFR。共有4条指令:
MOV A,#data8 ;(A)←#data8
MOV addr8,#data8 ;(addr8)←#data8
MOV @Ri,#data8 ;((Ri))←#data8
MOV Rn,#data8 ;(Rn)←#data8
@符号表示间接寻址,Ri中i-0或i=1 
Rn、内部RAM、SFR与累加器A传送数据。共有6条指令
MOV A,addr8
MOV A,@Ri
MOV A,Rn
MOV addr8,A
MOV @Ri
MOV
间接寻址@Ri是以Ri的内容作为地址进行寻址,由于Ri为8位寄存器,所以其寻址范围可为00H~FFH。
例如:
MOV R1,#82H
MOV A,@R1 外部数据存储器(或扩展并行I/0口)与累加器A传送指令MOVXMOVX指令主要用于累加器A和外部RAM或扩展并行I10口进行数据传送。这种传送只有一种寻址方式,就是寄存器间接寻址。寄存器间接寻址有两种方式: - 用R1或R0进行寄存器间接寻址
可访问外部数据存储器(或扩展并行I0口)256个字节中的一个字节。需使用P2口输出高8位地址,需要先给P2和Ri赋值,然后执行MOVX指令。 - 用16位的数据存储器地址指针DPTR进行寄存器间接寻址
这种方式 能遍访64KB的外部数据存储器(或扩展并行I0口)的任何单元。
程序存储器向累加器A传送指令---MOVC对于程序存储器的访问,单片机提供了两条极其有用的查表指令
指令格式:
MOVC A,@A+PC ;PC←(PC)+1,(A)←((A)+(PC))这条条指令以PC作为基址寄存器,指令查表范围只能在以PC当前值开始后的256个字节范围使表格地址空间分配受到限制。
MOVC A,@A+DPTR ;(A)←((A)+(DPTR))
这条指令以数据指针DPTR为基址寄存器,由于DPTR可以通过指令来设置,表格常数可设置在64K程序存储器的任何地址空间。若DPTR已有它用,在将表首地址赋给DPTR之前必须保护k现场,执行完查表后再子以恢复。 这两条指令采用变址寻址,以PC或DPTR为基址寄存器,以累加器A为变址寄存器,基址寄存器与变址寄存器内容相加得到程序存储器某单元的地址值,MOVC指令把该存储单元的内容传送到累加器A中。指令主要用于查表,即完成从程序存储器读取数据的功能。由于两条指令使用的基址寄存器不同,因此使用范围也不同。 数据交换1.字节交换指令指令把累加器A中的内容与第二操作数的内容互相交换
XCH A, addr8 ;(A)←→(addr8)
XCH A, @Ri ;(A)←→((Ri))
XCH A, Rn ;(A)←→(Rn) 2.半字节交换指令指令把累加器A的低4位和寄存器间接寻址的内部RAM单元的低4位交换,高4位内容不变,不影响标志位。
XCHD A,@Ri 栈操作堆栈区是将内部存储器的一部分区域划作专门用于堆栈的区域。堆栈区的操作规则是后进先出(LIFO-Last In First Out),即最后存入的数据将被最先取出。堆栈区当前的栈顶地址用堆栈指针寄存器SP中的值表示,即SP始终指向栈顶。 逻辑运算算术运算算术运算类指令主要完成加、减、乘、除四则运算,以及增量、减量和二十进制调整操作。除增量、减量指令外,大多数算术运算指令会影响到状态标志寄存器PSW。表4-3反映了算术运算类指令对标志位的影响。 加减法运算指令加减运算中,以累加器A为第一操作数,并存放操作后的结果。第二操作数可以是立即数、工作寄存器、寄存器间接寻址字节或直接寻址字节。 1.加法指令: ADD,把源字节变量(立即数、直接地址单元、间接地址单元、工作寄存器内容)与累加器相加,结果保存在累加器中,影响标志AC、CY、OV、P。 2.带进位加法指令: ADDC除了相加时应考虑进位标志外,其他与一般加法指令完全相同
例:设累加器A内容为0AAH,RO内容为55H,CY内容为1,执行指令:
ADDC A,RO
将使得: (A)=00000000B AC=1,CY=1,OV=0 乘除法运算指令乘除运算指令在累加器A和寄存器B之间进行,运算结果保存在累加器A和寄存器B中。 1.乘法指令 MUL AB该指令把累加器A和寄存器B中的8位无符号整数相乘,16位乘积的低字节在累加器A中高字节在寄存器B中,如果乘积大于255(OFFH),则溢出标志位置1,否则清0,运算结果总使进位标志CY清0。 2.除法指令 DIV AB该指令把累加器A中的8位无符号整数除以寄存器B中8位无符号整数,所得商放在累加器A中余数存在寄存器B中,标志位CY和OV均清0。若除数(B中内容)为00H,则执行后结果为不定值,并置位溢出标志OV 3.增量、减量指令增量指令INC完成加1运算(相当于C语言中的++),减量运算DEC完成减1运算(相当于C语言中的--)。这两条指令均不影响标志位(但对累加器A的操作将影响P标志)
|