(不建议硬背下来,需要的时候来看就好)
(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