你说的实现32位加减法指的是双字节的运算吧.
;双字节减法子程序
;参数:R6R5,R4R3
;返回:R2R3
DSUB: MOV A,R5
CLR C
SUBB A,R3
MOV R3,A
MOV A,R6
SUBB A,R4
MOV R2,A
RET
;双字节加法子程序
;参数:R6R5,R4R3
;返回:R2R3
LADD: MOV A,R5
ADD A,R3
MOV R5,A
MOV A,R6
ADDC A,R4
MOV R6,A
MOV A,R5
MOV R3,A
MOV A,R6
MOV R2,A
RET
;双字节乘法子程序
;参数:R6R5,R4R3
;返回:R2R1R4R3
DMUL: MOV A,R5;
MOV B,R3
MUL AB;R5*R3
XCH A,R3;低位→R7,R7→A准备乘数
MOV R1,B;高位暂存R1
MOV B,R6
MUL AB;R6*R3
ADD A,R1;乘积低位加上一乘积高位暂存R4
MOV R4,A
CLR A;清A
ADDC A,B;高位加低位来的进位存R5
MOV R1,A
MOV A,R4
MOV B,R5
MUL AB;R5*R4
ADD A,R1;第三次乘积低位加R5暂存R6
XCH A,R4
XCH A,B
ADDC A,R1;第三次乘积高位加R5存R5
MOV R1,A
MOV FO,C;保存进位位
MOV A,R6
MUL AB;R6*R4
ADD A,R1;第四次乘积低位加R5存R5
MOV R1,A
CLR A
MOV ACC.0,C
MOV C,FO
ADDC A,B;第四次乘积高位加低位来的进位后存于R4
MOV R2,A
RET
;双字节除法程序
;参数:R2R1R4R3,R6R5
;返回:R4R3(商),R2R1(余数)
DDIV: MOV A,R1
CLR C
SUBB A,R5
MOV A,R2
SUBB A,R6
JNC DIV1;被除数高位字节大于除数,转溢出处理
MOV B,DIV1;无溢出执行除法,置循环次数
MOV B,#16;被除数向左移一位,低位送零
DDIV2: CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R1
RLC A
MOV R1,A
XCH A,R2
RLC A
XCH A,R2
MOV FO,C;保护移出的最高位
CLR C
SUBB A,R5;高位移出位为1,够减转DV2
MOV A,R2
SUBB A,R6
JB FO,DV2
JC DV3
DV2: MOV R2,A;回送减法结果
MOV A,R0
MOV R1,A
INC R7;商上一
DV3: DJNZ B,DV2;不够减,循环次数-1
CLR FO;正常执行无溢出,FO=0
RET
DIV1: SETB FO;置溢出标志
RET