MCS51算术运算程序
2009-01-16
MCS51算术运算程序
双字节取补程序 /(R3R4)=(R3R4)
;入口 :R3,R4
;占用资源:ACC
;堆栈需求:2字节
;出口 :R3,R4
CMPT :MOV A,R4
CPL A
ADD A,#01H
MOV R4,A
MOV A,R3
CPL A
ADDC A,#00H
MOV R3,A
RET
;N节取补程序 /([R0])=([R0])
;入口 :R0,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R0
NCMPTN :MOV B,R0
SETB C
NCPT1 :MOV A,@R0
CPL A
ADDC A,#00H
MOV @R0,A
INC R0
DJNZ R7,NCPT1
MOV R0,B
RET
;双字节无符号数加法程序 (R3R4+R6R7)=(R3R4)
;入口 :R3,R4,R6,R7
;占用资源:ACC
;堆栈需求:2字节
;出口 :R3,R4,CF
NADD :MOV A,R4
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
RET
;N字节无符号数加法程序 ([R0]+[R1])=([R0])
;入口 :R0,R1,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R0,CF
NADDN :MOV B,R0
CLR C
NADN1 :MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NADN1
MOV R0,B
RET
;双字节无符号数减法程序 (R3R4-R6R7)=(R3R4)
;入口 :R3,R4,R6,R7
;占用资源:ACC
;堆栈需求:2字节
;出口 :R3,R4
NSUB :MOV A,R4
CLR C
SUBB A,R7
MOV R4,A
MOV A,R3
SUBB A,R6
MOV R3,A
RET
;N字节无符号数减法程序 ([R0]-[R1])=([R0])
;入口 :R0,R1,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R0,CF
NSUBN :MOV B,R0
MOV R7,N
CLR C
NSUBN1 :MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NSUBN1
MOV R0,B
RET
;单字节无符号数乘法程序 (R3R4*R7)=(R2R3R4)
;入口 :R3,R4,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R2,R3,R4
NMUL21 :MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
CLR OV
RET
;单字节无符号数乘法程序 (R2R3R4*R7)=(R5R2R3R4)
;入口 :R2,R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R5,R2,R3,R4
NMUL31 :MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
XCH A,R2
MOV B,R7
MUL AB
ADD A,R2
MOV R2,A
CLR A
ADDC A,B
MOV R5,A
CLR OV
RET
;单字节无符号数乘法程序 (R5R2R3R4*R7)=(R7R5R2R3R4)
;入口 :R5,R2,R3,R4,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R7,R5,R2,R3,R4
NMUL41 :MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
XCH A,R2
MOV B,R7
MUL AB
ADD A,R2
MOV R2,A
CLR A
ADDC A,B
XCH A,R5
MOV B,R7
MUL AB
ADD A,R5
MOV R5,A
CLR A
ADDC A,B
MOV R7,A
CLR OV
RET
;双字节无符号数乘法程序 (R3R4*R6R7)=(R5R2R3R4)
;入口 :R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R5,R2,R3,R4
NMUL22 :MOV A,R4
MOV B,R7
MUL AB
XCH A,R4
MOV R5,B
MOV B,R6
MUL AB
ADD A,R5
MOV R5,A
CLR A
ADDC A,B
MOV R2,A
MOV A,R3
MOV B,R7
MUL AB
ADD A,R5
MOV R5,A
MOV A,B
ADDC A,R2
MOV R2,A
CLR A
ADDC A,#00H
XCH A,R3
MOV B,R6
MUL AB
ADD A,R2
MOV R2,A
MOV A,B
ADDC A,R3
XCH A,R5
MOV R3,A
CLR OV
RET
;双字节无符号数乘法程序 (R2R3R4*R6R7)=(R1R5R2R3R4)
;入口 :R2,R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R1,R5,R2,R3,R4
NMUL32 :MOV A,R4
MOV B,R7
MUL AB
XCH A,R4
MOV R5,B
MOV B,R6
MUL AB
ADD A,R5
MOV R5,A
CLR A
ADDC A,B
MOV R1,A
MOV A,R3
MOV B,R7
MUL AB
ADD A,R5
MOV R5,A
MOV A,B
ADDC A,R1
MOV R1,A
CLR A
ADDC A,#00H
XCH A,R3
MOV B,R6
MUL AB
ADD A,R1
MOV R1,A
MOV A,B
ADDC A,R3
XCH A,R5
MOV R3,A
MOV A,R2
MOV B,R7
MUL AB
ADD A,R1
MOV R1,A
MOV A,B
ADDC A,R5
MOV R5,A
CLR A
ADDC A,#00H
XCH A,R2
MOV B,R6
MUL AB
ADD A,R5
MOV R5,A
MOV A,B
ADDC A,R2
XCH A,R1
MOV R2,A
CLR OV
RET
;N字节无符号数乘法程序 ([R0]*[R1])=([R0])
;入口 :R0,R1,M,N
;占用资源:ACC,B,R2,R5,R6,R7,NCNT
;堆栈需求:2字节
;出口 :R0
NMULMN :MOV A,M
ADD A,R0
MOV R5,A
XCH A,R1
XCH A,R5
ADD A,N
XCH A,R0
MOV R6,A
MOV B,M
MOV NCNT,B
NMLMN1 :DEC R0
DEC R1
CLR A
XCH A,@R1
MOV @R0,A
DJNZ NCNT,NMLMN1
MOV NCNT,B
NMLMN2 :CLR A
XCH A,@R0
MOV R2,A
MOV A,R6
MOV R0,A
MOV A,R5
MOV R1,A
MOV R7,N
CLR C
NMLMN3 :MOV A,R2
MOV B,@R1
INC R1
MUL AB
ADDC A,@R0
MOV @R0,A
INC R0
MOV A,B
ADDC A,@R0
MOV @R0,A
DJNZ R7,NMLMN3
INC R0
INC R6
DJNZ NCNT,NMLMN2
MOV A,R0
CLR C
SUBB A,M
SUBB A,N
MOV R0,A
RET
;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7
;入口 :R2,R3,R4,R7
;占用资源:ACC,B,F0
;堆栈需求:3字节
;出口 :(R2),R3,R4,R7,OV
NDIV31 :MOV A,R2
MOV B,R7
DIV AB
PUSH A
MOV R2,B
MOV B,#10H
NDV311 :CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 :MOV R2,A
INC R4
NDV313 :DJNZ B,NDV311
POP A
CLR OV
JZ NDV314
SETB OV
NDV314 :XCH A,R2
MOV R7,A
RET
;单字节无符号除法程序 (R5R2R3R4/R7)=(R5)R2R3R4 余数R7
;入口 :R2,R3,R4,R7
;占用资源:ACC,B,F0
;堆栈需求:3字节
;出口 :(R5),R2,R3,R4,R7,OV
NDIV41 :MOV A,R5
MOV B,R7
DIV AB
PUSH A
MOV R5,B
MOV B,#18H
NDV411 :CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV412
JC NDV413
NDV412 :MOV R5,A
INC R4
NDV413 :DJNZ B,NDV411
POP A
CLR OV
JZ NDV414
SETB OV
NDV414 :XCH A,R5
MOV R7,A
RET
;双字节无符号除法程序 (R5R2R3R4/R6R7)=(R2)R3R4 余数R6R7
;入口 :R5,R2,R3,R4,R6,R7
;占用资源:ACC,B,F0
;堆栈需求:4字节
;出口 :(R2),R3,R4,R6,R7,OV
NDIV42 :MOV A,R1
PUSH A
MOV B,#00H
NDV421 :MOV A,R2
CLR C
SUBB A,R7
MOV R1,A
MOV A,R5
SUBB A,R6
JC NDV422
MOV R5,A
MOV A,R1
MOV R2,A
INC B
SJMP NDV421
NDV422 :PUSH B
MOV B,#10H
NDV423 :CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
XCH A,R5
RLC A
XCH A,R5
MOV F0,C
CLR C
SUBB A,R7
MOV R1,A
MOV A,R5
SUBB A,R6
JB F0,NCV424
JC NDV425
NCV424 :MOV R5,A
MOV A,R1
MOV R2,A
INC R4
NDV425 :DJNZ B,NDV423
POP A
CLR OV
JNZ NDV426
SETB OV
NDV426 :XCH A,R2
MOV R7,A
MOV A,R5
MOV R6,A
POP A
MOV R1,A
RET
;N字节无符号除法程序(组合) ([R0]/[R1])=([R0])
;入口 :R0,R1,M,N
;占用资源:ACC,R2,R3,R4,R5,R7,NCNT,F0,NADDN,NSUBBN,NRLCN
;堆栈需求:4字节
;出口 :R0
;NDIVMN :MOV A,M
CLR C
SUBB A,N
MOV NCNT,A
ADD A,R0
MOV R4,A
XCH A,R0
MOV R3,A
MOV A,R1
MOV R5,A
MOV R2,#00H
NDVMN1 :MOV R7,N
LCALL NSUBN
MOV A,R5
MOV R1,A
JC NDVMN2
INC R2
SJMP NDVMN1
NDVMN2 :MOV R7,N
LCALL NADDN
MOV A,NCNT
SWAP A
RR A
MOV NCNT,A
NDVMN3 :MOV A,R3
MOV R0,A
MOV R7,M
LCALL NRLCN
MOV F0,C
MOV A,R4
MOV R0,A
MOV A,R5
MOV R1,A
MOV R7,N
LCALL NSUBN
JB F0,NDVMN4
JC NDVMN5
NDVMN4 :MOV A,R3
MOV R0,A
INC @R0
SJMP NDVMN6
NDVMN5 :MOV A,R5
MOV R1,A
MOV R7,N
LCALL NADDN
NDVMN6 :DJNZ NCNT,NDVMN3
MOV A,R4
MOV R1,A
MOV A,R2
MOV @R1,A
MOV A,R3
MOV R0,A
RET
;N字节无符号除法程序(集成) ([R0]/R[1])=([R0])
;入口 :R0,R1,M,N
;占用资源:ACC,R2,R3,R4,R5,R7,F0
;堆栈需求:2字节
;出口 :R0
NDIVMN :MOV A,M
CLR C
SUBB A,N
MOV B,A
ADD A,R0
MOV R4,A
XCH A,R0
MOV R3,A
MOV A,R1
MOV R5,A
MOV R2,#00H
NDVMN1 :MOV R7,N
CLR C
NDVMN2 :MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NDVMN2
MOV A,R4
MOV R0,A
MOV A,R5
MOV R1,A
JC NDVMN3
INC R2
SJMP NDVMN1
NDVMN3 :MOV R7,N
CLR C
NDVMN4 :MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NDVMN4
MOV A,#08H
MUL AB
MOV B,A
NDVMN5 :MOV A,R3
MOV R0,A
MOV R7,M
CLR C
NDVMN6 :MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R7,NDVMN6
MOV F0,C
MOV A,R4
MOV R0,A
MOV A,R5
MOV R1,A
MOV R7,N
CLR C
NDVMN7 :MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NDVMN7
JB F0,NDVMNB
JC NDVMN8
NDVMNB :MOV A,R3
MOV R0,A
INC @R0
SJMP NDVMNA
NDVMN8 :MOV R7,N
MOV A,R4
MOV R0,A
MOV A,R5
MOV R1,A
CLR C
NDVMN9 :MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,NDVMN9
NDVMNA :DJNZ B,NDVMN5
MOV A,M
CLR C
SUBB A,N
ADD A,R3
MOV R1,A
MOV A,R2
MOV @R1,A
MOV A,R3
MOV R0,A
RET
;N字节数据左移程序 RLC([R0])=(CF[R0])
;入口 :R0,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口 :R0,CF
NRLCN :MOV B,R0
CLR C
NRLN1 :MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R7,NRLN1
MOV R0,B
RET
;原码有符号双字节减法程序 (R3R4-R6R7)=R3R4
;入口 :R3,R4,R6,R7
;占用资源:ACC,DADD
;堆栈需求:6字节
;出口 :R3,R4,OV
DSUB :MOV A,R6
CPL ACC.7
MOV R6,A
LCALL DADD
RET
;原码有符号双字节加法程序 (R3R4+R6R7)=R3R4
;入口 :R3,R4,R6,R7
;占用资源:ACC,SR0,NADD,NSUB,CMPT
;堆栈需求:4字节
;出口 :R3,R4,OV
DADD :MOV A,R3
MOV C,ACC.7
MOV SR0,C
XRL A,R6
MOV C,ACC.7
MOV A,R3
CLR ACC.7
MOV R3,A
MOV A,R6
CLR ACC.7
MOV R6,A
JC DAB2
LCALL NADD
MOV A,R3
JB ACC.7,DABE
DAB1 :MOV C,SR0
MOV ACC.7,C
MOV R3,A
CLR OV
RET
DABE :SETB OV
RET
DAB2 :LCALL NSUB
MOV A,R3
JNB ACC.7,DAB1
LCALL CMPT
CPL SR0
SJMP DAB1
;原码有符号双字节乘法程序 (R3R4*R6R7)=(R5R2R3R4)
;入口 :R3,R4,R6,R7
;占用资源:ACC,SR0,NMUL22
;堆栈需求:4字节
;出口 :R5,R2,R3,R4
IMUL :MOV A,R3
XRL A,R6
MOV C,ACC.7
MOV SR0,C
MOV A,R3
CLR ACC.7
MOV R3,A
MOV A,R6
CLR ACC.7
MOV R6,A
LCALL NMUL22
MOV A,R5
MOV C,SR0
MOV ACC.7,C
MOV R5,A
RET
;原码有符号双字节除法程序 (R5R2R3R4/R6R7)=(R3R4) 余数(R6R7)
;入口 :R5,R2,R3,R4
;占用资源:ACC,SR0,NDIV42
;堆栈需求:6字节
;出口 :R3,R4,R6,R7,OV
IDIV :MOV A,R5
XRL A,R6
MOV C,ACC.7
MOV SR0,C
MOV A,R5
CLR ACC.7
MOV R5,A
MOV A,R6
CLR ACC.7
MOV R6,A
LCALL NDIV42
MOV A,R3
JB ACC.7,IDIVE
JB OV,IDIVE
MOV C,SR0
MOV ACC.7,C
MOV R3,A
RET
IDIVE :SETB OV
RET