寻址方式:在指令中说明操作数所在地址的方法
寻址方式按操作数的类型,可分为数的寻址和指令寻址,
1,数的寻址有:常数寻址(立即寻址)、寄存器数寻址(寄存器寻址)、存储器数寻址(直接寻址方式、寄存器间接寻址方式、变址寻址方式)和位寻址,
2,指令的寻址有绝对寻址和相对寻址
| 寻址方式 | 操作数存放位置 | 寄存器对象 |
|---|---|---|
| 立即寻址 | 操作数包含在指令中 | |
| 寄存器寻址 | 操作数存放在某一寄存器中,指令给出存放操作数所在存储单元的地址 | |
| 直接寻址 | 操作数存放在内存单元内,指令中直接给出操作数所在存储单元的地址 | |
| 间接寻址 | 指令中给出了操作数地址的地址 | |
| 相对寻址 | 在指令地址码部分给出一个偏移量(可正可负),操作数地址等于本条指令的地址加上该偏移量 | |
| 变址寻址 | 操作数地址等于变址寄存器的内容加偏移量 | |
| 位寻址 |
==7+2种寻址方式:==
一,寄存器寻址方式——操作数在寄存器中(表示把寄存器Rn的内容传给累加器A)
MOV A,Rn; (Rn)→A,n=0~7
寻址范围:
(1) 4组通用工作寄存区共32个工作寄存器
(2)部分特殊功能寄存器,例如A,B以及数据指针寄存器DPTR等
二,直接寻址方式
操作数直接以单元地址的形式给出:
MOV A,40H
寻址范围:
(1) 4组通用工作寄存区共32个工作寄存器
(2) 特殊功能寄存器。除了以单元地址的形式外,还可用寄存器符号的形式给出。例如
MOV A,80H 与 MOV A,PO 是等价的
三,寄存器间接寻址方式——寄存器中存放的是操作数的地址
在寄存器的名称的前面加前缀标志“@”
访问内部RAM或外部数据存储器的低256个字节时,只能采用R0或R1作为间址寄存器。例如:
MOV R1,#40H
MOV A, @R1
把内部RAM区地址为40H单元内容送A。
寻址范围:
(1):访问内部RAM区,51系列128个字节,52系列256个字节,其通用形式为@Ri
(2):对片外数据存储器的64K字节的间接寻址,例如:
MOVX A,@DPTR
(3)片外数据存储器的低256字节,不建议使用。
例如:MOVX A,@Ri
(4)堆栈区
堆栈操作指令PUSH(压栈)和POP(出栈)使用堆栈指针(SP)做间址寄存器
四,立即寻址方式——常数寻址
操作数在指令中直接给出,需在操作数前面加前缀“#”,==若立即数的首位为A~F,前面还要加零(0起到指示的作用)==。例如:
MOV A,#40H
MOV A,#OFFH
五,基址寄存器加变址、寄存器间址寻址方式
本寻址方式是以DPTR(一个16位的指针)或PC(程序计数器,16位的数据)作基址寄存器,以累加器A作为变址寄存器
例如:
指令MOVC A, @A+DPTR 其中A的原有内容为05H,DPTR的内容为0400H,该指令执行的结果是把程序存储器0405H单元的内容传送给A
说明:
(1)本寻址方式是专门针对程序存储器的寻址方式,寻址范围可达到64KB
(2)本寻址方式的指令只有3条:
==MOVC A, @A+DPTR== (第一条常用)
MOVC A, @A+PC
JMP @A+DPTR
六,位寻址方式
位寻址是指操作数是二进制位的寻址方式。 MCS-51有位处理功能,可以对数据位进行操作,例如:
MOV C,40H
是把位40H的值送到进位位C
寻址范围包括:
(1)内部RAM中的位寻址区。位有两种表示方法,
1,直接写位地址,例如,40H,
2,另一种是单元地址加上位(加上字节数0~7),例如,(28H).0,指的是28H单元中的最低位,它们是等价的
(2)特殊功能寄存器中的可寻址位
可寻址位在指令中有如下4种的表示方法:
a.直接使用位地址。例如PSW.5的位地址为0D5H**(查对照表可以查到)**
b.位名称的表示方法:例如:PSW.5是F0标志位,可使用F0表示该位
c. 单元地址加位数的表示方法。例如:(0D0H).5
d.特殊功能寄存器符号加位数的表示方法:例如:PSW.5
七,绝对寻址
绝对寻址是在指令的操作数中直接提供目的位置的地址或地址的一部分。
八,相对寻址方式
在相对寻址的转移 指令中,给出了地址偏移量,以“rel”表示,即把PC的当前值加上偏移量就构成了程序转移的目的地址:
目的地址 = 当前PC+rel = 转移指令所在的地址 + 转移指令的字节数 +rel
偏移量rel是一带符号的8位二进制数补码数(有正有负就代表其跳转时可上可下
==问:==为什么 PC当前值=转移指令所在的地址 + 转移指令的字节数?
答:PC值是一个程序的指针、程序计数器。那么它指向的是将要执行的下一个指令所在的地址。而当程序在进行转移指令时,PC值可并不是指向这条转移指令的地址,PC值应该指向转移指令的下一条指令所在地址,即为转移指令所在的地址 + 转移指令的字节数
跳转 范围:-128~+127
向地址增加方向最大转移(127转移指令字节)个单元地址,向地址减少方向最大可转移(128-转移指令)个单元地址。
注意:
对程序片外的指令只有MOVC指令