本帖最后由 xiaoyuan_ly 于 2011-4-24 15:55 编辑
51系列的是代码和数据混合放在ROM区的,可以这么理解,对MOV A,#12H 这条汇编来说,其实它的 12H数据是和指令关联的,所以在单片机51核的指令译码阶段,核已知道12H数据在ROM中的位置,这个数据位置和当前的程序PC是关联的,可以计算知道的,所以可以直接向ROM寻址得到这个12H数据。而MOVC指令是向ROM的所有数据进行寻址的方式,也就是说你可以读写在ROM中的任意一个数据(也包括指令数据)。 还有就是ROM和RAM都是存储单元,只是一个只读,一个可读也可写罢了。MOV也好,MOVC也好,只是一种操作动作的表示,是让单片机核在译码阶段区别动作功能的表示了。并不是说对ROM的操作一定要用哪个指令,而是能知道在ROM中的数据位置地址,就能取到相应的这个数据。对RAM也是一样的,只是你的理解中RAM的地址是直接给出的好理解罢了(比如MOV A,50H),RAM的地址是50H,其实这个50H也是存在ROM中,它的读取也是按我上面说的ROM中关联的方式读取的。还有就是同样的MOV,在不同的寻址方式,其编译后的操作码(就是指令)也是不一样的,你可以自己再看看细节就知道了。
我再来细说下: 举个列子 比如 MOV A,#12H 和MOV A,12H 这两条指令,其实他们的12H的这个数据都是存在ROM中的,那你的理解肯定是 MOV A,#12H,是向ROM中取数据12H,而MOV A,12H是向RAM中的12H单元中取数据。下面我再来说说实质:这2条指令的机器码是: 74H 12H和E5H 12H。在指令译码阶段:74H的操作码指令功能是向ROM中取得这个立即数据12H就可以了,这个立即数据的位置是在74H指令字节的下一个字节中。而E5H的操作码指令功能是向ROM中取得数据12H后,再将这个12H数据作为RAM地址向RAM单元中的12H单元中取得相应的数据。我再来说下细节MOVC这个东西。 我还是那个说法: MOVC指令是向ROM的所有数据进行寻址的方式,也就是说你可以读写在ROM中的任意一个数据(也包括指令数据)。 只是取得的数据有意义和无意义的差别罢了,或者说是你需要的和不需要的罢了。 不需要的我们也不会去取,那我们就不在乎这些数据的所在地址到底在哪儿。 需要的数据在ROM中的地址才是我们关心的。所以你在定义有用数据在ROM中时,DPTR中的数据就是这些有用数据的地址。
最后,51是代码和数据混合存放在ROM中的。比较ARM或其他的,代码和数据是分别存放在ROM的各个块区中。如果是直接从ROM中执行,那就没有搬运。如果从RAM中去执行的话,那就是将ROM中的代码和数据都搬运到RAM中,然后再执行。这样做的好处是提高指令运行速度。 ROM中执行速度慢,RAM中执行速度快。 这也就是单片机为什么只能运行在较低频率的瓶颈之一。因为没有外围高速的ROM配合,如果ROM器件能到200M,那就没有问题了。 |