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