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