wuzhengmin 发表于 2025-11-16 21:29:05

都是先把0x03e8(就是1000)送到WR6,WR6再把它送到存储单元0x0008开始的2个8位存储器里,再把0x1388(就是5000)送到WR6,WR6再把它送到存储单元0x000A开始的2个8位存储器里。

WR6再把它送到存储器里,接着把存储单元0x000A开始的2个8位送到WR2或者WR4,然后直接把存储单元0x0008开始的2个8位

和寄存器WR2或者WR4相加,结果保留在寄存器WR2或者WR4。

接着读出变量f(存储器地址0x000C)里的内容给DR4(或者WR6),再把加法的结果从WR2或者WR4,送到DR4(或者WR6)里去

这里我的机器和何老师不同,我这里是32位的寄存器DR4,当然指针是一样的。

看我机器的Debug结果:

wuzhengmin 发表于 2025-11-16 21:35:26

注意看存储器0x0008开始的4个单元:



注意计算结果是放在地址0x0000开始的2个8位存储器里

因为一开始我们存储器地址0x000C 的内容是0x0000

这里明显STC32G系列是采用了MCS-251指令集,它允许在存储器进行数学运算。

这充分证明了STC32G系列是CISC架构,在RISC架构上是绝对看不到的!


当然,我们把f一开始的内容改成0x06,看上去就更清楚:


wuzhengmin 发表于 2025-11-16 21:49:03


其实上面的反汇编,说明了很多问题,争论我们STC32G系列是8位机的人

特别要看看,这真是直接可以在存储器上做算术运算:

我加多一个反汇编的图,把指针存储器的地址改为0x10



接下来是Xtiny

XTiny存储器模型与Tiny相同,只是默认情况下所有变量类型都使用存储器类型near,称为EDATA存储器类对于具有中等数据需求的应用程序,XTiny存储器模型是一个不错的选择

wuzhengmin 发表于 2025-11-17 09:10:46

何老师把Memory Model设置为Xtiny时的编译结果:


地址全变成16位的:

0x0008   0x000A0x000c!

千万不要认为只是多了2个0!

前面这2个0,表示地址是16位!

wuzhengmin 发表于 2025-11-17 09:15:53

当然,我的机器上,一开始的Memory Model: Tiny: data vars, near const, ptr-2

也是16位寻址的,我估计是STC做的优化,毕竟讲座是2023年的,现在是202511,STC每天都在进步.........

其实地址前8位是定段地址,说全了其实地址是24位的!


低16位是说明的是在这个EDATA段内的地址。


之前何老师的反汇编: MOV WR6,f(0x000C)
                                 MOV@WR6,WR4

WR6 只能装16位!那么我们完整的24位寻址地址,就没法完整保存,有点缺陷。对STC32G并不是最好的选项

反正Memory Model设置不同,片内寻址空间和指针的表示就不同。

wuzhengmin 发表于 2025-11-17 09:47:33

-Memory Model 第3个选择:
Small

在小存储器模型中。默认,所有变量都驻留在兼容MCS-251 ISA单片机的内部数据存储器中,就像它们是使用数据存储器类型说明符显式声明一样
在这个存储器模型中,变量访问非常有效,可以将指定对象大小以上的变量定向到其他存储器区域。数据指针是4字节指针,允许对整个16MB地址
空间进行寻址



wuzhengmin 发表于 2025-11-17 09:59:19

Memory Model设置为Small时何老师的编译结果:





Memory Model设置为Small时我的编译结果:


这个也好理解,32位的最高8位就没有使用,直接丢弃,因为底层的MCS-251的地址就是24位!



wuzhengmin 发表于 2025-11-17 10:09:03

最合适我们STC32G系列的选项:


Xsmall XSmall存储器模型与Small相同,只是默认情况下所有变量都使用存储器类型near,称为EDATA存储器类通常,XSmall模型
是具有巨大需求的应用程序的正确选择,这样才不浪费我们STC32G系列的内部存储空间。

wuzhengmin 发表于 2025-11-17 10:17:13

XSmall存储器模型即使用了EDATA的空间,又能在24位的寻址空间去寻址,

先看看何老师的反编译:


再看看我自己的反编译:


wuzhengmin 发表于 2025-11-17 10:19:28

所以STC32G的数据手册明确告诉你,要选Memory Model设置为Xsmall

这样就兼顾2点:

1变量是放在EDATA区域(你可以理解为原来8051的片内数据区----存储空间256Byet),当然现在大很多(4KByet).

2MOV@DRO, WR6 说明现在的寻址空间是24位(本来是32位,但MCS-251只能使用24位)
页: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17 18 19
查看完整版本: 跟着何宾老师学习STC32位8051单片机原理及应用-STC32G12K128