LAOXU
发表于 2024-5-30 15:31:55
这次你如想再进一步完善MDU32D指令功能后投产,请留言, 我晚上整理归类一下发给你.
神农鼎
发表于 2024-5-30 19:05:52
LAOXU 发表于 2024-5-30 15:31
这次你如想再进一步完善MDU32D指令功能后投产,请留言, 我晚上整理归类一下发给你. ...
好,有方向,才可能进步,MDU32C, MDU32D, MDU32E
LAOXU
发表于 2024-5-31 08:42:10
本帖最后由 LAOXU 于 2024-6-1 07:45 编辑
2024/6/1:
对 MDU32/DPU32 类运算模块之构架, 从发展的眼光, 提点建议。
首先,51和 251相比,可用资源缺乏,专用寄存器非常紧张,整个可重入函数(程序),只有 R0-R7、ACC、B、PSW、DPTR 可使用。
因此,MDU32/DPU32 类运算模块之构架, 从实用的角度来看,这两者的侧重点不同。
在 51上应用,侧重点:
1、尽可能的帮助减轻对专用寄存器的占用。
2、加快各种运算速度的辅助类简单指令。
3、不同编译器(Keil,SDCC,IAR)之间的数据格式转换。
在 251上应用,侧重点:
1、扩展(级连)类指令,能轻松将 32位指令,扩展到 64位或更多位。
=======================================================================
具体实施方案:
一、结构(构架)类:
1、MDU32内增加 2级 32位堆栈寄存器(通用方案,今后 DPU32 上也能用上)。
2、增加 R0_R3,R4_R7 压栈、出栈 指令(对 MDU32 模块内堆栈操作)。
或 临时方案(51 MDU32专用):
1、MDU32内增加一个 32位寄存器 DD。
2、增加 R0_R3,R4_R7 到 寄存器 DD 的读、写 指令。
用途:可快速对 R0_R3,R4_R7 寄存器保存和恢复。
=======================================================================
二、指令类:
1、交换指令 SWAP R4_R7,R0_R3 用途:快速交换 R0_R3,R4_R7 寄存器值。
2、比较指令 CMP R4_R7,R0_R3 用途:快速比较 R0_R3,R4_R7 寄存器值。
3、循环指令 RR R4_R7(右移 或 左移均可)用途:浮点数格式转换,循环指令扩展级联。
4、加1 指令 INC R4_R7 用途:浮点数四舍五入。
5、减1 指令 INC R4_R7
6、取补指令 NEG R4_R7 用途:求负数。
7、取反指令 CPL R4_R7
8、清0 指令 CLR R4_R7 用途:快速清除 R4_R7寄存器。
CLR R0_R3 用途:快速清除 R0_R3寄存器。
9、移位指令 最后一位移出 放 Cy(最好),如做不到放 MDU32SR 寄存器内也可。
10、加/减/比较类指令 结果为 0,置位 MDU32SR 寄存器内 Z标志(新增)。
建议增加 四字节 和 单字节 非标运算指令
11、加法指令 ADD R4_R7,A 用途:非标格式浮点数 四舍五入。
12、减法指令 SUB R4_R7,A
13、乘法指令 MUL R4_R7,A 用途:数制转换,BCD-->HEX。
14、除法指令 DIV R4_R7,A 用途:数制转换,HEX-->BCD
以上均是 32位指令。
=======================================================================
三、其他类:
作为 51,我认为最理想的升级模式,是使用 251(BINARY模式)指令集,这样,在 51下能使用 所有 251硬件资源,包括移值 251库函数,
让 MDU32/DPU32 类运算模块 做到 51/251下真正通用。
注:记得我曾经说错,51运行 251(SOURCE模式)指令集,现更正,以本次为准。
51模式下,只能使用(运行) 251(BINARY模式)指令集。
我学的太杂,样样都了解一点,优点,每样都能短时间内拿起,综合能力强。
缺点,慢热,进入状态时间太长,一般要 10天半个月,才能真正进入有效思考。
比如讨论这 MDU32/DPU32 类运算模块之构架指令,没有前导预热,进入不了顶峰状态。
这和整天在这行混的吃这口饭的不同(他们很短时间能进入有效思考)。
上次争论 MDU32/DPU32 类运算模块,运行时是否应该关系统时钟,我后来总结了一下,
结论:我是把 MDU32/DPU32指令,当成 真正 51指令使用,充分考虑如何搭配,才能更有效执行速度更快。
而其他人,仅仅把 MDU32/DPU32指令,当成一个功能指令使用,只考虑完成单一的功能,而并没有考虑更深层次的扩展(级连)等情况下使用。
LAOXU
发表于 2024-6-1 07:38:50
修改:
建议增加 四字节 和 单字节 非标运算指令
用于快速数制转换等
edalab
发表于 2024-6-1 11:25:01
請許工幫我看看這個庫使用還有啥問題?
edalab
发表于 2024-6-1 11:26:52
使用V1和V2版本出錯信息是一樣的
LAOXU
发表于 2024-6-1 12:47:33
edalab 发表于 2024-6-1 11:25
請許工幫我看看這個庫使用還有啥問題?
能把项目文件(可去掉无关的),直接传上来吗
我编译一下看看
edalab
发表于 2024-6-1 13:28:51
LAOXU 发表于 2024-6-1 12:47
能把项目文件(可去掉无关的),直接传上来吗
我编译一下看看
去掉項目相關文件後,還有一個警告信息
edalab
发表于 2024-6-1 13:30:34
上面工程編譯信息如圖
LAOXU
发表于 2024-6-2 06:09:05
把 FCASTL 文件中, 注释(红圈内容)去掉,再编译成库,试试。
?PR?_FCASTL?FCASTL SEGMENT CODE
EXTRN CODE (?C?LNEG)
PUBLIC ?C?FCASTL
PUBLIC ?C?FCASTI
PUBLIC ?C?FCASTC
RSEG?PR?_FCASTL?FCASTL
?C?FCASTL:
MOV B, #0x20+0x7E // long-->float
SJMP FCASTC_002_
?C?FCASTI:
MOV B, #0x10+0x7E // int-->float
SJMP FCASTC_001_
?C?FCASTC:
MOV B, #0x08+0x7E // char-->float
MOV R5, #0x00
FCASTC_001_:
MOV R6, #0x00
MOV R7, #0x00
FCASTC_002_:
RLC A
MOV F0, C
JNB F0, FCASTC_003_
LCALL ?C?LNEG
FCASTC_003_: