找回密码
 立即注册
楼主: wuzhengmin

跟着何宾老师学习STC32位8051单片机原理及应用-STC32G12K128

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 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结果:

截图202511162133117669.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2025-11-16 21:35:26 | 显示全部楼层
注意看存储器0x0008开始的4个单元:



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

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

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

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


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

截图202511162135229193.jpg
截图202511162158511870.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2025-11-16 21:49:03 | 显示全部楼层

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

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

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



接下来是Xtiny

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

截图202511162149016051.jpg
截图202511170849206298.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2025-11-17 09:10:46 | 显示全部楼层
何老师把Memory Model设置为Xtiny时的编译结果:


地址全变成16位的:

0x0008   0x000A  0x000c!

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

前面这2个0,表示地址是16位!
截图202511170908397413.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 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设置不同,片内寻址空间和指针的表示就不同。
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2025-11-17 09:47:33 | 显示全部楼层
-Memory Model 第3个选择:
Small

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



截图202511170946477085.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2025-11-17 09:59:19 | 显示全部楼层
Memory Model设置为Small时何老师的编译结果:





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


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



截图202511170957355913.jpg
截图202511170959129529.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2025-11-17 10:09:03 | 显示全部楼层
最合适我们STC32G系列的选项:


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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2025-11-17 10:17:13 | 显示全部楼层
XSmall存储器模型即使用了EDATA的空间,又能在24位的寻址空间去寻址,

先看看何老师的反编译:


再看看我自己的反编译:


截图202511171015026900.jpg
截图202511171017071221.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-03-30 19:54:03
已绑定手机

22

主题

2426

回帖

3422

积分

论坛元老

积分
3422
发表于 2025-11-17 10:19:28 | 显示全部楼层
所以STC32G的数据手册明确告诉你,要选Memory Model设置为Xsmall

这样就兼顾2点:

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

2  MOV  @DRO, WR6 说明现在的寻址空间是24位(本来是32位,但MCS-251只能使用24位)
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-31 18:29 , Processed in 0.113357 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表