单片机中级教程 第3章 指令系统 联系客服

发布时间 : 星期五 文章单片机中级教程 第3章 指令系统更新完毕开始阅读2dfe006e27d3240c8447ef92

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

3.4.6 乘、除法指令

MCS-51系列单片机有乘除法指令各一条,它们都是一字节指令,执行时需四个机器周期。

1.乘法指令

MUL AB ;BA←(A)×(B)

这条指令的功能是把累加器A和寄存器B中的两个8位无符号数相乘,所得16位乘积的低8位放在A中,高8位放在B中。

乘法指令执行后会影响三个标志:若乘积小于FFH(即B的内容为0),则OV=0,否则OV=1。CY总是被清0,奇偶标志P仍按A中1的奇偶性来确定。

例3-12 已知(A)=80H,(B)=32H, 执行指令 MUL AB

结果:(A)=00H,(B)=19H,OV=1,CY=O,P=0。 2.除法指令

DIV AB ;A←(A)÷(B)之商,B←(A)÷(B)之余数 这条指令的功能是对两个8位无符号数进行除法运算。其中被除数存放在累加器A中,除数存放在寄存器B中。指令执行后,商存于累加器A中,余数存于寄存器B中。

除法指令执行后也影响三个标志:若除数为0(B=0)时,OV=1,表示除法没有意义;若除数不为0,则OV=0,表示除法正常进行。CY总是被清0,奇偶标志P仍按A中1的奇偶性来确定。

例3-13 已知(A)=87H(135D),(B)=0CH(12D), 执行指令 DIV AB 结果:(A)=0BH,(B)=03H,OV=0,CY=O,P=1。

3.4.7 十进制调整指令

DA A

该指令的功能是对A中刚进行的两个BCD码的加法结果进行修正。该指令只影响进位标志CY。

有时我们希望计算机能存储十进制数,也希望计算机能进行十进制数的运算,这时就要用BCD码来表示十进制数。

所谓BCD码就是采用四位二进制编码表示的十进制数。四位二进制数共有十六个编码,BCD码是取它前十个的编码0000~1001来代表十进制数的0~9,这种编码称为8421BCD码,简称BCD码。一个字节可以存放2位BCD码(称为压缩的BCD码)。

如果两个BCD码数相加,结果也是BCD码,则该加法运算称为BCD码加法。在MCS-51系列单片机中没有专门的BCD码加法指令,要进行BCD码加法运算,也要用加法指令ADD或ADDC,然而计算机在执行ADD或ADDC指令进行加法运算时,是按照二进制规则进行的,对于4位二进制数是按逢16进位,而BCD码是逢十进位,二者存在进位差。因此用ADD或ADDC指令进行BCD码相加时,可能会出现错误。例如:

(a) 3+5=8 (b) 6+7=13 (c) 8+9=17

13

0 0 1 1 0 1 1 0 1 0 0 0

+)0 1 0 1 +) 0 1 1 1 +) 1 0 0 1

1 0 0 0 1 1 0 1 1 0 0 0 1

在上述3组运算中,(a) 的运算结果是正确的,因为8的BCD码就是1000;(b)的运算结果是错误的,因为13的BCD码应是00010011,但运算结果却是1011,BCD码中没有这个编码;(c)的运算结果也是错误的,因为17的BCD码应是00010111,而运算结果是00010001。

由此可知,当运算结果>16或在10~16之间时,都将出现错误结果。因此,要对结果进行修正,这就是所谓的十进制调整问题。

使用DA A指令可修正这种错误,它能对运算结果自动进行调整。实际上,计算机在遇到十进制调整指令时,中间结果的修正是由ALU硬件中的十进制调整电路自动进行的。因此,用户不必考虑它是怎样调整的。使用时只需在上述加法指令后面紧跟一条DA A指令即可。

在执行DA A指令之后,若CY=1,则表明相加后的和已等于或大于十进制数100。

例3-14 试编写程序,实现95+59的BCD码加法,并将结果存入30H、31H单元。 MOV A ,#95H ;95的BCD码数送A中 ADD A ,#59H ;A与59的BCD码相加,结果存在A中 DA A ;对相加结果进行十进制调整 MOV 30H ,A ;A中的和(十位、个位的BCD码)存入30H MOV A ,#00H ;A清0 ADDC A ,#00H ;加进位(百位的BCD码) DA A ;BCD码相加之后,必须使用调整指令 MOV 31H ,A ;存进位 第一次执行DA A指令的结果:A=54H,CY=1, 最终结果:(31H)=01H,(30H)=54H。

需要指出的是,DA A指令只能用在加法指令的后面。如果要进行BCD码减法运算,也应该进行调整,但在MCS-51系列单片机中没有十进制减法调整指令,也不象有的微处理器有加减标志,因此要用适当的方法来进行十进制减法运算。

为了进行十进制减法运算,可用加减数的补数来进行。两位十进制数是对100取补的,例如:减法60-30=30,也可以改为补数相加:

60+(100-30)=130

丢掉进位后,就得到正确的结果。 在实际运算时,不可能用9位二进制数来表示十进制数100,因为CPU是8位的。为此,可用8位二进制数10011010(9AH)来代替。因为这个二进制数经过十进制调整后就是100000000。因此,十进制无符号数的减法运算可按以下步骤进行:

1)求减数的补数,即9AH-减数; 2)被减数与减数的补数相加;

3)对第二步的和进行十进制调整,就得到所求的十进制减法运算结果。 这里用“补数”而没有用“补码”,这是为了和带有符号位的补码相区别。由于现在操作数都是正数,没有必要再加符号位,故称“补数”更为合适一些。

14

例3-15 编写程序实现十进制减法,计算87-38。

CLR C ;减法之前,先清CY位,即CY=0 MOV A ,#9AH ;9AH送A中 SUBB A , #38H ;做减法,计算38的补数送A中 ADD A ,#87H ;38的补数与87做加法, DA A ;对相加结果进行调整。

分析: 减数求补数 与被减数相加 十进制调整

1 0 0 1 1 0 1 0 (9AH) 0 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 -)0 0 1 1 1 0 0 0 (38H) +) 1 0 0 0 0 1 1 1 +) 0 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 → 1 1 1 0 1 0 0 1 →1 0 1 0 0 1 0 0 1 丢掉进位,取调整结果的低8位,即得结果为十进制数49,显然是正确的结果。

3.5 逻辑运算及移位类指令

逻辑运算的特点是按位进行。逻辑运算包括与、或、异或三类,每类都有六条指令。此外还有移位指令以及对累加器A清零和求反指令,逻辑运算及移位类指令共有24条。 3.5.1 逻辑与运算指令

ANL A ,#data ;A ←(A)∧data ANL A ,direct ;A ←(A)∧(direct) ANL A ,Rn ;A ←(A)∧(Rn) ANL A ,@Ri ;A ←(A)∧((Ri)) ANL direct ,A ;direct ←(direct)∧(A) ANL direct ,#data ;direct ←(direct)∧data

这组指令中前四条指令是将累加器A 的内容和源操作数所指出的内容按位相与,结果存放在A 中。后两条指令是将直接地址单元中的内容和源操作数所指出的内容按位相与,结果存入直接地址所指定的单元中。

逻辑与运算指令常用于将某些位屏蔽(即使之为0)。

方法是:将要屏蔽的位和“0”相与,要保留的位同“1”相与。 3.5.2 逻辑或运算指令

ORL A ,#data ;A ←(A)∨data ORL A ,direct ;A ←(A) ∨(direct) ORL A ,Rn ;A ←(A) ∨(Rn) ORL A ,@Ri ;A ←(A) ∨((Ri))

ORL direct ,A ;direct ←(direct) ∨(A) ORL direct ,#data ;direct ←(direct) ∨data

这组指令中前四条指令是将累加器A 的内容与源操作数所指出的内容按位相或,结果存放在A 中。后两条指令是将直接地址单元中的内容与源操作数所指出的内容按位相或,结果存入直接地址所指定的单元中。

逻辑或运算指令常用于将某些位置位(即使之为1)。

方法是:将要置位的位和“1”相或,要保留的位同“0”相或。

15

例3-16 将累加器A的低4位送到P1口的低4位输出,而P1的高4位保持不变。 解:这种操作不能简单地用MOV指令实现,而可以借助与、或逻辑运算。程序如下: ANL A ,#0FH ;屏蔽A 的高4位,保留低4位 ANL P1 ,#0F0H ;屏蔽P1的低4位,保留高4位 ORL P1 ,A ;通过或运算,完成所需操作 3.5.3 逻辑异或运算指令

XRL A ,#data ;A ←(A)?data XRL A ,direct ;A ←(A) ?( direct) XRL A ,Rn ;A ←(A) ?(Rn) XRL A ,@Ri ;A ←(A) ?((Ri)) XRL direct ,A ;direct ←(direct) ?(A)

XRL direct ,#data ;direct ←(direct) ?data

这组指令中前四条指令是将累加器A的内容和源操作数所指出的内容按位异或运算,结果存放在A中。后两条指令是将直接地址单元中的内容和源操作数所指出的内容按位异或运算,结果存入直接地址所指定的单元中。

逻辑异或运算指令常用于将某些位取反。

方法是:将需求反的位同“1”相异或,要保留的位同“0”相异或。 例3-17 试编程,使内部RAM 30H单元中的低2位清0,高2位置1,其余4位取反。 解: ANL 30H ,#0FCH ;30H单元中低2位清0 ORL 30H ,#0C0H ;30H单元中高2位置1 XRL 30H ,#3CH ;30H单元中中间4位变反 3.5.4.累加器清零、取反指令

累加器清零指令1条:

CLR A ;A ←0

累加器按位取反指令1条:

CPL A ;A ←(A)

清零和取反指令只有累加器A才有,它们都是一字节指令,如果用其他方式来达到清零或取反的目的,则都为二字节的指令。

MCS-51系列单片机只有对A的取反指令,没有求补指令。若要进行求补操作,可按“求反加1”来进行。

以上所有的逻辑运算指令,对CY、AC和OV标志都没有影响,只在涉及到累加器A时,才会影响奇偶标志P。

3.5.5 循环移位指令

MCS-51系列单片机的移位指令只能对累加器A进行移位,共有循环左移、循环右移、带进位的循环左移和右移四种。

循环左移 RL A ;A i+1←A i ,A 0 ←A 7 循环右移 RR A ;A i ←A i+1,A 7 ←A 0 带进位循环左移 RLC A ;A 0←CY,A i+1 ←A i,CY←A 7 带进位循环右移 RRC A ;A 7←CY,A i←A i+1,CY←A 0

16