对于汇编语言寻址方式的理解,寻址方式是指令中提供 *** 作数的方式,可以是 *** 作数本身,也可以是 *** 作数存放的地址。指令格式:
*** 作符 目的 *** 作数,源 *** 作数 ;注释
目的 *** 作数说的是你要把什么东西放进来,就像是一个袋子一样,而源 *** 作数是具体的东西
寻址方式是对于目的 *** 作数和源 *** 作数相对来说的,各有不同。
由于有不同存储器,我们进行访问存储器的时候,需要不同的指令进行访问,主要对于内部RAM和特殊功能寄存器SFR(MOV指令)、外部RAM(MOVX指令)、程序存储器ROM(MOVC指令)。值得注意一点的是内部RAM和SFR是统一编址的。
寻址方式有七种,分别是立即寻址、直接寻址、寄存器寻址、寄存器间接寻址(主要针对于外部RAM,其次是内部RAM)、变址寻址(针对于ROM,内部和外部都是)、相对寻址、位寻址。下面分别讲述:
如上图所示,00H-7FH是内部RAM的位地址范围
1)00H-1FH为寄存器区,分为四组,使用哪组由PSW里的RS1和RS0共同决定,编号是0123.
2)20H-2FH是可位寻址区.
3)20H-7FH也可以作为通用RAM区
4)20H-7FH也可以作为堆栈区,指针SP指向字节地址07H.
**定义:**直接给出了 *** 作数的寻址方式,特征就是加个#号,(如8位的#data,#12H)或者(16位的#data16,#2022H)
指令演示:
MOV A,#12H;这里对于源 *** 作数就是立即寻址
MOV DPTR,#2022H;同上,但是这是对于16位的立即数
它是对于,内部的RAM和特殊功能寄存器的 *** 作,如A,B,DPTR这种功能寄存器他们都有自己的地址,如A的是E0H,B的是F0H,一般特殊功能寄存器都使用直接寻址
定义:指令中直接给出了 *** 作数的地址,包括1)内部RAM,在指令中直接给出地址,就不用加#号了;2)特殊功能寄存器的名字,但是,除了这几个A,B,DPTR,R0,R1,R2,R3,R4,R5,R6,R7(Rn,n=0-7),其他的都是直接寻址方式。
值得注意的是B如果不是作为乘除法的话,也是直接寻址,A要想作为直接寻址的话必须变为ACC。
指令演示:
MOV A,12H;这里对于源 *** 作数是直接寻址
MOV P0,#45H;这里对于目的 *** 作数就是直接寻址
它是对于,内部RAM和特殊功能寄存器的寻址,内部ROM是直接给出的地址,特殊功能寄存器除了那几个,全是直接寻址。
定义:以寄存器的内容为 *** 作数的寻址方式,是上面直接寻址不可以用的那几个,A,B,DPTR,R0,R1,R2,R3,R4,R5,R6,R7(Rn,n=0-7),其他的寄存器都是直接寻址。
特例就是A和B两个使用的需要注意,A直接用就是寄存器寻址,B要在乘除法中使用才是寄存器寻址,不然就是直接寻址。
指令演示:
MOV A,R0;这里对于目的 *** 作数和源 *** 作数都是寄存器寻址
MUL AB;这里AB都是寄存器寻址,这里是乘法,所以B也是寄存器寻址
特例
MOV B,R0;目的 *** 作数是B,B在这里没有用到乘除法,所以是直接寻址,而不是寄存器寻址
PUSH ACC;这里A变为了ACC,说明了A是直接寻址
它是对于内部RAM和特殊功能寄存器的寻址,内部RAM的话就是R0-R7,剩下的A,B,DPTR就是特殊功能寄存器。
定义:以寄存器的内容为 *** 作数的寻址方式,加@,只有这四个**@A,@B,@R0,@R1可以。
指令演示:
对于外部的RAM,只有四条指令两条读指令和两条写指令(RAM可读和写)
MOVX A,@Ri;读指令,对于源 *** 作数就是寄存器间址,Ri代表R0和R1
MOVX A,@DPTR;读指令,DPTR间址,同上
MOVX @Ri,A;写指令,同上
MOVX @DPTR,A;写指令,同上
对于内部的RAM,用到了Ri来作为间址,例如
MOV @R0,A;这里对于目的 *** 作数是寄存器间址,@R0
MOV @R1,A;这里对于目的 *** 作数是寄存器间址,@R1
**定义:**这里以DPTR或者PC中内容加上A累加器内容之和。
指令演示:
这里只能对于,程序存储器ROM *** 作,不管是内部还是外部只有两条指令ROM(只可以读 *** 作)
MOVC A,@A+DPTR;这里对于源 *** 作数就是变址寻址
MOVC A,@A+PC;同上
定义:以计数器PC的内容为基础,加上指令给出的一字节补码数形成新的PC值的方式,主要用于程序分支的转移。
基本上这个用的很少。
定义:对位地址的内容作位 *** 作方式称为位寻址。位地址范围是00H-7FH,注意区分位地址不是可位寻址区20H-2FH。
指令演示:
由于只有内部RAM和特殊功能寄存器的部分单元有位地址,所以位地址只能对有位地址的这两个空间进行寻址 *** 作。位寻址也是一种直接寻址方式,但是说位寻址更加的正确,因为直接寻址给出的的地址是字节地址,而位寻址给出的是位地址。
MOV C,32H;这里C作为进位标志位CY,该指令将32H位地址内容送给CY
MOV A,32H;将字节地址为32H单元的内容送到累加器A
所以要看是位地址还是字节地址需要看另一个 *** 作数的类型,一般对有C的话,都是位寻址,说位寻址更加的正确。
学会看目的 *** 作数和源 *** 作数的寻址方式,以及理解对于各个存储器的寻址方式,以及指令是怎么样 *** 作的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)