说明:主要是我之前发其它博客的文章总结被平台强制收费观看了有点恶心,在这里重新发吧
前言:
我之前在论坛上发的一个问题:直接用MOV A,#00000001B和MOV P3PU,A发现报错:mission1.asm(22): warning A52: VALUE HAS BEEN TRUNCATED TO 8 BITS,说是值已被截断为 8 位。
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=13973
这里就涉及到内部的一些架构问题了,C51内核和C251内核还是有点差别的。从芯片手册可以看到访问拓展SFR的用法例子:

之前到这里就是搞不懂为什么会用WR6和WR4的了,手册没提及。后面去找TSC80251手册资料才看到。这里要解决的疑惑:
1、这里的WR6、WR4寄存器是什么?

从TSC80251手册能看到,32位的DR4寄存器由两个16位的寄存器WR4和WR6组成,而16位的WR6寄存器由两个8位的寄存器R6和R7组成。每一组的寄存器中一个发生变化,则这一组的寄存器都按组成方式变化。P3PU的地址为7EFE13H,已超出8位,自然会报错。所以要借助32位的寄存器访问,并且SFR只能使用间接寻址方式访问:(建议细看TSC80251手册P18到P20的内容,并且同步看一下STC32G12K128芯片手册存储器那里的图片,然后对比看看)

P29的:

2、WORD0是?
#WORD0 CLKSEL其实就是相当于对立即数CLKSEL取低16位,WORD1就是高16位。和HIGH和LOW的用法差不多,只不过这两个是8位的。

从keil帮助文档的汇编器说明那里也能看到WORDx的说明。在ide主界面的help选择第二个open books window,左边弹出后双击uVision User's Guide Selection,之后就选择:
A251 Assembler User's Guide——Writing Assembly Programs——Expressions and Operators——Operators——WORDx。
然后你就能看到关于WORD0和WORD2的说明还有图表了。(懒得找了用原来的)

3、R11是?
R11就是累加器A,但是R11可以作为SFR访问。

4、例子解释(到这里应该都能大概理解了吧)
; 第一步,初始化累加器A为00H(清零操作)
MOV A,#00H ; 将立即数00H加载到累加器A中,A = 00H
MOV WR6,#WORD0 CLKSEL ; 第二步,将要写入的寄存器 CLKSEL 地址的低16位写入16位寄存器 WR6
MOV WR4,#WORD2 CLKSEL ; 第三步,将要写入的寄存器 CLKSEL 地址的高16位写入16位寄存器 WR4
; 第四步,将R11(累加器A)的值00H写入 CLKSEL 寄存器
**MOV @DR4,R11 ;**通过数据寄存器DR4(WR6+WR4)间接寻址,将R11(即累加器A)的值写入CLKSEL寄存器
之前自己的总结文章笔记保存这里吧附件
附件:STC32G12K128汇编访问拓展SFR(特殊功能寄存器).docx
参考:
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3616