单片机中级教程 第3章 指令系统 下载本文

PC的内容不能随意改变,所以只能借助于A来进行调整。故在MOVC指令之前,先执行对A的加法操作,其中# data的值要根据MOVC指令后的地址和数据表格首地址之间的地址差确定,也就是由MOVC下边的指令与数据表格首地址之间,其他指令所占的字节数之和来确定。本例中,data=03H。

还应注意,累加器A中的内容为8位无符号数,该查表指令只能查找指令所在地址以后256字节范围内的数据,即表格只能放在该指令所在地址之后的256个字节范围内,故称之为近程查表指令。

3.3.4 数据交换指令

数据交换指令共有五条,可完成累加器和内部RAM单元之间的字节或半字节交换。 1.整字节交换指令

整字节交换指令有三条,完成累加器A与内部RAM单元内容的整字节交换。 XCH A,Rn ;( A) ←→(Rn)

XCH A,direct ;(A)←→(direct)

XCH A,@Ri ;(A)←→((Ri)) 2.半字节交换指令

XCHD A,@Ri ;(A)3~0←→((Ri))3~0

该指令功能是将A的低4位和Ri间接寻址单元的低4位交换,而各自的高4位内容都保持不变。

3.累加器高低半字节交换指令

SWAP A ;(A)7~4←→(A)3~0

由于十六进制数或BCD码都是以四位二进制数表示,因此SWAP指令主要用于实现十六进制数或BCD码的数位交换。

例3-7 试编程,将外部RAM 1000H单元中的数据与内部RAM 6AH单元中的数据相互交换。

解:数据交换指令只能完成累加器A和内部RAM单元之间的数据交换,要完成外部RAM与内部RAM之间的数据交换,需先把外部RAM中的数据取到A中,交换后再送回到外部RAM中。编程如下。

MOV DPTR ,#1000H ;外部RAM地址送DPTR

MOVX A ,@DPTR ;从外部RAM中取数送A

XCH A ,6AH ;A与6AH地址中的内容进行交换 MOVX @DPTR ,A ;交换结果送外部RAM 3.3.5 堆栈操作指令

堆栈操作指令可以实现对数据或断点地址的保护,它只有两条指令:

PUSH direct ;SP ←(SP)+1,(SP)←(direct) POP direct ;direct ←((SP)),SP ←(SP)-1

前一条指令是进栈指令,其功能是先将栈指针SP的内容加1,使它指向栈顶空单元,然后将直接地址direct单元的内容送入栈顶空单元。

后一条指令是出栈指令,其功能是将SP所指的单元的内容送入直接地址所指出的单元,然后将栈指针SP的内容减1,使之指向新的栈顶单元。

9

注意,进栈、出栈指令只能以直接寻址方式来取得操作数,不能用累加器或工作寄存器Rn作为操作数。例如把累加器A的内容送入堆栈,应使用指令:

PUSH ACC

这里ACC表示累加器A的直接地址EOH。 利用堆栈操作指令也可以完成数据的传送。

3.4 算术运算类指令

MCS-51系列单片机的算术运算类指令共有24条,可以完成加、减、乘、除等各种操作,全部指令都是8位数运算指令。如果需要作16位数的运算则需编写相应的程序来实现。

算术运算类指令大多数要影响到程序状态字寄存器PSW中的溢出标志OV、进位(借位)标志CY、辅助进位标志AC和奇偶标志位P。利用进位(借位)标志CY,可进行多字节无符号整数的加、减运算,利用溢出标志可对带符号数进行补码运算,辅助进位标志则用于BCD码运算的调整。 3.4.1 加法指令

ADD A ,# data ;A ←(A)+data ADD A ,direct ;A ←(A)+(direct) ADD A ,Rn ;A ←(A)+(Rn) ADD A ,@Ri ;A ←(A)+((Ri))

这组指令的功能是把源操作数所指出的内容与累加器A的内容相加,其结果存放在A中。源操作数的寻址方式分别为立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。运算结果对程序状态字PSW中的CY、AC、OV和P的影响情况如下:

进位标志CY:在加法运算中,如果D7位向上有进位,则CY=1;否则,CY=0。 半进位标志AC:在加法运算中,如果D3位向上有进位,则AC=1;否则,AC=0。 溢出标志OV:在加法运算中,如果D7、D6位只有一个向上有进位时,OV=1;如果D7、D6位同时有进位或同时无进位时,OV=0。

奇偶标志P:当A中“1”的个数为奇数时,P=1;为偶数时,P=0。 例3-8 设A=94H,(30H)=8DH,执行指令ADD A,30H,操作如下: 1 0 0 1 0 1 0 0 + )1 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 1

结果:(A)=21H,(CY)=1,(AC)=1,(OV)=1,(P)=0

参加运算的两个数,可以是无符号数(0~255),也可以是有符号数(-128~+127)。用户可以根据标志位CY或OV来确定运算结果或判断结果是否正确。无符号数用CY位表示进位、溢出(不考虑OV位),有符号数用OV位表示溢出(不考虑CY位)。

上例中,若把94H、8DH看作无符号数相加,结果中CY=1,表示运算结果发生了溢出(结果超出了8位),此时溢出的含义是向高位产生进位,所以确定结果时不能只看累加器A的内容,而应该把CY的值加到高位上,才可得到正确的结果。即结果为121H;若把94H、8DH看作有符号数(补码表示的),结果中OV=1,它表示运算结果发生了溢出,A中的值是个错误的结果。因为两个负数相加,结果却为正数,很显然,这是错误的。

10

两个正数相加或两个负数相加时,若发生溢出,将改变结果的符号位,所得结果都是错误的,OV=1正好指出了这一类错误。

无论编程人员把参加运算的两个数看作是无符号数还是有符号数,计算机在每次运算后,都会按规则自动设置标志位CY、OV、AC、P,对于编程人员来说,应能根据这些标志来了解当前运算结果所处的状态,以确定程序的走向。

3.4.2 带进位加法指令

ADDC A ,# data ;A ←(A)+ data +(CY) ADDC A ,direct ;A ←(A)+(direct)+(CY) ADDC A ,Rn ;A ←(A)+(Rn)+(CY)

ADDC A ,@Ri ;A ←(A)+((Ri))+(CY)

这组指令的功能是把源操作数所指出的内容与累加器A的内容相加、再加上进位标志CY的值,其结果存放在A中。源操作数的寻址方式分别为立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。运算结果对PSW标志位的影响与ADD指令相同。

需要说明的是,这里所加的进位标志CY的值是在该指令执行之前已经存在的进位标志值,而不是执行该指令过程中产生的进位标志值。

例3-9 设(A)=AEH,(R1)=81H,(CY)=80H, 执行指令ADDC A,R1,则操作如下: 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 1

+) 1 ←(CY)

1 0 0 1 1 0 0 0 0 结果:(A)=30H,(CY)=1,(OV)=1,(AC)=1,(P)=0

带进位加法指令主要用于多字节数的加法运算。因低位字节相加时可能产生进位,而在进行高位字节相加时,要考虑低位字节向高位字节的进位,因此,必须使用带进位的加法指令。

例3-10 设有两个无符号16位二进制数,分别存放在30H、31H单元和40H、41H单元中(低8位先存),写出两个16位数的加法程序,将和存入50H、51H单元。(设和不超过16位)

解: 由于不存在16位数的加法指令,所以只能先加低8位,后加高8位,而在加高8位时要连低8位相加的进位一起相加,编程如下:

MOV A ,30H ;取一个加数的低字节送A中 ADD A ,40H ;两个低字节数相加

MOV 50H ,A ;结果送50H单元 MOV A ,31H ;取一个加数的高字节送A中 ADD A ,41H ;高字节数相加,同时加低字节产生的进位 MOV 51H ,A ;结果送51H单元

3.4.3 带借位减法指令

SUBB A ,# data ;A ←(A) - data -(CY) SUBB A ,direct ;A ←(A) -(direct)-(CY)

11

SUBB A ,Rn ;A ←(A) -(Rn)-(CY) SUBB A ,@Ri ;A ←(A) -((Ri))-(CY)

这组指令的功能是将累加器A中的数减去源操作数所指出的数和进位位CY,其结果存放在累加器A中。源操作数的寻址方式分别为立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。运算结果对程序状态字PSW中各标志位的影响情况如下:

借位标志CY:在减法运算中,如果D7位向上需借位,则CY=1;否则,CY=0。 半借位标志AC:在减法运算中,如果D7位向上需借位,则AC=1;否则,AC=0。 溢出标志OV:在减法运算中,如果D7、D6位只有一个向上需借位时,OV=1;如果D7、D6位同时需借位或同时无借位时,OV=0。

奇偶标志P:当A中“1”的个数为奇数时,P=1;为偶数时,P=0。

减法运算只有带借位减法指令,而没有不带借位的减法指令。若要进行不带借位的减法运算,应该先用指令将CY清0,然后再执行SUBB指令。

需强调的一点是,减法运算在计算机中实际上是变成补码相加,下面举例说明。 例3-11 设(A)=DBH,(R4)=73H,(CY)=1。 执行指令SUBB A,R4 则操作如下:

1 1 0 1 1 0 1 1 (DBH) 1 1 0 1 1 0 1 1

0 1 1 1 0 0 1 1 (73H) 1 0 0 0 1 1 0 1 (-73H的补码)

-) 1 (CY) +) 1 1 1 1 1 1 1 1 (-1的补码) 0 1 1 0 0 1 1 1 10 0 1 1 0 0 1 1 1

(a)常规减法 (b)减法变补码相加

结果:(A)=67H,(CY)=0,(AC)=0,(OV)=1。

由上述二式可见两种算法的最终结果是一样的。在此例中,若DBH和73H是两个无符号数,则结果67H是正确的;反之,若为两个带符号数,则由于产生溢出(OV=1),使得结果是错误的,因为负数减正数其结果不可能是正数,OV=1,就指出了这一错误。 3.4.4 加1指令 INC A ;A ←(A)+ 1

INC direct ;direct ←(direct)+ 1 INC Rn ;Rn ←(Rn)+ 1 INC @Ri ;Ri ←((Ri))+ 1

INC DPTR ;DPTR ←(DPTR)+ 1

这组指令的功能是将操作数所指定单元的内容加1。本组指令除“INC A”指令影响P标志外,其余指令均不影响PSW标志。

加1指令常用来修改操作数的地址,以便于使用间接寻址方式。 3.4.5 减1指令 DEC A ;A ←(A)-1

DEC direct ;direct ←(direct)-1 DEC Rn ;Rn ←(Rn)-1 DEC @Ri ;Ri ←((Ri))-1

12