6502组合语言/内存定址模式
内存定址模式
编辑6502处理器有十三种定址模式,以下是一些范例。
累加器定址:A
累加器(Accumulator)做为隐含算子(operand),所以不需要定址。
范例
使用ASL(算术左移,Arithmetic Shift Left)指令可以使累加器的值左移。这个指令直接指定使用累加器,故指令没有算子,就像是算子被藏起来一样。这种做法即称为“隐含(implied)”。
ASL
隐含定址:i
这个算子是隐含的,不需要在指令中定出来。
范例
这个指令用来将X暂存器的值传到累加器。这里隐含了X暂存器。
TXA
立即定址(Immediate): #
这个算子用来直接将值放进累加器。
范例
将值$22载入累加器。
LDA #$22
绝对定址(Absolute): a
指定完整的16位元位址,并将其中的字节值载入累加器。
范例
将位址$D010的值$33载入累加器。
LDA $D010
零页定址(Zero Page): zp
在最底下的内存页($00xx,即第0页),可以只用一个字节(8位元)来指定位址,并将该位址内的值载入累加器。
范例
将位址$0002的值$B3载入累加器。
LDA $02
相对定址(Relative): r
将编移值(offset)与存在程式计数暂存器(Program Counter,PC)中的目前位址值相加并填回。
范例
将编移值$2D与存在程式计数暂存器中的目前位址值$C12D相加,新的位址值成为$C12D。
BPL $2D
X绝对索引定址(Absolute Indexed with X): a,x
将X暂存器的值与指定的位址值相加。再将位址和当做一个新的位址,将这个位址内的值载入累加器。
范例
将X暂存器的值$02与位址值$0001相加,成为位址和$0003。再将新位址$0003内的值$5A载入累加器。
LDA $0001,X
Y绝对索引定址(Absolute Indexed with Y): a,y
将Y暂存器的值与指定的位址值相加。再将位址和当做一个新的位址,将这个位址内的值载入累加器。
范例
将Y暂存器的值$03与位址值$0001相加,成为位址和$0004。再将新位址$0004内的值$EF载入累加器。
LDA $0001,Y
X零页索引定址(Zero Page Indexed with X): zp,x
将X暂存器的值与指定的位址值(只限为第零页位址)相加。再将位址和当做一个新的位址,将这个位址内的值载入累加器。
范例
将X暂存器的值$02与位址值$01相加,成为位址和$03。再将新位址$0003内的值$5A载入累加器。
LDA $01,X
Y零页索引定址(Zero Page Indexed with Y): zp,y
将Y暂存器的值与指定的位址值(只限为第零页位址)相加。再将位址和当做一个新的位址,将这个位址内的值载入累加器。
范例
将Y暂存器的值$03与位址值$01相加,成为位址和$04。再将新位址$0004内的值$EF载入累加器。
LDA $01,Y
绝对索引间接定址(Absolute Indexed Indirect): (a,x)
将X暂存器的值与指定的位址值相加。再将位址和当做一个新的位址,将这个位址内的值与下一个位址内的值一起载入(程式计数暂存器)并跳跃。这个定址模式只能支援JMP指令。
范例
将X暂存器的值$02与位址值$0001相加,成为位址和$0003。再将新位址$0003与下一个位址$0004内的值$EF5A载入并跳跃。
JMP ($0001,X)
零页索引间接定址(Zero Page Indexed Indirect): (zp,x)
将X暂存器的值与指定的位址值(只限为第零页位址)相加。再将位址和当做一个新的位址,将这个位址内的值与下一个位址内的值一起载入。这个载入的位址再当做一个新的位址,将这个新位址内的值载入累加器。
范例
将X暂存器的值$02与位址值$15相加,成为位址和$17。再将新位址$0017与下一个位址$0018内的值$D010当作新位址,将新位址内的值$33载入累加器。
LDA ($15,X)
零页间接Y索引定址Zero Page Indirect Indexed with Y: (zp),y
将指定的位址值与下一个位址值(均只限为第零页位址)当做一个新的位址,将这个位址内的值与Y暂存器的值相加。再将位址和当做一个新的位址,将这个新位址内的值载入累加器。
范例
将位址值$002A与$002B中的值$C235当做一个新的位址值,与Y暂存器的值$03相加,成为位址和$C238。再将新位址$C238中的值$2F载入累加器。
LDA ($2A),Y