(不建议硬背下来,需要的时候来看就好)
(LDA指令的功能是将数据读入A寄存器)
零页寻址使用单个8位操作数,这种方法更快速,同时能缩短指令的长度。(对于空间极小的NES很有必要)
示例:LDA $12,将位于内存$0012处存放的数据读入A中。
零页相对寻址采用单个操作数,并将寄存器的值加上该操作数中,以在零页中提供可在其中找到数据的地址。其有两种形式:
注意:操作数与寄存器的值相加后得到的真实地址仍然是8位数。
直接寻址使用16位操作数(其实是两个8位操作数)进行寻址。
零页相对寻址的16位版本。
间接寻址使用16位操作数。系统先读取操作数对应地址的数据,再读取操作数+1对应地址的数据,将两个数据视为16位真实地址,再根据真实地址寻址。差不多相当于寻址两次。在6502中只有JMP使用相对寻址,举例:JMP ($1234),地址$1234处存放着$41,地址$1235处存放着$FB,那么真实地址是$FB41,程序跳转到$FB41处。
一些指令不需要寻址。
一些指令虽然没有操作数,但它实际上操作着累加器(A寄存器)中的数据。
直接将操作数当做寻址结果。如LDA #$45将$45读入A中。前边带有#的数称为立即数。
LDA ($12, X),将$12+X处存放的地址对应位置存放的数据读入A中。
LDA ($12), X,将$12处存放的数据加上X的值作为真实地址,将真实地址处存放的数据读入A中。
(寻址真是汇编语言中的噩梦…但是理解了就很简单)
LDA(LoaD Accumulator with memory),功能是将数据读入A寄存器。
影响负数位和零位。
| 助记符 | 寻址方式 | 操作码 |
|---|---|---|
| LDA | #aa | A9 |
| LDA | $aa | A5 |
| LDA | $aa,X | B5 |
| LDA | $aaaa | AD |
| LDA | $aaaa,X | BD |
| LDA | $aaaa,Y | B9 |
| LDA | ($aa,X) | A1 |
| LDA | ($aa),Y | B1 |
和LDA相同,但是操作的寄存器是X或Y。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| LDX | #aa | A2 |
| LDX | $aa | A6 |
| LDX | $aa,Y | B6 |
| LDX | $aaaa | AE |
| LDX | $aaaa,Y | BE |
| LDY | #aa | A0 |
| LDY | $aa | A4 |
| LDY | $aa,X | B4 |
| LDY | $aaaa | AC |
| LDY | $aaaa,X | BC |
STA(STore Accumulator in memory),功能是将A中的数据写入对应内存。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| STA | $aa | 85 |
| STA | $aa,X | 95 |
| STA | $aaaa | 8D |
| STA | $aaaa,X | 9D |
| STA | $aaaa,Y | 99 |
| STA | ($aa,X) | 81 |
| STA | ($aa),Y | 91 |
类似STA。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| STX | $aa | 86 |
| STX | $aa,Y | 96 |
| STX | $aaaa | 8E |
| STY | $aa | 84 |
| STY | $aa,X | 94 |
| STY | $aaaa | 8C |
TAX(Transfer Accumulator to X),功能是将A的数据复制到X中,其他的以此类推。
影响负数位和零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| TAX | AA | |
| TAY | A8 | |
| TSX | BA | |
| TXA | 8A | |
| TXS | 9A | |
| TYA | 98 |
PHA(PusH A),A入栈。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| PHA | 48 |
状态寄存器入栈。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| PHP | 08 |
PLA(PuLl A from stack),A出栈。(为啥不是pop呢)
影响负数位和零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| PLA | 68 |
状态寄存器出栈。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| PLP | 28 |
将数据和A中的数据进行与运算,结果保存在A中。
影响负数位和零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| AND | #aa | 29 |
| AND | aa | 25 |
| AND | aa,X | 35 |
| AND | aaaa | 2D |
| AND | aaaa,X | 3D |
| AND | aaaa,Y | 39 |
| AND | (aa,X) | 21 |
| AND | (aa),Y | 31 |
将数据和A中的数据进行异或运算,结果保存在A中。
影响负数位和零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| EOR | #aa | 49 |
| EOR | $aa | 45 |
| EOR | $aa,X | 55 |
| EOR | $aaaa | 4D |
| EOR | $aaaa,X | 5D |
| EOR | $aaaa,Y | 59 |
| EOR | ($aa,X) | 41 |
| EOR | ($aa),Y | 51 |
将数据和A中的数据进行或运算,结果保存在A中。
影响负数位和零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| ORA | #aa | 09 |
| ORA | $aa | 05 |
| ORA | $aa,X | 15 |
| ORA | $aaaa | 0D |
| ORA | $aaaa,X | 1D |
| ORA | $aaaa,Y | 19 |
| ORA | ($aa,X) | 01 |
| ORA | ($aa),Y | 11 |
ADC(ADd to accumulator with Carry),将数据与C位一同与A相加,结果保存在A中。
影响负数位,零位,进位,溢出位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| ADC | #aa | 69 |
| ADC | aa | 65 |
| ADC | aa,X | 75 |
| ADC | aaaa | 6D |
| ADC | aaaa,X | 7D |
SBC(SuBtract from accumulator with Carry),A的值减去数据再减去NOT C。
影响负数位,零位,进位,溢出位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| SBC | #aa | E9 |
| SBC | $aa | E5 |
| SBC | $aa,X | F5 |
| SBC | $aaaa | ED |
| SBC | $aaaa,X | FD |
| SBC | $aaaa,Y | F9 |
| SBC | ($aa,X) | E1 |
| SBC | ($aa),Y | F1 |
使某内存处的数据自减1。
影响负数位和零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| DEC | aa | C6 |
| DEC | aa,X | D6 |
| DEC | aaaa | CE |
| DEC | aaaa,X | DE |
X–,Y–。
影响负数位和零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| DEX | CA | |
| DEY | 88 |
使某内存处的数据自加1。
影响负数位和零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| INC | $aa | E6 |
| INC | $aa,X | F6 |
| INC | $aaaa | EE |
| INC | $aaaa,X | FE |
X++,Y++。
影响负数位和零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| INX | E8 | |
| INY | C8 |
ASL(Arithmatic Shift Left),算术左移。就是普通左移位。
影响负数位,进位,零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| ASL | A | 0A |
| ASL | aa | 06 |
| ASL | aa,X | 16 |
| ASL | aaaa | 0E |
| ASL | aaaa,X | 1E |
LSR(Logical Shift Right),逻辑右移。将数据右移,左边空出来的位补0。
影响负数位,进位,零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| LSR | A | 4A |
| LSR | $aa | 46 |
| LSR | $aa,X | 56 |
| LSR | $aaaa | 4E |
| LSR | $aaaa,X | 5E |
左旋。
影响负数位,进位,零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| ROL | A | 2A |
| ROL | $aa | 26 |
| ROL | $aa,X | 36 |
| ROL | $aaaa | 2E |
| ROL | $aaaa,X | 3E |
右旋。
影响负数位,进位,零位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| ROR | A | 6A |
| ROR | $aa | 66 |
| ROR | $aa,X | 76 |
| ROR | $aaaa | 6E |
| ROR | $aaaa,X | 7E |
跳转指令中以B开头的系列指令只能跳转至当前指令位置周围-128~127的范围。这些指令只有一个8位操作数,表示内存地址偏移值。JMP和JSR则是直接跳转到操作数指明的位置。
BCC(Branch on Carry Clear),当进位为0时发生程序分支(即跳转)。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| BCC | aa | 90 |
BCS(Branch on Carry Set),当进位为1时跳转。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| BCS | aa | B0 |
BEQ(Branch on EQual),当零位为1时跳转。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| BEQ | aa | F0 |
BMI(Branch on result MInus),当负数位为1时发生跳转。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| BMI aa | 30 |
BNE(Branch on Not Equal),当零位为0时跳转。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| BNE | aa | D0 |
BPL(Branch on result PLus),当负数位为0时跳转。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| BPL | aa | 10 |
BVC(Branch on oVerflow Clear),当溢出位为0时跳转。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| BVC | aa | 50 |
BVS(Branch on oVerflow Set),当溢出位为1时跳转。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| BVS | aa | 70 |
直接跳转。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| JMP | $aaaa | 4C |
| JMP | ($aaaa) | 6C |
JSR(Jump to SubRoutine),跳转至子过程。和JMP一样,但是执行时会将PC入栈。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| JSR | $aaaa | 20 |
RTI(ReTurn from Interrupt),从中断返回。此指令将PC和状态寄存器从栈中弹出。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| RTI | 40 |
RTS(ReTurn from Subroutine),从子过程返回,功能是从栈中弹出PC。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| RTS | 60 |
该指令用于与A测试相关数据位。
取数据与A的与运算为结果,将结果的第7位赋予负数位,第6位赋予溢出位。还会根据结果设置零位。
A中的数据和内存中的数据不会受到影响。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| BIT | aa | 24 |
| BIT | aaaa | 2C |
将数据和A中的数据比较。取A减去数据的值为结果,然后根据结果设置负数位、零位、进位。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| CMP | #aa | C9 |
| CMP | aa | C5 |
| CMP | aa,X | D5 |
| CMP | aaaa | CD |
| CMP | aaaa,X | DD |
| CMP | aaaa,Y | D9 |
| CMP | (aa,X) | C1 |
| CMP | (aa),Y | D1 |
如同CMP,但是相关的寄存器是X或者Y。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| CPX | #aa | E0 |
| CPX | aa | E4 |
| CPX | aaaa | EC |
| CPY | #aa | C0 |
| CPY | aa | C4 |
| CPY | aaaa | CC |
CLC(CLear Carry)将进位设为0,SEC(SEt Carry)将进位设为1,其余指令以此类推。
| 助记符 | 寻址方式 | 操作码 |
|---|---|---|
| CLC | 18 | |
| CLD | D8 | |
| CLI | 58 | |
| CLV | B8 | |
| SEC | 38 | |
| SED | F8 | |
| SEI | 78 |
BRK(BReaK)指令可引发IRQ中断。参见CPU中断。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| BRK | 00 |
No OPeration,该指令什么都不做。
| 助记符 | Addressing Mode | 操作码 |
|---|---|---|
| NOP | EA |
上一篇:CPU
下一篇:PPU