6502 常用指令速查手册
适用于 NES (FC) 开发,配合 ca65 汇编器使用
6502 共 56 条指令,本文收录开发中最常用的 ~40 条,按功能分类
目录
寄存器与命名规律
数据传送指令
算术运算指令
逻辑运算指令
比较与分支指令
移位指令
跳转与子程序
栈操作指令
标志位操作指令
寻址方式速查
常见组合模式
1. 寄存器与命名规律 寄存器总览 6502 只有 6 个寄存器——正是这种极简设计让 NES 的 CPU 高效而强大:
寄存器
全称
位数
作用
A
Accumulator 累加器
8
唯一的通用运算寄存器,数据中转站
X
Index 变址寄存器
8
循环计数、数组下标
Y
Index 变址寄存器
8
第二个变址寄存器,配合间接寻址
S
Stack Pointer 栈指针
8
指向硬件栈顶($0100-$01FF)
PC
Program Counter 程序计数器
16
下一条指令的地址
P
Processor Status 状态寄存器
8
标志位集合(N V - B D I Z C)
累加器 A —— 数据中转站 一切算术/逻辑运算只能在 A 中进行 ;内存之间不能直接传送数据,必须经过 A:
1 2 3 4 lda $10 clc adc #$05 ; A = A + 5 (在A中运算) sta $20
变址寄存器 X / Y —— 计数器与下标 两个独立的 8 位寄存器,三大用途:
1 2 3 4 5 6 7 8 9 10 11 12 ldx #$00 ; X = 0 loop: inx cpx #$10 ; 到 16 了吗? bne loop lda ARRAY,x lda (ptr),y
X/Y 功能基本相同。惯例:X 做数组下标,Y 配合 (zp),Y 寻址 。
栈指针 S —— 硬件栈管理员
6502 硬件栈固定在内存 $0100-$01FF(256 字节)
S 保存栈顶位置的低字节(高字节恒为 $01)
栈向下增长:压栈 S 减 1,出栈 S 加 1
JSR/RTS/PHA/PLA/中断自动操作栈,无需手动管理
开机必须初始化:
程序计数器 PC —— 执行位置跟踪器
16 位寄存器,永远指向”下一条要执行的指令”
顺序执行时自动递增(按指令长度)
所有跳转的本质都是修改 PC:
操作
对 PC 的影响
顺序执行
自动 + 指令长度
JMP $C000
PC ← $C000
JSR / RTS
返回地址入栈 / 出栈
BNE loop
条件成立时 PC ← loop
状态寄存器 P —— 标志位集合 P 的每一位是独立的标志,运算指令自动设置它们,分支指令根据它们决定跳转:
位
标志
名称
置 1 的条件
7
N
Negative 负数
结果最高位为 1(负数)
6
V
oVerflow 溢出
有符号运算溢出
5
—
(未用)
恒为 1
4
B
Break
BRK 软中断指令
3
D
Decimal 十进制
BCD 模式(NES 不用,开机 CLD 清 0)
2
I
Interrupt 中断禁止
IRQ 禁用(SEI 置 1 / CLI 清 0)
1
Z
Zero 零
结果为 0
0
C
Carry 进位
加法进位 / 减法无借位 / 移位移出
条件分支的硬件基础 ——CMP 比较后看 Z 和 C 标志:
1 2 3 4 5 lda #$05 cmp #$03 ; 计算 5-3 (只设标志): 结果2 → Z=0, C=1 beq equal bcc less
指令命名规律 1 2 3 4 5 6 7 动词缩写 + 寄存器/对象 LD = LoaD 读入 ST = STore 写出 T = Transfer 寄存器传送 AD = ADd 加法 SB = SuBtract 减法 CP = ComPare 比较 IN = INcrement 加1 DE = DEcrement 减1 J = Jump 跳转 R = Return 返回
例:LDA = L oaD A ccumulator(装入累加器)
2. 数据传送指令 最常用的指令组,占程序中大部分篇幅。
LDA / LDX / LDY — 读入
指令
全称
作用
LDA
L oaD A ccumulator
累加器 A ← 数据
LDX
L oaD X register
变址寄存器 X ← 数据
LDY
L oaD Y register
变址寄存器 Y ← 数据
1 2 3 4 5 lda #$0A ; A = 10 (立即寻址: 数值本身) lda $10 lda $8000 ldx #$00 ; X = 0 ldy #$20 ; Y = $20
STA / STX / STY — 写出
指令
全称
作用
STA
ST ore A ccumulator
内存 ← 累加器 A
STX
ST ore X register
内存 ← 变址寄存器 X
STY
ST ore Y register
内存 ← 变址寄存器 Y
1 2 3 4 sta $10 sta $2007 stx $00 sty $01
注意 :LDA/STA 没有”立即寻址的 STA”——立即数只能作为源,不能作为目标
TAX / TXA / TAY / TYA — 寄存器间传送
指令
全称
作用
TAX
T ransfer A to X
X ← A
TXA
T ransfer X to A
A ← X
TAY
T ransfer A to Y
Y ← A
TYA
T ransfer Y to A
A ← Y
TSX / TXS — 栈指针传送
指令
全称
作用
TSX
T ransfer S to X
X ← 栈指针 S
TXS
T ransfer X to S
栈指针 S ← X
3. 算术运算指令 所有运算都在累加器 A 中进行。
ADC — 带进位加法 ADC = AD d with C arry
1 2 3 clc lda #$05 adc #$03 ; A = 5 + 3 + 0 = 8
SBC — 带借位减法 SBC = S uB tract with C arry
1 2 3 sec lda #$05 sbc #$03 ; A = 5 - 3 = 2
易错点 :6502 减法前要 SEC(不是 CLC),因为 C=1 表示”无借位”
16 位加减法(进位链接高低字节) 1 2 3 4 5 6 7 8 9 10 11 inc $0200 bne @done inc $0201 @done: clc adc #$00 ; 低字节相加 tax lda $01
INC / DEC — 内存加1/减1
指令
全称
作用
INC
INC rement
内存值 +1
DEC
DEC rement
内存值 -1
INX / INY / DEX / DEY — 寄存器加1/减1
指令
全称
作用
INX
IN crement X
X += 1
INY
IN crement Y
Y += 1
DEX
DE crement X
X -= 1
DEY
DE crement Y
Y -= 1
1 2 3 4 5 6 ldx #$00 loop: inx cpx #$10 ; 到16了吗? bne loop
4. 逻辑运算指令 按位运算,结果放回累加器。
指令
全称
作用
示例
AND
logical AND
按位与
and #$80 取最高位
ORA
OR A ccumulator
按位或
ora #$01 置最低位
EOR
E xclusive OR
按位异或
eor #$FF 全部位取反
1 2 3 4 5 6 7 lda $2002 and #$80 ; 只保留bit7 (VBlank标志) → A = 0或$80 beq not_vblank lda #$0F ora #$30 ; A = $3F (置位bit4,5) eor #$FF ; A = $C0 (取反)
BIT — 位测试 BIT = 位测试,测试内存与累加器的公共位,不改变 A 。
1 2 3 lda #$80 bit $2002 bpl wait
5. 比较与分支指令 CMP / CPX / CPY — 比较
指令
全称
作用
CMP
CMP are A
A 与操作数比较
CPX
C omP are X
X 与操作数比较
CPY
C omP are Y
Y 与操作数比较
比较即做减法(A - 操作数)但不保存结果 ,只设置标志位:
1 2 3 4 5 lda $10 cmp #$0A ; A 与 10 比较
分支指令(相对跳转,范围 ±127 字节)
指令
全称
跳转条件
BEQ
B ranch if E qual
Z=1(相等/为零)
BNE
B ranch if N ot E qual
Z=0(不等/非零)
BCS
B ranch if C arry S et
C=1(≥/无借位)
BCC
B ranch if C arry C lear
C=0(</有借位)
BMI
B ranch if M inus
N=1(负数)
BPL
B ranch if P lus
N=0(正数/零)
BVS
B ranch if oV erflow S et
V=1(溢出)
BVC
B ranch if oV erflow C lear
V=0(无溢出)
比较后的分支组合(最常用) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 cmp #$0A beq equal cmp #$0A bcc less cmp #$0A bcs greater_equal cmp #$0B bcs greater lda $10 bne nonzero cpx #$10 beq same
6. 移位指令 对累加器或内存单字节操作。
指令
全称
作用
ASL
A rithmetic S hift L eft
左移1位,bit0补0,bit7→C
LSR
L ogical S hift R ight
右移1位,bit7补0,bit0→C
ROL
RO tate L eft
循环左移,C→bit0,bit7→C
ROR
RO tate R ight
循环右移,C→bit7,bit0→C
1 2 3 4 5 6 lda #$05 asl asl lda #$10 lsr
用途 :乘除 2 的幂、逐位检测、乘法算法的核心。
7. 跳转与子程序
指令
全称
作用
JMP
J uMP
无条件跳转(绝对地址)
JSR
J ump to S ubR outine
调用子程序(返回地址入栈)
RTS
R eT urn from S ubroutine
子程序返回(地址出栈)
RTI
R eT urn from I nterrupt
中断返回
1 2 3 4 5 6 7 8 9 main: jsr init_ppu jsr draw_screen forever: jmp forever init_ppu: rts
JSR/RTS 是 6502 的函数调用机制 :JSR 把返回地址压入硬件栈,RTS 弹出并跳回。
8. 栈操作指令 6502 硬件栈固定在内存 $0100-$01FF,栈指针 S 从 $FF 递减。
指令
全称
作用
PHA
PH ush A ccumulator
A 入栈
PLA
PL ull A ccumulator
A 出栈
PHP
PH ush P rocessor status
状态寄存器入栈
PLP
PL ull P rocessor status
状态寄存器出栈
注意 :6502 栈只能直接操作 A 和标志位,X/Y 不能入栈(需经 TAX→PHA 间接保存)
9. 标志位操作指令 状态寄存器 P 的标志位:C arry、Z ero、I nterrupt、D ecimal、oV erflow、N egative
指令
全称
作用
CLC
CL ear C arry
C=0(加法前)
SEC
SE t C arry
C=1(减法前)
CLI
CL ear I nterrupt
允许IRQ中断
SEI
SE t I nterrupt
禁止IRQ中断
CLD
CL ear D ecimal
关闭BCD模式(NES必做)
SED
SE t D ecimal
开启BCD模式(NES不用)
CLV
CL ear oV erflow
V=0
10. 寻址方式速查 同一指令配合不同寻址方式,是 6502 汇编的核心。
寻址方式
语法示例
含义
速度
立即寻址
lda #$0A
数值 10 本身
快
零页寻址
lda $10
读内存 $0010
最短
零页,X
lda $10,x
读内存 $0010+X
快
绝对寻址
lda $8000
读内存 $8000
中
绝对,X
lda $8000,x
读内存 $8000+X
慢
绝对,Y
lda $8000,y
读内存 $8000+Y
慢
间接索引
lda ($10),y
读”指针$10指向的地址+Y”
慢但灵活
隐含寻址
txs / rts
操作数隐含
最快
相对寻址
bne loop
跳转 ±127 字节内
快
间接寻址
jmp ($1000)
跳到”指针指向的地址”
仅JMP
1 2 3 4 5 6 7 8 9 lda #<mydata ; 指针低字节 sta $10 lda #>mydata ; 指针高字节 sta $11 ldy #$00 lda ($10 ),y iny lda ($10 ),y
11. 常见组合模式 模式 1:变量赋值(BASIC: A = 10) 1 2 lda #$0A ; 常量进累加器 sta VAR_A
模式 2:变量运算(BASIC: A = A + 5) 1 2 3 4 lda VAR_A clc adc #$05 ; +5 sta VAR_A
模式 3:循环 256 次 1 2 3 4 5 ldx #$00 loop: inx bne loop
模式 4:等待硬件状态(轮询 VBlank) 1 2 3 wait: bit $2002 bpl wait
模式 5:数组遍历(零页指针) 1 2 3 4 5 6 7 8 9 10 11 lda #<array sta $10 lda #>array sta $11 ldy #$00 loop: lda ($10 ),y iny cpy #$10 ; 处理16个 bne loop
模式 6:16位比较 1 2 3 4 5 6 7 lda $11 cmp #$00 bne done lda $10 cmp #$0A done:
附:完整指令集分类总表
类别
指令
传送
LDA LDX LDY STA STX STY TAX TXA TAY TYA TSX TXS
算术
ADC SBC INC DEC INX INY DEX DEY
逻辑
AND ORA EOR BIT
移位
ASL LSR ROL ROR
比较
CMP CPX CPY
分支
BEQ BNE BCS BCC BMI BPL BVS BVC
跳转
JMP JSR RTS RTI
栈
PHA PLA PHP PLP
标志
CLC SEC CLI SEI CLD SED CLV
其他
NOP BRK
参考:6502 指令集完整参考 · NESdev Wiki