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_:

页: 1 2 3 [4] 5
查看完整版本: 32位加减乘除,STC8位机上的MDU32C 实测!库函数,STC8H2K32U-45MHz