|
已知STC15W401AS有256Bytes的内部RAM和256Bytes的外部RAM,而内部的256-Byte RAM跟早期的8051内核没有明显区别(早期8051内核只有128-Byte RAM),那么按照经典的8051存储结构来分析;
根据书中描述,8051的内核跟一般的CPU内核有所不同,按照我的理解,8051没有常规CPU的那种通用寄存器,比如ARM,比如80x86等,它们的通用寄存器是相对独立的,不关联到RAM内而无单独编址,相反8051的R0-R7的1-4组寄存器是有单独的编址固定占有RAM的前4*8=32Bytes;并且,累加器ACC,辅助B等确实又关联到SFR区的相关地址中。如果按照统一编址思想类比,那么8051确实没有所谓的独立寄存器,除了PC,因为所有的其它寄存器基本可以看作内存和外设(其中R0-R7就是内存,ACC,B等就是ALU的出入口,ALU作为独立于内核的外设),使用比较“统一”的地址去访问,也就是说所有的指令其实都是直接访问内存或者访问总线上的其它地址,中转也靠内存。
那么,真是这样吗?开始进行尝试,并得出以下结论:原则上MOV 0x00,#0xFF与MOV R0,#0xFF完全等效,但是实际上根据机器码判断发现前者3字节,后者只有2字节,这就比较奇怪了。同时MOV @R0,A(0xE0)可以成立,但是MOV @0x00,A(0xE0)却会报错。通过查阅资料和思考认为虽然所有指令都能访问内存,但是访问的是约定的4组寄存器范围,并且由于还受PSW寄存器中的RS0,RS1的控制,R0-R7将会映射到不同的内存区间,所以写MOV R0,#0xFF并不会译出等效于MOV 0x00,#0xFF的机器码,在这里,R0应该是约定好的一个标志,不单独指向任何内存地址,而是告知内核约定中4组中的一个,内核再根据PSW状态解析出真实地址。所以直接指向R0某一组的真实地址就是绕开了这个约定,所以机器码不同,而其它的功能指令都是按照这个约定构建的当然就不行了!
感想是不知道那位大神设计的这种人不人鬼不鬼的架构,通用寄存器占用一大片原本不足的IRAM不说,而且被占用的IRAM还不能自由地,直接地访问,非要通过相对的标识符R0-R7加上PSW的设置才能访问到真实地址。这种限制让程序员能秀的操作又少了好多。MSC8051就是垃圾,要不是做一个简单的东西Cortex-M3太浪费,我还真不愿意再去搞什么8051.
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|