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