任天堂遊戲機CPU彙編指令集與暫存器
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
相關文章
- iOS彙編基礎(二)暫存器iOS
- 逆向學習筆記3——暫存器與彙編指令筆記
- 彙編基礎——常用暫存器及其用途
- 【彙編】計算機暫存器介紹計算機
- ARM彙編指令集彙總
- 除錯時檢視彙編和暫存器資料等除錯
- 常見暫存器以及常見彙編指令,常見爆破指令 goodGo
- CPU中跟蹤後繼指令地址的暫存器
- CS 暫存器 和 IP 暫存器
- 通過一段彙編,加深對暫存器ESP和EBP的理解
- 暫存器
- 自學C day03-CPU內部結構和暫存器
- 暫存器定址和暫存器間接定址的區別
- 組合語言學習筆記03——暫存器(CPU工作原理)組合語言筆記
- 程式分析與優化 - 8 暫存器分配優化
- 指令集彙總
- 為什麼Modbus的只讀暫存器被稱為“輸入暫存器(Input Registers)”而不是“輸出暫存器”
- C語言轉寫成MIPS指令集彙編以及MIPS指令集彙編中函式呼叫時棧的變化C語言函式
- iOS彙編教程(六)CPU 指令重排與記憶體屏障iOS記憶體
- 一口氣看完45個暫存器,CPU核心技術大揭祕
- CPU指令集SSE、AVX等
- 【STM32】【暫存器】暫存器位讀寫方式配置系統時鐘
- 在x86彙編中將暫存器設定為零的最佳方法是什麼:xor,mov或?
- CS、IP和PC暫存器
- Smali語法:Registers(暫存器)
- 【自學組合語言Day-02】第二章:暫存器(CPU工作原理)組合語言
- 任天堂Switch主機暫不支援存檔轉移 遊戲體驗不佳遊戲
- 暫存
- 新手分享_再談FS暫存器
- 暫存器::Vim進階索引[4]索引
- 客戶暫存器結構(轉)
- Git 暫存修改檔案 取消暫存Git
- Cisco 路由器暫存器配置[轉貼]路由器
- 計算機系統6-> 計組與體系結構3 | MIPS指令集(中)| MIPS彙編指令與機器表示計算機
- 編譯器如何生成彙編編譯
- CPU架構及指令集之研究架構
- 處理器核、Core、處理器、CPU區別&&指令集架構與微架構的區別&&32位與64位指令集架構說明架構
- 騰訊成立“任天堂合作部” 將負責任天堂Switch遊戲機在華代理遊戲