打印

刚学单片机问大家一个弱智的问题

[复制链接]
楼主: tianheyun
手机看帖
扫描二维码
随时随地手机跟帖
21
本帖最后由 Sin90Cos90 于 2011-4-4 15:23 编辑

mov a,#12h  
mov a,#13h  
mov a,#14h  
mov a,#15h  
mov a,#16h  
mov a,#17h

因该是  #XX 放在  51的 ROM   中  在51  启动的 时候 把他 初始化 到  RAM里

使用特权

评论回复
22
XYH806382995| | 2011-4-4 15:43 | 只看该作者
不好学

使用特权

评论回复
23
iprogramer| | 2011-4-4 17:04 | 只看该作者
谢谢谢谢谢

使用特权

评论回复
24
流行音乐| | 2011-4-4 18:54 | 只看该作者
这都行。

使用特权

评论回复
25
刘前辈| | 2011-4-4 21:16 | 只看该作者
本帖最后由 刘前辈 于 2011-4-4 21:19 编辑
12#
……你也可以用MOVC来实现“mov a,#12”,这时候数据表就一个数据#12。


这个话可不能随便说来忽悠LZ,很简单的证据,假设如果#12h 在某某数据表里,这个数据表的地址在哪?也就是movc 间接寻址的指针如何指向12h ?
    任何数据表都是有段地址segment addr的,都可以用mov DPTR,#addr;所指向的,#12h 的段地址addr在哪?

所以:mov a, #12h 的指令代码为 74 0C, 也即74 为mov  a, #立即操作数的指令代码;0C这个立即操作数是74这个指令代码的一部分——密不可分的一部分。——它在代码区段,而不在数据区段。

指令:MOV  A ,#data
操作:(A)<——#data
说明:代码的第二字节为立即数,它与指令的操作码一起放在程序存贮器中。执行该指令时,与操作码一起取到CPU中。


、、

使用特权

评论回复
26
aihe| | 2011-4-4 22:08 | 只看该作者
呵呵呵,楼主仔细看指令的注释就可以了,具体到指令的二进制排列式及周期

使用特权

评论回复
27
kmlgwyl| | 2011-4-4 22:32 | 只看该作者

使用特权

评论回复
28
yirongfu| | 2011-4-5 02:24 | 只看该作者
本帖最后由 yirongfu 于 2011-4-5 02:38 编辑

再解释几句吧,免得楼主越看越乱,当然这仅仅是我的理解,我不是专家。

1. 楼主的命题不成立,“mov是访问片内数据存储器(ram)用的”这个论断不准确,所以他最早的疑问也就没法回答,也没必要回答了。

2. 为何mov a,#12不是用movc呢?这个问题是承前提出的,所以首先可以肯定这句是没问题的(当然,我这是废话),是楼主的命题不对,至于其他朋友提出的关于#12到底在哪里的观点,我还是重申我的理解,#12固化在ROM里头,因为它是机器码的一个字节(该指令2字节的),最终被烧进ROM的HEX里头就有#12这个字节。也不是初始化到用户RAM里头,很简单,假设是初始化到RAM,那么每用一个立即数就占用一个RAM字节,那设定变量的时候难道还需要先统计用了多少立即数了吗(即256B的RAM会有一部分用来分配给立即数使用吗)?请记住,对于传统的MCS-51架构的单片机,CPU的工作有两个——取指和执行。在取指阶段,CPU从内部或外部ROM中取出指令操作码和操作数(比如这里的#12),然后执行这条指令的逻辑功能。如果朋友们在学校时用实验箱做过微机原理实验,应该记得敲进去的是16进制机器码,而那容易让人以为立即数可能不存在ROM里头,因为你是敲键盘进去的,还显示在液晶屏上。但如果自己用汇编语言写程序,尤其是代码比较多有翻页的程序,再用烧录器往单片机烧录程序,调入查看hex文件,……,亲自经历了这些,或许你就能体会到到底程序是如何被“组织”入单片机的了。

3. mov a,#12用movc来实现的话,得按照相应的语法来实现,并不是说直接movc a,#12,我想楼主不会连这都误解吧。这里补充一下,MOVC的意思是move constant,哈佛结构的51核严格地将存储器分为ROM(用来存放调试好的程序指令、常数及数据表格)和RAM(存放少量的随机数据),M是memory的意思,而不是“区段”。具体怎么实现,楼主有兴趣的话自己去写写,但我想这不是这个问题的重点。之所以会有这么多语句,那也不是我们能解释得了的,存在自有它的道理,它们有各自的适用场合,比如你就这么一个数据要转移,就没必要用查表程序,对吧。再说了,像microchip的精简指令集,那语句更少,哪有51的mov这么多指令,51的一句就能实现的操作,RISC可能要两三个语句,但它也有它的优点。所以,第一步还是先学会怎么用,多查指令表。

4. over

使用特权

评论回复
29
123jj| | 2011-4-5 07:03 | 只看该作者
刘前辈的51软件确实玩的很转。

LZ看书很仔细~
刘前辈的解答也很仔细~~
草原上的小狼总结的更仔细~~~

赞一把~~~  :P

使用特权

评论回复
30
几米时代| | 2011-4-5 09:48 | 只看该作者
13楼的请问你的资料哪里的?

使用特权

评论回复
31
jd吕凯| | 2011-4-5 10:37 | 只看该作者
28# yirongfu


我们教材上说MOVC里的C是CODE的意思,你说是CONSTANT,常量吗?这两个一样吗?我也是刚学单片机的菜鸟,希望前辈有个明确解释

使用特权

评论回复
32
yirongfu| | 2011-4-5 11:36 | 只看该作者
本帖最后由 yirongfu 于 2011-4-5 12:16 编辑

31# jd吕凯
请参考12楼的贴图对MOVC的解释。查表应用时,实际上就是要将一些常数“提取”出来,我觉得你可以理解为constant,也可以理解为code,因为这个常数被固化成代码了^_^。
现在讨论有点偏题了,楼主的问题本来比较简单的,呵呵。在一本北航的C51书中,将MOVC定义成MoveCode,(该书还说了这么一句:不论用DPTR或PC作为基址指针,变址寻址方式都只适用于8051的程序存贮器,通常用于读取数据表),而我前面提及的move constant,则源自Atmel官网的一份英文文档“Atmel 8051 Microcontrollers Hardware Manual”。我又翻出97年出版成都电子科技大的51单片机教材,里头对MOVC的解释是“将程序存储器单元的数据送到A中”。我觉得这个C就不用去追究了(虽然一般有疑问时我倾向于查阅和相信原厂的英文资料),就看你怎么理解,但只要肯定一点,也是我从一开始就说的,C是在ROM里头!
最后,再贴一个佐证,希望有助于大家的理解:

使用特权

评论回复
33
我是TZF| | 2011-4-5 12:45 | 只看该作者
刚开始学习汇编都是这样的,学好后就会发现汇编的奥秘!不过我推荐你先用C把单片机裸奔吧!!!

使用特权

评论回复
34
qzhui121| | 2011-4-6 14:41 | 只看该作者
不错的意思。看看了

使用特权

评论回复
35
lanqishi| | 2011-4-7 13:54 | 只看该作者
困惑啊

使用特权

评论回复
36
jackieha| | 2011-4-10 00:40 | 只看该作者
如果你是在学了汇编的基础上开学单片机的 我就啥也不说了,因为本人不懂汇编。

使用特权

评论回复
37
jackieha| | 2011-4-10 00:41 | 只看该作者
我用c语言。

使用特权

评论回复
38
xiaoyuan_ly| | 2011-4-10 15:32 | 只看该作者
我来说2句了,我明白楼主想要说的问题。 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,在不同的寻址方式,其编译后的操作码(就是指令)也是不一样的,你可以自己再看看细节就知道了。不知道这样,我说明白了没有??!!

使用特权

评论回复
39
xiaoyuan_ly| | 2011-4-10 15:48 | 只看该作者
我再来细说下: 举个列子 比如 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单元中取得相应的数据。不知道这样,我说的真正明白了没有??!!

使用特权

评论回复
40
xiaoyuan_ly| | 2011-4-10 16:02 | 只看该作者
看了上面的说法,我再来说下细节MOVC这个东西。 我还是那个说法: MOVC指令是向ROM的所有数据进行寻址的方式,也就是说你可以读写在ROM中的任意一个数据(也包括指令数据)。 只是取得的数据有意义和无意义的差别罢了,或者说是你需要的和不需要的罢了。 不需要的我们也不会去取,那我们就不在乎这些数据的所在地址到底在哪儿。 需要的数据在ROM中的地址才是我们关心的。所以你在定义有用数据在ROM中时,DPTR中的数据就是这些有用数据的地址。这下,应该清楚了吧?!!! 再不清楚,我就没法再怎样表达了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则