MDU32C 定型流片了吗?
模拟小数乘法程序(浮点乘除用):// 模拟小数乘法
MOV A,R7
PUSH ACC
MOV A,R6
PUSH ACC
MOV A,R3
PUSH ACC
MOV A,R2
PUSH ACC
MOV A,R5
PUSH ACC
MOV A,R4
PUSH ACC
MOV A,R1
PUSH ACC
MOV A,R0
PUSH ACC
CLR A
MOV R0,A
MOV R1,A
MOV R4,A
MOV R5,A
// LCALL MUL32 // R2R3 * R6R7 --> R4R5R6R7
// LCALL ADD32 // R4R5 --> DPH1,DPL1
MOV R0,SP
MOV A,@R0
MOV R2,A
DEC R0
MOV A,@R0
MOV R3,A
DEC R0
DEC R0
DEC R0
DEC R0
MOV A,@R0
MOV R6,A
DEC R0
MOV A,@R0
MOV R7,A
CLR A
MOV R0,A
MOV R1,A
MOV R4,A
MOV R5,A
// LCALL MUL32 // R0R1 * R6R7 --> R4R5R6R7
// LCALL ADD32 // R4R5R6R7 + DPH1,DPL1 --> DPH,B,DPH1,DPL1
DEC R0
DEC R0
MOV A,@R0
MOV R2,A
DEC R0
MOV A,@R0
MOV R3,A
DEC R0
MOV A,@R0
MOV R6,A
DEC R0
MOV A,@R0
MOV R7,A
CLR A
MOV R0,A
MOV R1,A
MOV R4,A
MOV R5,A
// LCALL MUL32 // R2R3 * R4R5 --> R4R5R6R7
// LCALL ADD32 // R4R5R6R7 + DPH,B,DPH1,DPL1 --> DPH1,DPL1
POP ACC
MOV R2,A
POP ACC
MOV R3,A
POP ACC
MOV R6,A
POP ACC
MOV R7,A
MOV A,SP
ADD A,#-4
MOV SP,A
CLR A
MOV R0,A
MOV R1,A
MOV R4,A
MOV R5,A
// LCALL MUL32 // R0R1 * R4R5 --> R4R5R6R7
// LCALL ADD32 // R4R5R6R7 + DPH1,DPL1 --> R4R5R6R7
MDU32C
STC8H2K32U-45I-LQFP32 已微信小商城上架销售
本坛网友,全部【免费+包邮 送】
深圳国芯人工智能有限公司-产品_STC8G系列 (stcai.com)
其中 数次 16位 * 16位 = 32位 相乘, 再叠加 --> 寄存器 暂存,程序片段 还没加入.
程序超长, 效率低下, 分析原因:
1. 模拟小数运算, 只能用 整数 16位 * 16位 = 32位 相乘(取高 16位)
2. 32位 运算占用 整个 R0-R7寄存器, 重入函数的临时变量, 只能放在 SP堆栈中, 51不支持堆栈变量, 故执行效率低.
3. 如有可能, 请考虑增加一条 小数 32位 * 32位 = 32位 乘法指令, 代替以上一大堆 模拟小数运算程序.
4. 算术左移右移, 最末移出位, 如有可能, 请放在 Cy中, 便于级联, 四舍五入等操作. STC8H2K32U-45MHz-LQFP32 + MDU32C 已启动流片流程,不想改了
否则又要等 2个月
以后有机会改吧,搞个 增强型 MDU32C+版本. 优化了一下 模拟小数乘法, 感觉还行, 可重入函数, 占用 4级堆栈, 到时 样片到手, 测试对比一下与标准浮点库的速度之比.
// 模拟小数乘法 R0R1R2R3 * R4R5R6R7 --> R4R5R6R7
/* R2R3 * R6R7 --> R4R5R6R7 , R4R5 --> DPH1,DPL1
R2R3 * R4R5 --> R4R5R6R7_0_0 , R4R5R6R7 + DPH1,DPL1 --> DPH,B,DPH1,DPL1
R0R1 * R6R7 --> R4R5R6R7_0_0 , R4R5R6R7 + DPH,B,DPH1,DPL1 --> DPH1,DPL1
R0R1 * R4R5 --> R4R5R6R7_0_0_0_0 , R4R5R6R7 + DPH1,DPL1 --> R4R5R6R7
R4R5R6R7 规格化 --> R5R6R7,DPL1 , 指数DPL --> R4
*/
MOV B,R1
MOV DPH,R0
MOV A,R7
PUSH ACC
MOV A,R6
PUSH ACC
MOV A,R5
PUSH ACC
MOV A,R4
PUSH ACC
CLR A
MOV R0,A
MOV R1,A
MOV R4,A
MOV R5,A
// LCALL MUL32 // R2R3 * R6R7 --> R4R5R6R7
MOV DPH1,R4 // R4R5 --> DPH1,DPL1
MOV DPL1,R5
MOV R0,SP
MOV A,@R0
MOV R6,A
DEC R0
MOV A,@R0
MOV R7,A
CLR A
MOV R0,A
; MOV R1,A
MOV R4,A
MOV R5,A
// LCALL MUL32 // R2R3 * R4R5 --> R4R5R6R7
MOV R2,DPH1 // DPH1,DPL1 --> R0R1R2R3
MOV R3,DPL1
// LCALL ADD32 // R4R5R6R7 + DPH1,DPL1 --> DPH,B,DPH1,DPL1
MOV R2,DPH
MOV R3,B
MOV DPH,R4
MOV B,R5
MOV DPH1,R6
MOV DPL1,R7
MOV R0,SP
DEC R0
DEC R0
MOV A,@R0
MOV R6,A
DEC R0
MOV A,@R0
MOV R7,A
CLR A
MOV R0,A
; MOV R1,A
MOV R4,A
MOV R5,A
// LCALL MUL32 // R0R1 * R6R7 --> R4R5R6R7
MOV R0,DPH
MOV R1,B
XCH R2,DPH1 // 原 R2R3 --> DPH1,DPL1
XCH R3,DPL1
// LCALL ADD32 // R4R5R6R7 + DPH,B,DPH1,DPL1 --> DPH1,DPL1
XCH R6,DPH1 // DPH1,DPL1 --> R6R7(原R2R3)
XCH R7,DPL1
POP ACC
MOV R2,A
POP ACC
MOV R3,A
POP ACC
POP ACC
// LCALL MUL32 // R0R1 * R4R5 --> R4R5R6R7
// LCALL ADD32 // R4R5R6R7 + DPH1,DPL1 --> R4R5R6R7
// LCALL RSLA32 // R4R5R6R7 规格化 --> R5R6R7,DPL1 , 指数DPL --> R4
MOV C,F0 // 标准浮点数返回, 加入符号
MOV A,DPL
RRC A
XCH A,R4
MOV ACC.7,C
XCH A,R5
XCH A,R6
XCH A,R7
MOV DPL,A
RET
猜测,老许要的, 就是一個
32bX32b=64b的完整乘法器, 如果沒有这种乘法器,
他就必须拆解成 4 个 16bX16b=32b 的乘法,
要命的是还要到处找地方暂存结果、并且做移位累加。
我们目前MDU32C的乘法器功能是 32bX32b=32b, 结果"高"的ˇ32b 被丢弃了 !
料想, 应该也不合其使用。
事实上, 在 MDU32C 中,
我们原本有做完整的, 只因为要配合 Keil-C51 ,
所以我们把它又拿掉了 !
神农鼎 发表于 2024-1-26 12:10
猜测,老许要的, 就是一個
32bX32b=64b的完整乘法器, 如果沒有这种乘法器,
他就必须拆解成 4 個 16bX16b=3 ...
当时也提过, 32bX32b=64b, 结果"高"的ˇ32b 不能丢弃, 小数乘法(浮点数)要用 !!! 要放到 【R0/R1/R2/R3】, 但 KEIL C51 经常会优化这优化那,可能会冲突;
只能再增加条指令 放【R0/R1/R2/R3】 神农鼎 发表于 2024-1-26 12:13
事实上, 在 MDU32C 中,
我们原本有做完整的, 只因为要配合 Keil-C51 ,
所以我们把它又拿掉了 !
要配合 C51, 更应该要加 32bX32b=64b 乘法.
R0R1R2R3, R4R5R6R7 = R0R1R2R3 * R4R5R6R7; 多好啊~~~
页:
[1]
2