⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yyf_div.asm

📁 这是一个适合51单片机进行多字节除法运算的子程序(32位除24位).程序注释明晰,数据出入口有说明,可直接调用.
💻 ASM
字号:
;这是我自己编过项目中的多字节运算子程序 
;注释写得很详细了,出口入口地址也有标记 


;除法运算子程序 
;支持被除数32位、除数24位,任意位长除法 
;被除数需根据计时和累加组数****预先置入,****调试准确度调整亦调节此值!!!!!!!! 
;17H、18H、19H为除数输入口,32H、33H、34H、35H为运算结果 
;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 
SETDIV: MOV P1,#0FFH 
JNB P1.1,MEAS_F ;当P1.1置1(高)为测速,置0(低)为测频 

MEAS_V: MOV R2,#11111111B ;***测速**** 
MOV R3,#11101000B ;被除数R2-R5,转移至22H-25H进行变位处理 
MOV R4,#00100101B ;**被除数为定值,前端0的个数已知 
MOV R5,#00001011B ;设被除数前端0的个数已知为y,除数前端0的个数计数为x(R0),后部循环次数为(32-y)-(24-x)=(8-y)+x 

JMP STARDIV 

MEAS_F: MOV R2,#00111010B ;***测频**** YANG YF DESIGN 
MOV R3,#01100110B ;被除数R2-R5,转移至22H-25H进行变位处理 
MOV R4,#00111110B ;**被除数为定值,前端0的个数已知 
MOV R5,#10000111B ;设被除数前端0的个数已知为y,除数前端0的个数计数为x(R0),后部循环次数为(32-y)-(24-x)=(8-y)+x 

JMP STARDIV 


STARDIV: MOV 22H,R2 
MOV 23H,R3 
MOV 24H,R4 
MOV 25H,R5 

MOV 17H,16H ;除数17H-19H,载入累加后12H、14H、16H结果 
MOV 18H,14H 
MOV 19H,12H 

MOV 32H,#00H ;结果输出位32H-35H初置0 YANG YF DESIGN 
MOV 33H,#00H 
MOV 34H,#00H 
MOV 35H,#00H 

MOV R0,#00H 
MOV R1,#00H 
MOV 10H,#00H 

CHECKFRONT: CLR C 
MOV A,17H ;检查除数高位是否有空位0 
RLC A 
JNC MOVFRONT 
JMP LOOPCOUNT 

MOVFRONT: INC R0 
CLR C ;除数高位空位为0时前移 
MOV A,19H ;1) 
RLC A 
MOV 19H,A 
MOV A,18H ;2) 
RLC A 
MOV 18H,A 
MOV A,17H ;3) 
RLC A 
MOV 17H,A 
JMP CHECKFRONT 

LOOPCOUNT: MOV A,#09H ; 
ADD A,R0 
MOV 10H,A ;后部循环次数R0 


JUDGSUB: MOV PSW,#00H 
MOV A,R1 
CJNE A,10H,JMP0 
JMP RESULTDIV 

JMP0: MOV A,22H 
MOV C,ACC.7 ;******!!!! 
MOV F0,C 
CLR C ;******!!!! 
SUBB A,17H 
JC CANOTSUB ;溢位 
JNZ JMP1 ;WHEN ACC!=#00H THEN JUMP 
MOV A,23H 
CLR C 
SUBB A,18H 
JC CANOTSUB 
JMP1: JNZ JMP2 ;WHEN ACC!=#00H THEN JUMP 
MOV A,24H 
CLR C 
SUBB A,19H 
JC CANOTSUB 
JMP2: JMP SUBBPART 

CANOTSUB: JNB F0,TURN1 
JB F0,MOVDR 
JMP SUBBPART 

SUBBPART: CLR C 
MOV A,25H 
JNB PSW.1,JMPSP1 
JB ACC.7,JMPSP1 
SETB ACC.7 
MOV A,19H 
INC A 
MOV 19H,A 
JMPSP1: MOV A,24H 
SUBB A,19H 
MOV 24H,A 
MOV A,23H 
SUBB A,18H 
MOV 23H,A 
MOV A,22H 
SUBB A,17H 
MOV 22H,A 

ACALL SETCY_1 
JB B.0,MOVDL ;除数因条件右移后左移恢复 

LJMP JUDGSUB 

MOVDR: SETB B.0 
CLR C ;除数右移一位 
MOV A,17H ;1) 
RRC A 
MOV 17H,A 
MOV A,18H ;2) 
RRC A 
MOV 18H,A 
MOV A,19H ;3) 
RRC A 
MOV 19H,A 
MOV PSW.1,C ;除数末尾移出暂存至F1 
ACALL SETCY_0 
JMP SUBBPART 

MOVDL: MOV C,PSW.1 
MOV A,19H ;1) 
RLC A 
MOV 19H,A 
MOV A,18H ;2) 
RLC A 
MOV 18H,A 
MOV A,17H ;3) 
RLC A 
MOV 17H,A 
CLR B.0 
SETB B.1 
JMP JUDGSUB 

TURN1: CLR C 
MOV A,25H ;1) 
RLC A 
MOV 25H,A 
MOV A,24H ;2) 
RLC A 
MOV 24H,A 
MOV A,23H ;3) 
RLC A 
MOV 23H,A 
MOV A,22H ;4) 
RLC A 
MOV 22H,A 
JB B.1,JMPCALLSC0 
ACALL SETCY_0 
JMPCALLSC0: CLR B.1 
JMP JUDGSUB 


SETCY_0: JB B.2,JMPSE1 ;B.2判断是否置1后第一次置0,是则忽略一次 
INC R1 ;已计算次数计数 
CLR C ;移入一位0 
MOV A,35H 
RLC A 
MOV 35H,A ;输出地址32H-35H 
MOV A,34H 
RLC A 
MOV 34H,A 
MOV A,33H 
RLC A 
MOV 33H,A 
MOV A,32H 
RLC A 
MOV 32H,A 
CLR C 
JMPSE1: CLR B.2 
RET 

SETCY_1: INC R1 ;已计算次数计数 YANG YF DESIGN 
SETB C ;移入一位1 
MOV A,35H 
RLC A 
MOV 35H,A ;输出地址32H-35H 
MOV A,34H 
RLC A 
MOV 34H,A 
MOV A,33H 
RLC A 
MOV 33H,A 
MOV A,32H 
RLC A 
MOV 32H,A 
CLR C 
SETB B.2 
RET 

RESULTDIV: ;不可删 YANG YF DESIGN 

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -