6502的全部寻址方式
6502
一、6502的寻址方式
1、立即寻址
在这种寻址方式中,指令的操作对象部分直接给出了操作数本身,该操作数就称为立即数。
LDA #$FF
其中,$是CEC-I机中十六进制数的标志。
解释:将立即数$FF送累加器A。
2、绝对寻址
这种寻址方式中,指令的操作对象不是操作数自身,而是操作数所在地址的地址码(称为绝对地址或者直接地址)。
例如:
LDA $0c00
解释:吧绝对地址为$0c00单元的内容提取出来送到累加器A。
3、零页寻址
零页寻址与绝对寻址类似。
相同点:都是在操作对象部分直接给出操作数所在地址
不同点:零页寻址的方式的寻址范围只能在零页的256个单元中,即只能在$0000~$00FF中。
所以零页寻址的地址只许给操作数的低八位,其高八位都约定为零$00。
例如:
LDA $0C
解释:给出了操作数所在地址的低八位0C,表面操作数所在地址为$000C单元。此功能是把$000C单元中的内容提取出来送累加器A。
4、累加器寻址
这种寻址方式的操作数在累加器中。
例如:
ROL A
解释:把累加器A中的操作数连同进位位C循环左移一位。
5、隐含寻址
操作数所在地址隐含于操作码之中,故采用隐含寻址的指令均为一字节指令。
例如:
INX (IN 的机器码为 E8)
DEY (DE 的机器码为 CA)
解释:X+1->X,Y-1->Y。
6、绝对变址寻址
包含使用X寄存器的绝对变址和使用Y寄存器的绝对变址。
1)绝对X变址寻址(ABS,X)
是使用X变址寄存器进行变址的一种寻址方式。
在这种寻址中,是把指令中给出的16地址作为基地址与偏移量(即X变址寄存器中的内容)相加后所得的地址,再把这个地址作为操作数实际存放的地址。
例如:(设X寄存器中的内容为$0B)
LDA $0340+X
解释:就是将$034B单元中的内容提取出来送累加器A。
STA $0340,X
解释:其功能是把累加器A中的内容取出来放到储存器($0340+x)单元中去。
2)绝对Y变址寻址(ABS,Y)
与X变址寻址类似,只是使用的是Y寄存器。
7、零页变址寻址
包含零页X变址(Z.PAGE,X)和零页Y变址(Z.PAGE,Y)。
区别在于零页变址寻址中只给出了一个8位地址,即零页地址的低八位,其高八位约定为$00。
例如:
LDA $0A,X
LDA $0A,Y
解释:把储存器($000A+X)地址中的数据放到累加器A中,把储存器($000A+Y)地址中的数据放到累加器A中。
8、间接寻址
在这种寻址方式中,指令的操作对象部分给出的是操作数所在地址的地址,称为间接地址。
例如:
JMP ($100A)
解释:
从间接地址$100A单元中取出操作数有效地址的低八位(假设为$A5),
再从间接地址加1单元($100A+1单元)中取出操作数有效地址的高八位(假设为$20),
则 $20A5 即为操作数的实际地址;然后将$20A5送程序计数器PC,CPU随即就转向PC内容所指的单元($20A5单元)去执行命令。
9、先变址(X)间接寻址(IND,X)
它是零页X变址和间接寻址两种方式的结合。分如下几步:
- 以X作为变址寄存器,将零页中的基地址IND和X中的内容相加得到(IND+X)
- 以(IND+X)作为间接地址,从(IND+X)单元和(IND+X+1单元)中取出操作数的有效地址
例如:(假设X为$02)
LDA ($0A,X)
解释:
- 找到间接地址:$0A+$02->$0C
- 从$0C 和 $0D($0C+1得到的)中分别取出有效地址,作为实际存放数据的低八位($EE)和高八位($0F)
- 将操作数实际存放地址$0FEE中的内容取出来送累加器A中。
10、后变址(Y)间接寻址((IND),Y)
这是间接寻址和绝对Y变址方法相结合的一种寻址方式。又称为:先间接寻址后绝对Y变址。
例如:
LDA ($08),Y
解释:
- 假设$08单元中内容为 $35,$09单元中内容为$0F,Y的内容为$02
- 先间接寻址,首先存指定的零页地址$08和$08+1单元中分别取出他们的内容合并为一个16地址 $0F35.
- 再绝对Y变址,获取$0F35+$02->$0F37,即此操作数存放的有效地址。
- 最后从有效地址中取出送累加器A中。
11、相对寻址
哦吼,没看懂。。。。
二、总结
这么多的寻址方式只是为了让程序执行速度更快,内存少的目的。
- 一般来说,累加器寻址和隐含寻址是最快的,因为操作数是在CPU的内部寄存器中,取操作数不必要范围存储器,所以执行速度快。
- 零页寻址占用内存少,执行速度快。所以监控程序、BASIC解释程序以及DOS都大量使用零页寻址。
- 变址寻址方式常用语处理数据块。
- 间接寻址常用来存放专用程序的入口地址。
- 立即寻址常用语设置初始数据。