都是先把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结果:
注意看存储器0x0008开始的4个单元:
注意计算结果是放在地址0x0000开始的2个8位存储器里
因为一开始我们存储器地址0x000C 的内容是0x0000
这里明显STC32G系列是采用了MCS-251指令集,它允许在存储器进行数学运算。
这充分证明了STC32G系列是CISC架构,在RISC架构上是绝对看不到的!
当然,我们把f一开始的内容改成0x06,看上去就更清楚:
其实上面的反汇编,说明了很多问题,争论我们STC32G系列是8位机的人
特别要看看,这真是直接可以在存储器上做算术运算:
我加多一个反汇编的图,把指针存储器的地址改为0x10
接下来是Xtiny
XTiny存储器模型与Tiny相同,只是默认情况下所有变量类型都使用存储器类型near,称为EDATA存储器类对于具有中等数据需求的应用程序,XTiny存储器模型是一个不错的选择
何老师把Memory Model设置为Xtiny时的编译结果:
地址全变成16位的:
0x0008 0x000A0x000c!
千万不要认为只是多了2个0!
前面这2个0,表示地址是16位!
当然,我的机器上,一开始的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设置不同,片内寻址空间和指针的表示就不同。
-Memory Model 第3个选择:
Small
在小存储器模型中。默认,所有变量都驻留在兼容MCS-251 ISA单片机的内部数据存储器中,就像它们是使用数据存储器类型说明符显式声明一样
在这个存储器模型中,变量访问非常有效,可以将指定对象大小以上的变量定向到其他存储器区域。数据指针是4字节指针,允许对整个16MB地址
空间进行寻址
Memory Model设置为Small时何老师的编译结果:
Memory Model设置为Small时我的编译结果:
这个也好理解,32位的最高8位就没有使用,直接丢弃,因为底层的MCS-251的地址就是24位!
最合适我们STC32G系列的选项:
Xsmall XSmall存储器模型与Small相同,只是默认情况下所有变量都使用存储器类型near,称为EDATA存储器类通常,XSmall模型
是具有巨大需求的应用程序的正确选择,这样才不浪费我们STC32G系列的内部存储空间。
XSmall存储器模型即使用了EDATA的空间,又能在24位的寻址空间去寻址,
先看看何老师的反编译:
再看看我自己的反编译:
所以STC32G的数据手册明确告诉你,要选Memory Model设置为Xsmall
这样就兼顾2点:
1变量是放在EDATA区域(你可以理解为原来8051的片内数据区----存储空间256Byet),当然现在大很多(4KByet).
2MOV@DRO, WR6 说明现在的寻址空间是24位(本来是32位,但MCS-251只能使用24位)