MCS-51直接寻址问题

2019-03-24 19:57发布

在书上看到MCS-51可以直接寻址的操作数存储空间为内部RAM的低128字节(00H-7FH)和特殊功能寄存器(80H-FFH),对于52子系列其内部RAM空间的80H-FFH不能直接寻址,那54和58系列呢,另外寻址的意义在哪,直接操作不就完了,为什么要寻址还有单片机的数据传送指令,对于不同的源操作数和目的操作数都有规定,大家是不是都是把这些背下来的,我感觉又乱又多 MOV A,#34H           ;A=34H MOV R0,A               ;R0=34H MOV @R0,#56H      ;(34H)=56H  ////在这里就有点看不明白了,这里是到底是把操作数34H改成56H,还是把操作数56H转移到地址是34H里呢,如果是后者那么34H这个地址又是哪来的,前面34H不一直是操作数吗? MOV R1,34H           ;R1=56H   ///这里我知道是把地址34H里的内容56H转移到R1里 MOV 40H,R1           ;(40H)=56H MOV 50H,@R1        ;(50H)=56H MOV P1,#55H          ;P1=55H       若将外部数据存储器地址为3080H的单元内容读出,送到内部RAM地址为30H单元中程序如下 MOV      DPTR,#3080H////这里加了一个#号不是表示立即数吗,而且题目不是要求3080单元的内容吗? MOVX    A,@DPTR MOV      30H, A   怎么样区分指令后面的是操作数还是地址?? 等高手指点下 [ 本帖最后由 zjjone1023 于 2011-5-18 00:14 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
leang521
1楼-- · 2019-03-25 00:03
事实上,MSC只有51和52系列,之后的54,58,516还有其它各个厂家乱七八糟的大部分51系列芯片都是基于52核心的,真正51核心的芯片已经很少了。只不过历史遗留问题,大家习惯叫MCS51.

51核心设置各种寻址指令的意义是非常大的,也许你现在体会不到。但是这几年国内有很多研究51指令集的人员,都认为51指令集非常巧妙。在当时的技术条件下,设计出了51指令集,完美的吧性能和工艺结合在一起

其实很简单,如果你稍稍研究过51核心,研究过51指令集,你就会发现,51中不同的寻址指令读写时间是不一样的,这在当时是非常重大的意义,这就相当于现代处理器中的内部缓冲区,现在CPU不都在吹嘘一级缓存二级缓存,实际上51里的这个就是雏形。
还有就是对于工艺的好处,更多的读写时序节约了大量的晶体管,可以在当时生产工艺条件下使芯片拥有更大的访问空间。

一看你对汇编肯定理解的一塌糊涂
MOV @R0,#56H      ;(34H)=56H  //@R0是寻址,以R0中的地址寻址。这句话翻译过来就是把立即数56H存入R0代表的地址中,也就是34H这个地址

MOV      DPTR,#3080H//DPTR不懂么?指针寄存器,因为51是8位数据16位地址,所以就需要一个专用的16位指针寄存器存放16位地址,这个设计大量节约了代码量,有些新型51甚至扩展了两或多个指针寄存器
MOVX    A,@DPTR//也就是外部寻址了,以指针寄存器中存储的地址为指针取数赐予A寄存器
MOV      30H, A
leang521
2楼-- · 2019-03-25 02:41
#:这个是立即数,你理解;
@:这个是寻址,但是注意这个只能用于寄存器,不能用于操作数,而对于操作数,只要不加#即使寻址
abclixu123
3楼-- · 2019-03-25 05:49
 精彩回答 2  元偷偷看……
zjjone1023
4楼-- · 2019-03-25 08:19

我刚刚才开始看汇编的书,呵呵,而且都是一个人在啃书,理解会差了点 MOV A,#34H ;A=34H 作用是把立即数送到累加器A中 MOV R0,A ;R0=34H 作用是把累加器A的的操作数34H送到R0中 MOV @R0,#56H ;(34H)=56H 这句话的意思是不是把立即数56送到立即数34H的地址里,也就是把34H改成56H 我理解的对吗

对于第二个问题书上不是有

E16位数据传送指令作用把16位立即数装入数据指针DPTR,高8位(指令的第二

              个字节)送入DPTR的高8PDH,低8位送入DPTR的低8PDL

              MOV     DPTR,#data16

这里还是没有绕过来,如果把题目改成16位立即数3080H装入数据指针DPTR,怎么写呢,这两个指令不是一样了吗

[ 本帖最后由 zjjone1023 于 2011-5-18 11:00 编辑 ]
leang521
5楼-- · 2019-03-25 11:29
立即数可以用16位的,比如#1023H,但是存储器寄存器就只有8位的了,也就必须分两步
zjjone1023
6楼-- · 2019-03-25 16:58
MOV A,#34H           ;A=34H  //这里的意思是把立即数34H送给A
MOV R0,A               ;R0=34H//这里是把R0里的地址设置为34H,这里的34H不是立即数而是地址了,我这样理解对吗
MOV @R0,#56H      ;(34H)=56H  
MOV R1,34H           ;R1=56H   
MOV 40H,R1           ;(40H)=56H
MOV 50H,@R1        ;(50H)=56H
MOV P1,#55H          ;P1=55H

MOV DPTR,#3080H//这里是把DPTR里的地址设置为3080H
MOVX  A,@DPTR//将外部RAM或I/O地址1234H内的值放到累加器A中
MOV 30H, A

以上我的理解对吗,是不是可以这样理解,R和DPTR里只能放地址而不能放立即数

一周热门 更多>