📄 8位1024到2000映射.txt
字号:
;////////////////////////////////////////////////////////////////
;功能:实现2个16位数的乘法,结果仍然位16位数
;运算结果放到 R6(高), R7(低) 中
;基本思想:将除法转换为乘法和右移运算
;例如:将0~1024,映射到0~2000。
;首先,2000/1024 = 1.953125。即:1024*(1 + 9531*10000次方) 10000大约等于2的13次方JIEGUO_YOUYI EQU #0DH
;JIEGUO:最终结果 YUANSHU:需要转换的数 SHANG:上式整数部分 YUSHU:上式小数部分 JIEGUO_YOUYI:参考上式
;JIEGUO == YUANSHU * SHANG + (YUANSHU * YUSHU) >> JIEGUO_YOUYI
;/////////////////////////////////////////////////////////////////
;预先设定部分
YUANSHU_LOW EQU #FFH
YUANSHU_HIGH EQU #03H
SHANG EQU #03H
YUSHU_LOW EQU #3BH
YUSHU_HIGH EQU #25H
JIEGUO_YOUYI EQU #0DH
;功能:实现JIEGUO == YUANSHU * SHANG + (YUANSHU * YUSHU) >> JIEGUO_YOUYI 结果放R2R3
;入口参数:参见开始说明
CONVERT:
MOV R2, YUANSHU_LOW ;计算 (YUANSHU * YUSHU)
MOV R3, YUANSHU_HIGH
MOV R4, YUSHU_LOW
MOV R5, YUSHU_HIGH
LCALL MUL_16b
MOV R7, JIEGUO_YOUYI ;计算(YUANSHU * YUSHU) >> JIEGUO_YOUYI
LCALL LRRC_16b
PUSH R2
PUSH R3
MOV R2, YUANSHU_LOW ;计算 (YUANSHU * SHANG)
MOV R3, YUANSHU_HIGH
MOV R4, SHANG
MOV R5, #00H
LCALL MUL_16b
POP R5 ;计算 YUANSHU * SHANG + (YUANSHU * YUSHU) >> JIEGUO_YOUYI
POP R4
LCALL ADD_16b
RET
;功能: (R2R3) * (R4R5) R2R4放低8位,R3R5放高8位, 结果放R2R3R4R5(从低到高)
;入口参数:R2 R3 R4 R5
MUL_16b:
MOV A, R2
MOV B, R4
MUL AB
PUSH A ;低8位入栈保存,最终结果的低8位
MOV R6, B ; 高八位存R6
MOV A, R4
MOV B, R3
MUL AB ;R3 * R4
ADD A, R6
MOV R6, A
MOV R7, B
MOV A, R5
MOV B, R2
MUL AB ;R5 * R2
ADDC A, R6
POP R2 ;R2存低八位
MOV R3, A ;R2R3放低16位
MOV A, R7
ADDC A, B ;16~24位,防止8~16进位
MOV R7, A ;缓存A
MOV A, R3
MOV B, R5
MUL AB
ADDC A, R7
MOV R4, A ;16~24位存R4
MOV A, B
ADDC A, #00H ;防止16~24进位
MOV R5, A ;存24~32位
RET
;功能: (R2R3) + (R4R5) 结果放R2R3 R2R4放低8位,R3R5放高8位
;入口参数:R2 R3 R4 R5
ADD_16b:
MOV A, R2
ADD A, R4
MOV R2, A
MOV A, R3
ADDC A, R5 ;要加上低八位的进位
MOV R3, A
RET
;功能: (R2R3R4R5)>>R7 结果放R2R3 R2放低8位,R3放高8位
;入口参数:R2 R3 R4 R5 R7
LRRC_32b:
MOV R6, R4 ;此处R4肯定大于0,因为小数部分肯定不止一位
LOOP:
CLR C ;进位位清0
RRC R5 ;R2低位放C
RRC R4 ;R3的高位放C
RRC R3
RRC R2
DJNZ R6, LOOP
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -