您的位置 首页 嵌入式

51单片机的寻址方法

学习汇编程序设计,要先了解CPU的各种寻址法,才能有效的掌握各个命令的用途,寻址法是命令运算码找操作数的方法。指令的寻址方式MOVP1…

学习汇编程序设计,要先了解CPU的各种寻址法,才干有用的把握各个指令的用处,寻址法是指令运算码找操作数的办法。

指令的寻址办法 MOV P1,#0FFH这条指令,第一个词MOV是指令动词,也便是决议做什么作业的,MOV是MOVE少写了一个E,所以便是“传递”,这便是指令,规则做什么作业,数据传递有必要要有一个“源”也便是你要送什么数,有必要要有一个“意图”,也便是你这个数要送到什么当地去,明显在上面那条指令中,要送的数(源)便是0FFH,而要送达的当地(意图地)便是P1这个寄存器。

寻址办法:指定操作数地点单元的办法。

留意:源操作数、意图操作数都有各自的寻址办法。 把握指令的7种寻址办法的效果以及不同寻址办法所查询的存储空间及规模,关于常用的指令,能够给出指令的寻址办法。

在咱们学习的8051单片机中,有7种寻址办法,下面咱们将逐个进行剖析。

一、当即寻址

所要找的操作数是一二进制数或十进制数,出现在指令中,用“#”作前缀

MOV A,#20H

在这种寻址办法中,指令多是双字节的,一般第一个字节是操作码,第二个字节是操作数。该操作数直接参与操作,所以又称当即数,有“#”号一共。当即数便是寄存在程序存储器中的常数,换句话说便是操作数(当即数)是包含在指令字节中的。

例如:

MOV A,#3AH

这条指令的指令代码为74H、3AH,是双字节指令,这条指令的功用是把当即数3AH送入累加器A中。

MOV DPTR,#8200H

在前面学单片机的专用寄存器时,咱们已学过,DPTR是一个16位的寄存器,它由DPH及DPL两个8位的寄存器组成。这条指令的意思便是把当即数的高8位(即82H)送入DPH寄存器,把当即数的低8位(即00H)送入DPL寄存器。

这儿也特别阐明一下:在80C51单片机的指令系统中,仅有一条指令的操作数是16位的当即数,其功用是向地址指针DPTR传送16位的地址,即把当即数的高8位送入DPH,低8位送入DPL。

二、直接寻址

指令中直接给出操作数的地址。

MOV A,30H

MOV 30H,DPH

直接寻址办法是指在指令中操作数直接以单元地址的方法给出,也便是在这种寻址办法中,操作数项给出的是参与运算的操作数的地址,而不是操作数。

例如:MOV A,30H

这条指令中操作数就在30H单元中,也便是30H是操作数的地址,并非操作数。

在80C51单片机中,直接地址只能用来一共特别功用寄存器、内部数据存储器以及位地址空间,详细的说便是:

1、内部数据存储器RAM低128单元。在指令中是以直接单元地址方法给出。

咱们知道低128单元的地址是00H-7FH。在指令中直接以单元地址方法给出这句话的意思便是这0-127共128位的任何一位,例如0位是以00H这个单元地址方法给出、1位便是以01H单元地址给出、127位便是以7FH方法给出。

2、位寻址区。20H-2FH地址单元。

3、特别功用寄存器。专用寄存器除以单元地址方法给出外,还能够以寄存器符号方法给出。例如下面咱们剖析的一条指令 MOV IE,#85H 前面的学习咱们已知道,中止答应寄存器IE的地址是80H,那么也便是这条指令能够以MOV IE,#85H 的方法表述,也能够MOV 80H,#85H的方法表述。

直接寻址是仅有能拜访特别功用寄存器的寻址办法!

咱们来剖析下面几条指令:

MOV 65H,A ;将A的内容送入内部RAM的65H单元地址中

MOV A,direct ;将直接地址单元的内容送入A中

MOV direct,direct;将直接地址单元的内容送直接地址单元

MOV IE,#85H ;将当即数85H送入中止答应寄存器IE

数据前面加了“#”的,一共后边的数是当即数(如#85H,就一共85H便是一个当即数),数据前面没有加“#”号的,就一共后边的是一个地址地址(如,MOV 65H,A这条指令的65H便是一个单元地址)。

三、寄存器寻址

操作数寄存在作业寄存器R0 ~ R7中,或寄存器B中。

MOV A,R2

寄存器寻址的寻址规模是:

1、4个作业寄存器组共有32个通用寄存器,但在指令中只能运用当时寄存器组(作业寄存器组的挑选在前面专用寄存器的学习中,咱们已知道,是由程序状况字PSW中的RS1和RS0来确认的),因而在运用前常需求经过对PSW中的RS1、RS0位的状况设置,来进行对当时作业寄存器组的挑选。

2、部份专用寄存器。例如,累加器A、通用寄存器B、地址寄存器DPTR和进位位CY。

寄存器寻址办法是指操作数在寄存器中,因而指定了寄存器称号就能得到操作数。

例如:MOV A,R0

这条指令的意思是把寄存器R0的内容传送到累加器A中,操作数就在R0中。

INC R3

这条指令的意思是把寄存器R3中的内容加1

寄存器寻址办法便是对由PSW程序状况字确认的作业寄存器组的R0-R7进行读/写操作。

四、寄存器直接寻址

指令中寄存器的内容作为操作数寄存的地址,指令中直接寻址寄存器前用

“@”一共前缀。

举“两个抽屉,两把钥匙”的比如。

MOV R0,#30H

MOV A,@R0

MOV A,#20H

MOV R1,#40H

MOV @R1,A

寄存直接寻址办法是指寄存器中寄存的是操作数的地址,即操作数是经过寄存器直接得到的,因而称为寄存器直接寻址。

MCS-51单片机规则作业寄存器的R0、R1做为直接寻址寄存器。用于寻址内部或外部数据存储器的256个单元。为什么会是256个单元呢?咱们知道,R0或许R1都是一个8位的寄存器,所以它的寻址空间便是2的八次方=256。

例:MOV R0,#30H ;将值30H加载到R0中

MOV A,@R0 ;把内部RAM地址30H内的值放到累加器A中

MOVXA,@R0 ;把外部RAM地址30H内的值放到累加器A中

咱们想想,假如用DPTR做为间址寄存器,那么它的寻址规模是多少呢?DPTR是一个16位的寄存器,所以它的寻址规模便是2的十六次方=65536=64K。因用DPTR做为间址寄存器的寻址空间是64K,所以拜访片外数据存储器时,咱们一般就用DPTR做为间址寄存器。

例:MOV DPTR,#1234H ;将DPTR值设为1234H(16位)

MOVX A,@DPTR ;将外部RAM或I/O地址1234H内的值放到累加器A中

在碑文PUSH(压栈)和POP(出栈)指令时,选用仓库指针SP作寄存器直接寻址。

例:PUSH 30H ;把内部RAM地址30H内的值放到仓库区中

仓库区是由SP寄存器指定的,假如碑文上面这条指令前,SP为60H,指令碑文后会把内部RAM地址30H内的值放到RAM的61H内。

那么做为寄存器直接寻址用的寄存器主要有哪些呢?咱们前面提到的有四个,R0、R1、DPTR、SP

寄存器直接寻址规模总结:

1、外部RAM 64KB。对外部RAM64KB的直接寻址,应运用@DPTR作间址寻址寄存器,其方法为:@DPTR。

例如MOVX A,@DPTR;其功用是把DPTR指定的外部RAM的单元的内容送入累加器A中。

外部RAM的低256单元是一个特别的寻址区,除能够用DPTR作间址寄存器寻址外,还能够用R0或R1作间址寄存器寻址。

例如MOVX A,@R0;这条指令的意思是,把R0指定的外部RAM单元的内容送入累加器A。

2、仓库操作指令(PUSH和POP)也应算作是寄存器直接寻址,即以仓库指针SP作间址寄存器的直接寻址办法。

3、内部RAM低128单元。对内部RAM低128单元的直接寻址,应运用R0或R1作间址寄存器,其通用方法为@Ri(i=0或1)。

4、内部RAM的高128单元也能够拜访。可是留意不能用直接寻址的办法去拜访特别功用寄存器,尽管SFR与内部高128字节RAM地址相同,可是当一个指令拜访高于7HF的内部方位时,CPU是依据寻址办法来委任是拜访高128字节的内部RAM数据仍是拜访SFR.

第4点也多亏了ldh8810同学的提示我才有仔细看,本来的写法简单让咱们认为不能拜访高128字节的内部RAM。

寄存器直接寻址办法不能够拜访特别功用寄存器!!

寄存器直接寻址也须以寄存器符号的方法一共,为了差异寄存器寻址和寄存器直接寻址的差异,在寄存器直接寻址办法式中,寄存器的称号前面加前缀标志“@”。

五、基址寄存器加变址寄存器的变址寻址

操作数地址 = 变地址 + 基地址

基地址寄存器 DPTR 或 PC

变址寄存器 @A

该寻址办法常用于拜访程序存储器,查表。

MOV A,@A + DPTR

这种寻址办法以程序计数器PC或DPTR为基址寄存器,累加器A为变址寄存器,变址寻址时,把两者的内容相加,所得到的成果作为操作数的地址。这种办法常用于拜访程序存储器ROM中的数据表格,即查表操作。

变址寻址只能读出程序内存入的值,而不能写入,也便是说变址寻址这种办法只能对程序存储器进行寻址,或许说它是专门针对程序存储器的寻址办法。

例:MOVC A,@A+DPTR

这条指令的功用是把DPTR和A的内容相加,再把所得到的程序存储器地址单元的内容送A

假若指令碑文前A=54H,DPTR=3F21H,则这条指令变址寻址构成的操作数地址便是54H+3F21H=3F75H。假如3F75H单元中的内容是7FH,则碑文这条指令后,累加器A中的内容便是7FH。

变址寻址的指令只要三条,别离如下:

JMP @A+DPTR

MOVC A,@A+DPTR

MOVC A,@A+PC

第一条指令JMP @A+DPTR

这是一条无条件搬运指令,这条指令的意思便是DPTR加上累加器A的内容做为一个16位的地址,碑文JMP这条指令是,程序就搬运到A+DPTR指定的地址去碑文。

第二、三条指令MOVC A,@A+DPTR和MOVC A,@A+PC指令

这两条指令的一般用于查表操作,功用彻底相同,但运用起来却有必定的不同,现详细阐明如下。

咱们知道,PC是程序指针,是十六位的。DPTR是一个16位的数据指针寄存器,按理,它们的寻址规模都应是64K。咱们在学习特别功用寄存器时已知道,程序计数器PC是一直盯梢着程序的碑文的。也便是说,PC的值是随程序的碑文情况主动改动的,咱们不能够随意的给PC赋值。而DPTR是一个数据指针,咱们就能够给空上数据指针DPTR进行赋值。咱们再看指令MOVC A,@A+PC这条指令的意思是将PC的值与累加器A的值相加作为一个地址,而PC是固定的,累加器A是一个8位的寄存器,它的寻址规模是256个地址单元。讲到这儿,咱们应可了解,MOVC A,@A+PC这条指令的寻址规模其实便是只能在当时指令下256个地址单元。地点,这在咱们实践使用中,或许就会有一个问题,假如咱们需求查询的数据表在256个地址单元之内,则能够用MOVC A,@A+PC这条指令进行查表操作,假如超过了256个单元,则不能用这条指令进行查表操作。方才咱们已提到,DPTR是一个数据指针,这个数据指针咱们能够给它赋值操作的。经过赋值操作。咱们能够使MOVC A,@A+DPTR这条指令的寻址规模到达64K。这便是这两条指令在实践使用傍边要留意的问题。

变址寻址办法是MCS-51单片机所独有的一种寻址办法。

六、位寻址

80C51单片机有位处理功用,能够对数据位进行操作,因而就有相应的位寻址办法。所谓位寻址,便是对内部RAM或可位寻址的特别功用寄存器SFR内的某个位,直接加以置位为1或复位为0。

位寻址的规模,也便是哪些部份能够进行位寻址:

1、咱们在学习51单片机的存储器结构时,咱们已知道在单片机的内部数据存储器RAM的低128单元中有一个区域叫位寻址区。它的单元地址是20H-2FH。共有16个单元,一个单元是8位,所以位寻址区共有128位。这128位都独自有一个位地址,其位地址的姓名便是00H-7FH。

这儿就有一个比较费事的问题需求咱们了解清楚了。咱们在前面的学习中00H、01H。。。。7FH等等,所一共的都是一个字节(或许叫单元地址),而在这儿,这些数据都变成了位地址。咱们在指令中,或许在程序中如何来委任它是一个单元地址仍是一个位地址呢?这个问题,也便是咱们现在正在研讨的位寻址的一个重要问题。其实,委任这些数据是位地址仍是单元地址,咱们都有相应的指令方法的。这个问题咱们在后边的指令系统学习中再加以论说。

2、对专用寄存器位寻址。这儿要阐明一下,不是一切的专用寄存器都能够位寻址的。详细哪些专用寄存器能够哪些专用寄存器不能够,请咱们回头去看看咱们前面关于专用寄存器的

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/264891.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部