表 3-3 算术运算指令
操作码 |
目标操作数 |
参与运算的操作数 |
说 明 |
Cy |
AC |
OV |
P |
ADD | A | Rn; direct; @Ri; # data |
不带进位加 |
Ö |
Ö |
Ö |
Ö |
ADDC |
A |
Rn; direct; @Ri; # data |
带进位加 |
||||
SUBB |
A |
Rn; direct; @Ri; # data |
带借位减 |
||||
MUL |
AB |
(A)*(B) |
积在(B)(A) |
0 |
- |
Ö |
Ö |
DIV |
AB |
(A)/(B) |
商 (A) ,余数 (B) |
||||
DA |
A |
只对加法作十进制修正 |
Ö |
- |
- |
Ö |
|
INC |
A; Rn; direct; @Ri; DPTR |
加一 |
- |
- |
- |
Ö |
|
DEC |
A; Rn; direct; @Ri (无DPTR) |
减一 |
*“Ö”表示标志位根据运算结果取值,“-”表示对标志位无影响。
1. 算术运算指令的一般性说明
ê 除加1/减1指令外,一般以累加器Acc为目标,且影响标志位。
ê 没有不带借位减指令。用SUBB作不带借位减运算,Cy应先清零。
ê 乘法若 积 > 255 , 则OV = 1 ; 除法若 除数 = 0 , 则OV = 1 。
ê DA A 指令只对ADD 或ADDC作十进制修正。
ê 无 DEC DPTR指令。
2. 加/减算术运算指令指令应用例
ê 将内部RAM中从30H开始存放的10个双字节无符号整数相加,其和送(R5 R4 R3),低字节在R3。
MOV R0,#30H
MOV R2,#10
MOV R3,#0
MOV R4,#0
MOV R5,#0
LOOP:MOV A,@R0
ADD A, R3
MOV R3,A
INC R0
MOV A,@R0
ADDC A,R4
MOV R4,A
INC R0
MOV A,#0
ADDC A,R5
MOV R5,A
DJNZ R2,LOOP
ê 将内部RAM中从30H开始存放的10个4位十进制正整数(压缩BCD码)相加,其和送(R5 R4 R3),低字节在R3。
ê 比较A与B中的无符号数,大数存B。
MOV R2,A
CLR C ;确保C = 0
SUBB A,B
JC DONE ;若有借位,A<B,转DONE 结束。
MOV B,R2 ;没有借位,A>B,将大数存B。
DONE: ¼¼
3. 乘/除算术运算指令指令应用例
ê 双字节数乘单字节数:双字节数在(R3R4),单字节数在(R2),积送(R3R4R5)
MOV A,R2 ;
MOV B,R4 ;
MUL AB ; (R4)´(R2)
MOV R5,A ;
MOV R4,B ;
MOV A,R2 ;
MOV B,R3 ;
MUL AB ; (R3)´(R2)
ADD A,R4 ;
MOV A,#0 ;
ADDC A,B ;
MOV R3,A ;
ê 单字节二进制数转十进制(BCD)数:二进制数在A,十进制数存入(R2R3)
MOV B,#10
DIV AB ; 除十, 余个位
MOV R3,B ; 个位存R3
MOV B,#10
DIV AB ; 再除十, 余十位
MOV R2,A ; 商为百位,存R2
MOV A,B
SWAP A ;
ADD A,R3 ; 十位与个位合并
MOV R3,A;
这些算术运算指令你应该了解了吧