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条回答
xu__changhua
1楼-- · 2019-03-25 19:51
楼上的,R和DPTR里只能放地址而不能放立即数//理解还没有到位,这很麻烦,很难解释得清楚。
首先,什么是立即数呢?清楚吗?世上本没有立即数,叫的人多了,才称立即数。
所谓立即数,是老早设计计算机的人发明的一个名词,也就是寻址方式的一种。
一般的,所谓寻址方式,是指寻找地址(或寄存器)的方法,为什么要寻找地址呢?目的是取数和存数;只有立即数寻址方式,才不要去寻找地址,所以叫立即数,那立即数又是为什么不要寻找地址呢?
那要理解计算机的机器码程序结构了,机器码程序也是操作码+操作数(或者单独操作码,操作码里隐含操作数),并且存放在程序区(或叫代码段),对于所谓的立即数的机器码而言,操作码后面跟着的操作数就不需要到处寻找了,紧跟着呢,拿来就用了。而其他寻址方式操作码后面跟着的这个数是指别的地方的内容,要么是寄存器,要么是其他段的存储器(数据段、堆栈段、代码段(这个代码段是地址值而不是立即数)和附加段),就这意思了。
只不过51的存储器组织结构属于哈弗结构,程序存储器和数据存储器独立编址;而有些(8086等)存储器组织结是冯诺依曼结构,所有存储器统一编址并分段,但立即数寻址方式的含义是没有区别的,都是指操作码后紧跟着的这个数。所以,立即数就有一个特征是,肯定是在代码段里(对于51MCU就是指在程序存储器区),但反过来代码段(或程序存储区)的数并不都是立即数,也可能是变址寻址(间接寻址的一种)或别的寻址等。
=========================================
仔细体会吧。
xu__changhua
2楼-- · 2019-03-25 21:25
顺便补充一下,掌握不了立即数寻址的也能玩好单片机,不要灰心,不掌握寻址方式只是理论功底逊了点,但不影响单片机的应用。好多人都在用单片机甚至在用ARM,但不一定对寻址方式都理解。
zjjone1023
3楼-- · 2019-03-25 22:24
 精彩回答 2  元偷偷看……
leang521
4楼-- · 2019-03-25 23:29
现在大家都用C了,毕竟现在的单片机动不动十几K的容量,不像以前还有512字节的单片机,就必须用汇编写。
C的代码也就比汇编多了5%左右
leang521
5楼-- · 2019-03-26 02:21
MOV A,#34H ;A=34H //立即数34H赐予A MOV R0,A ;R0=34H//A中的数赐予R0,也即立即数34H赐予R0 MOV @R0,#56H ;(34H)=56H //以R0存储的数为地址寻址,向这个地址赐值56H,翻译过来就是将立即数56H赐予内存中地址34H的存储器
MOV R1,34H ;R1=56H //这句就是内存34H中的数赐予R1,因为刚才把34H中的值改为56H,也即R1赐值56H
MOV 40H,R1 ;(40H)=56H//R1中的数赐予内存中地址40H
MOV 50H,@R1 ;(50H)=56H//这句有误,因为@为寻址指令,这句是说以R1中的数为地址寻址,R1中的数为56H,也即内存56H中的数赐予内存50H
MOV P1,#55H ;P1=55H//这句好理解,立即数55H赐予寄存器P1

MOV DPTR,#3080H//这里并不是把DPTR地址设置为3080,而是把地址指针寄存器DPTR的值设置为3080,这是两个不同的概念,DPTR是内部寄存器,没有地址,或者说这个地址你看不到。
MOVX A,@DPTR//以DPTR中的值为地址寻址,因为刚才已经把DPTR设置为3080,也即将地址3080中的数赐予A,因为MOVX为片外传送指令,也即将外部存储器中对应地址为3080的数赐予A
MOV 30H, A//这个前面讲过了,A赐予内存中地址30H的存储器
zjjone1023
6楼-- · 2019-03-26 02:52
那是不是汇编只要了解下,我自己也想过,以后肯定还是用C写程序,必竟现在C是主流,而且也好移植,看汇编只是想对单片机有个更深的了解,而且我看到大多数精准的延时还是用汇编写的

一周热门 更多>