任天堂遊戲機CPU彙編指令集與暫存器

woodcol發表於2017-11-03

6502處理器暫存器組

6502中共有5個8位暫存器和1個16位暫存器 
1.累加暫存器A 
這是8位的暫存器,也是6502中最重要和最常用的暫存器,可用於讀寫資料,進行各種邏輯運算等等。 
2.變址暫存器X 
這個8位暫存器和A差不多,只是它可以非常方便地加1或減1,常用於資料傳送,運算等等3.變址暫存器Y 
和X一樣,2個變址暫存器搭配使用使程式更加靈活 
4.堆疊指標SP 
這是8位的暫存器,指向對棧棧頂位置 
在程式執行時。須要一稱之為堆疊的RAM塊作為資料緩衝區,以暫存程式執行過程中的一些重要資料 
堆疊由連續的RAM單元組成。資料寫入堆疊稱入棧,資料從堆疊中讀出稱為出棧,堆疊的操作遵循"先進後出"的操作,即先入棧的資料後出棧。 
系統如何瞭解當前的堆疊頂在哪以從頂部彈出堆疊呢? 
就要依靠堆疊指標SP,6502規定,堆疊位於第一頁($0100-$01ff)的RAM中,因此SP指向的時堆疊頂的低8位,即堆疊頂地址為$00SP,當進行入棧、出棧操作時,棧頂單元發生變化,SP的內容也將加1或減1 
可以用下面程式讀出當前SP的內容: 
TSX 
STX$2000 
RTS 
這時$2000即為SP的內容 
5.程式狀態字PSW(Program Status Word) 
這也是8位暫存器,用於寄存指令執行的狀態資訊,PSW的各位狀態有的是根據指令執行的結果由硬體自動設定的,有的可以由使用者用軟體的方法設定。PSW的各位如下(其中第5位未用,保持為0) 
7 6 5 4 3 2 1 0 
N V B D I Z C 
N:負數標誌,指令指行完後為負(>7F)則n=0,否則為1 
V:溢位標誌,若產生溢位則V=1,否則V=0 
I:中斷標誌。是否允許系統中斷IRQ,=1:禁止,=0:允許 
Z:零標誌,結果是否為0,為0則Z=1,否則Z=0 
C:進位標誌,結果最高位有進位則C=1,否則C=0 
5.程式計數器PC 
這是6502唯一的一個16為計數器,其內容為將要執行命令的存放地址,定址範圍達64KB($0000-$FFFF),CPU是根據PC的內容找到指令的儲存單元,取出指令執行的。PC具有自動加1的功能,CPU每讀取一條指令的1位元組,PC內容自動加1,指向下一個儲存單元,這樣就能實現程式的順序執行 
PC沒有地址,使用者不能對它進行讀寫,但可以通過轉移,呼叫,返回等指令改變其內容,以改變程式的執行順序 

以下為指令集

-------------------------------addr  :代表8位地址    addr16:代表16位地址     data  :立即數-------------------------------
資料傳送指令
LDA--由儲存器取數送入累加器 M→A

符號碼格式         指令操作碼       定址方式
LDA ($addr,X)           A1                       先變址X後間址
LDA $addr               A5                        零頁定址
LDA #$data              A9                        立即定址
LDA $addr16             AD                        絕對定址
LDA ($addr),Y           B1                        後變址Y間址
LDA $addr,X             B5                        零頁X變址
LDA $addr16,Y           B9                        絕對Y變址
LDA $addr16,X           BD                        絕對X變址

//LDX--由儲存器取數送入累加器 M→X

符號碼格式    指令操作碼      定址方式
LDX #$data          A2                     立即定址
LDX $addr            A6                     零頁定址
LDX $addr16        AE                     絕對定址
LDX $addr,Y         B6                     零頁Y變址
LDX $addr16,Y     BE                     絕對Y變址

//LDY--由儲存器取數送入累加器 M→Y

符號碼格式       指令操作碼     定址方式
LDY #$data             A0                     立即定址
LDY $addr               A4                     零頁定址
LDY $addr16           AC                    絕對定址
LDY $addr,X            B4                    零頁X變址
LDY $addr16,X        BC                    絕對X變址

//STA--將累加器的內容送入儲存器 A--M

符號碼格式         指令操作碼       定址方式
STA ($addr,X)           81                    先變址X後間址
STA $addr               85                    零頁定址
STA $addr16            8D                    絕對定址
STA ($addr),Y           91                    後變址Y間址
STA $addr,X             95                    零頁X變址
STA $addr16,Y           99                    絕對Y變址
STA $addr16,X           9D                   絕對X變址

//STX--將暫存器X的內容送入儲存器 X--M

符號碼格式     指令操作碼     定址方式
STX $addr             86                    零頁定址
STX $addr16         8E                    絕對定址
STX $addr,Y          96                    零頁Y變址

//STY--將暫存器Y的內容送入儲存器 Y--M

符號碼格式          指令操作碼          定址方式
STY $addr               84                              零頁定址
STY $addr16             8C                             絕對定址
STY $addr,X             94                             零頁X變址

//暫存器和暫存器之間的傳送

符號碼格式 操作碼     定址方式       指令作用
TAX               AA              暫存器定址     將累加器A的內容送入變址暫存器X
TXA               8A              暫存器定址     將變址暫存器X的內容送入累加器A
TAY               A8              暫存器定址     將累加器A的內容送入變址暫存器Y
TYA               98              暫存器定址     將變址暫存器Y的內容送入累加器A
TSX               BA              暫存器定址     將堆疊指標S的內容送入變址暫存器X
TXS               9A              暫存器定址     將變址暫存器X的內容送入堆疊指標S

算術運算指令

1. ADC--累加器,儲存器,進位標誌C相加,結果送累加器A  A+M+C→A

符號碼格式      指令操作碼      定址方式
ADC ($addr,X)        61                    先變址X後間址         
ADC $addr             65                    零頁定址
ADC #$data           69                    立即定址
ADC $addr16         6D                    絕對定址
ADC ($addr),Y       71                    後變址Y間址
ADC $addr,X          75                    零頁X變址
ADC $addr16,Y      79                    絕對Y變址
ADC $addr16,X      7D                    絕對X變址

注意:由於進位標誌C頁會參加運算,所以在做加法運算時,一般要在前面加指令 CLC,清除進位標誌

2. SBC--從累加器減去儲存器和進位標誌C,結果送累加器  A-M-C→A

符號碼格式       指令操作碼      定址方式
SBC ($addr,X)       E1              先變址X後間址
SBC $addr             E5              零頁定址
SBC #$data           E9              立即定址
SBC $addr16         ED              絕對定址
SBC ($addr),Y       F1           後變址Y間址
SBC $addr,X          F5              零頁X變址
SBC $addr16,Y      F9              絕對Y變址
SBC $addr16,X      FD              絕對X變址

注意:由於在做減法運算時,進位標誌C會參與運算,所以在做減法前要先加指令 SEC,置進位標誌

3. INC--儲存器單元內容增1  M+1→M

符號碼格式    指令操作碼  定址方式
INC $addr             E6              零頁定址
INC $addr16         EE              絕對定址
INC $addr,X          F6              零頁X變址
INC $addr16,X      FE              絕對X變址

4. DEC--儲存器單元內容減1  M-1→M

符號碼格式     指令操作碼     定址方式
DEC $addr            C6              零頁定址
DEC $addr16        CE              絕對定址
DEC $addr,X         D6              零頁X變址
DEC $addr16,X     DE              絕對X變址

5. 暫存器X,Y加1減1

符號碼格式 指令操作碼 定址方式
INX               E8              隱含定址
DEX              CA              隱含定址
INY               C8              隱含定址
DEY              88              隱含定址

邏輯運算指令

1.AND--暫存器與累加器相與,結果送累加器  A∧M→A

符號碼格式           指令操作碼          定址方式
AND ($addr,X)           21              先變址X後間址
AND $addr               25              零頁定址
AND #$data              29              立即定址
AND $addr16             2D              絕對定址
AND ($addr),Y           31              後變址Y間址
AND $addr,X             35              零頁X變址
AND $addr16,Y           39              絕對Y變址
AND $addr16,X           3D              絕對X變址

2.ORA--暫存器與累加器相或,結果送累加器  A∨M→A

符號碼格式          指令操作碼     定址方式
ORA ($addr,X)           01                 先變址X後間址
ORA $addr               05                 零頁定址
ORA #$data              09                 立即定址
ORA $addr16             0D                 絕對定址
ORA ($addr),Y           11                 後變址Y間址
ORA $addr,X             15                 零頁X變址
ORA $addr16,Y           19                 絕對Y變址
ORA $addr16,X           1D                 絕對X變址

3.EOR--暫存器與累加器相異或,結果送累加器  A≮M→A

符號碼格式        指令操作碼     定址方式
EOR ($addr,X)           41                     先變址X後間址
EOR $addr               45                     零頁定址
EOR #$data              49                     立即定址
EOR $addr16             4D                     絕對定址
EOR ($addr),Y           51                     後變址Y間址
EOR $addr,X             55                     零頁X變址
EOR $addr16,Y          59                     絕對Y變址
EOR $addr16,X           5D                     絕對X變址

置標誌位指令
1. CLC--清除進位標誌         0→C   機器碼 18   
2. SEC--置進位標誌C          1→C   機器碼 38    
3. CLD--清除十進位制運算標誌D  0→D   機器碼 D8    
4. SED--置十進位制運算標誌D    1→D   機器碼 F8   
5. CLV--清除溢位標誌V        0→V   機器碼 B8
6. CLI--清除中斷禁止指令I    0→I    機器碼 58   
7. SEI--置位中斷禁止標誌I    1→I    機器碼 78

比較指令
1. CMP--累加器和儲存器比較
符號碼格式       指令操作碼      定址方式
CMP ($addr,X)           C1                   先變址X後間址
CMP $addr               C5                   零頁定址
CMP #$data              C9                   立即定址
CMP $addr16           CD                   絕對定址
CMP ($addr),Y          D1                   後變址Y間址
CMP $addr,X            D5                   零頁X變址
CMP $addr16,Y        D9                   絕對Y變址
CMP $addr16,X        DD                   絕對X變址

2. CPX--暫存器X的內容和儲存器比較
符號碼格式   指令操作碼 定址方式
CPX #$data        E0            立即定址
CPX $addr          E4            零頁定址
CPX $addr16      EC            絕對定址

3. CPY--暫存器Y的內容和儲存器比較
符號碼格式        指令操作碼    定址方式
CPY #$data              C0                   立即定址
CPY $addr               C4                  零頁定址
CPY $addr16            CC                  絕對定址

移位指令
1. 算術左移指令ASL
符號碼格式      指令操作碼 定址方式
ASL                     0A               累加器定址
ASL $data             06               零頁定址
ASL $addr16         0E               絕對定址
ASL $addr,X         16               零頁X變址
ASL $addr16,X     1E               絕對X變址

2. 邏輯右移指令LSR

符號碼格式   指令操作碼   定址方式
LSR                    4A               累加器定址
LSR $data          46               零頁定址
LSR $addr16      4E               絕對定址
LSR $addr,X       56               零頁X變址
LSR $addr16,X    5E               絕對X變址

3. 迴圈左移指令ROL

符號碼格式        指令操作碼     定址方式
ROL                     2A                      累加器定址
ROL $data               26                       零頁定址
ROL $addr16           2E                       絕對定址
ROL $addr,X            36                       零頁X變址
ROL $addr16,X        3E                       絕對X變址
ROL的移位功能是將位元組內容連同進位C一起依次向左移1位

4. 迴圈右移指令ROR
符號碼格式      指令操作碼         定址方式
ROR                     6A                           累加器定址
ROR $data             66                            零頁定址
ROR $addr16         6E                            絕對定址
ROR $addr,X          76                            零頁X變址
ROR $addr16,X      7E                            絕對X變址
ROR的移位功能是將位元組內容連同進位C一起依次向右移1位

堆疊操作指令
1. 累加器進棧指令 PHA    機器碼 48
2. 累加器出棧指令 PLA    機器碼 68

跳轉指令
1. JMP--無條件轉移指令
符號碼格式     指令操作碼     定址方式
JMP  $data16        4C                   絕對定址
JMP ($data16)      5C                   間接定址
2. 條件轉移指令
符號碼格式    操作碼          定址方式               指令功能
BEQ $data16      F0               相對定址              如果標誌位Z=1則轉移,否則繼續
BNE $data16      D0               相對定址              如果標誌位Z=0則轉移,否則繼續
BCS $data16      B0               相對定址              如果標誌位C=1則轉移,否則繼續
BCC $data16      90               相對定址              如果標誌位C=0則轉移,否則繼續
BMI $data16      30               相對定址              如果標誌位N=1則轉移,否則繼續
BPL $data16      10               相對定址              如果標誌位N=0則轉移,否則繼續
BVS $data16      70               相對定址              如果標誌位V=1則轉移,否則繼續
BVC $data16      50               相對定址              如果標誌位V=0則轉移,否則繼續

3. 轉移到子程式指令JSR和從主程式返回指令RTS

JSR指令僅僅是 絕對定址,它的操作碼是 20
       RTS指令是     隱含定址,它的操作碼是 60

我的網站,有興趣的可以去看看,寫點東西,給我拉拉人氣:http://www.k557.com/bbs/forum.php?gid=59

www.k557.com

www.k557.com/bbs

相關文章