菜单

6502 CPU汇编语言指令集

2015年11月25日 - 杂谈

最近在玩汇编语言,找到这份6502 CPU(APPLE I使用的CPU)的指令集,整理了一下,以便随时查阅。

概要

6502有16位(64K)的地址空间分成256个页面,每个256字节。
0 页面($0000-$00FF) 有一些很特别的性质,例如寻址模式,它是非常重要的。
1 页面($0100-$01FF) 是堆栈。
$FFFA-$FFFB字节是NMIB中断向量。
$FFFC-$FFFD字节是复位向量。
$FFFE-$FFFF字节是IRQ/BRK向量。

6502有3个寄存器栈指针标志位(P)程序计数器
寄存器是累加器(A)X变址寄存器,和Y变址寄存器,每一个都是8位的,大多数指令把结果留在累加器里;
栈指针是一个8位的寄存器用来指示栈(1 页面)的偏移量,当使用push和pull指令时它自动增加和减少,你也可以用TSX和TXS指令直接访问和修改它的值。

P标志包含下面这些占用1个位的标志:

标志 名称 作用
N 符号 – Negative 当操作结果高位被设置(为负),该位被设置,否则被清除
V 溢出 – Overflow 当操作发生借位或进位时,该位被设置
B 中断 – Break 遇到‘BRK’指令时,该位被设置
D 十进制 – Decimal 当该位被设置时,所以的算术操作都是BCD (例如:09+01=10)。当该位被清除时,所有的算术操作都是以二为补码的二进制 (例如: 09+01=0A)
I 中断禁止 – Interrupt Disable 当该位被设置时,不会发生中断
Z 零 – Zero 当操作结果为零时,该位被设置。否则被清除
C 进位 – Carry 当发生进位时,该位被设置

这些位按这个顺序排列(从7 [最高]到0 [最低]): NV-BDIZC

指令集

助记符 描述 表达式 标志
读取(load)&储存(store)指令
LDA load accumulator – 将数据读入累加器 A<–M NZ
LDX load X index – 将数据读入变址寄存器X X<–M NZ
LDY load Y index – 将数据读入变址寄存器Y Y<–M NZ
STA store accumulator – 储存累加器的数据 M<–A
STX store X index – 储存变址寄存器X的数据 M<–A
STY store Y index – 储存变址寄存器Y的数据 M<–A
STZ store zero – 储存零 M<–0
堆栈操作
PHA push accumulator – 累加器入栈 Stack<–A
PHX push X index – 变址寄存器X入栈 Stack<–X
PHY push Y index – 变址寄存器Y入栈 Stack<–Y
PHP push processor flags – 标志位P入栈 Stack<–P
PLA pull (pop) accumulator – 累加器出栈 A<–Stack NZ
PLX pull (pop) X index – 变址寄存器X出栈 X<–Stack NZ
PLY pull (pop) Y index – 变址寄存器Y出栈 Y<–Stack NZ
PLP pull (pop) processor flags – 标志位P出栈 P<–Stack All
TSX transfer stack pointer to X – 传送栈指针到X X<–S NZ
TXS transfer X to stack pointer – 传送X到栈指针 S<–X
递增(increment)&  递减(decrement)操作
INA increment accumulator累加器递增 A++ NZ
INX increment X index变址寄存器X递增 X++ NZ
INY increment Y index变址寄存器Y递增 Y++ NZ
DEA decrement accumulator累加器递减 A– NZ
DEX decrement X index变址寄存器X递减 X– NZ
DEY decrement Y index变址寄存器Y递减 Y– NZ
INC increment memory location指定的内存单元递增 M++ NZ
DEC decrement memory location指定的内存单元递减 M– NZ
移位操作
ASL arithmetic shift left, high bit into carry算术左移,高位移入进位标志 C<–A7,A<–(A<<1) NZC
LSR logical shift right, low bit into carry逻辑右移,低位移入进位标志 C<–A0,A<–(A>>1) N=0 ZC
ROL rotate left through carry通过进位标志循环左移 C<–A7,A<–((A<<1)+C) NZC
ROR rotate right through carry通过进位标志循环右移 C<–A0,A<–(A7=C+(A>>1)) NZC
逻辑操作
AND and accumulator与累加器 A<–A&M NZ
ORA or accumulator或累加器 A<–A|M NZ
EOR exclusive-or accumulator异或累加器 A<–A^M NZ
BIT test bits against accumulator测试累加器的某个位(1) Z<–!(A&M),N<–M7,V<–M6 N=M7 V=M6 Z
CMP compare with accumulator与累加器比较 A-M–>NZC NZC
CPX compare with X index与X变址寄存器比较 X-M–>NZC NZC
CPY compare with Y index与Y变址寄存器比较 Y-M–>NZC NZC
TRB test and reset bits对位进行测试和清除 x
TSB test and set bits对位进行测试和设置 x
RMB reset memory bit对内存位进行清除 x
SMB set memory bit对内存位进行设置 x
算术操作
ADC add accumulator, with carry加累加器(带进位) A<–A+M+C NZCV
SBC subtract accumulator, with borrow减累加器(带借位) A<–A-M-~C NZCV
流程控制 指令
JMP unconditional jump无条件跳转 PC<–Address
JSR jump Subroutine跳到子程序 Stack<–PC,PC<–Address
RTS return from Subroutine由子程序返回 PC<–Stack
RTI return from Interrupt由中断返回 P<–Stack,PC<–Stack From Stack
BRA branch Always转移 PC=PC+offset
BEQ branch on equal (zero set)相等(零标志被设置)时转移 if Z=1,PC+=offset
BNE branch on not equal (zero clear)不相等(零标志被清除)时转移 if Z=0,PC+=offset
BCC branch on carry clear进位标志被清除时转移(2) if C=0,PC+=offset
BCS branch on carry set进位标志被设置时转移(2) if C=1,PC+=offset
BVC branch on overflow clear溢出标志被清除时转移 if V=0,PC+=offset
BVS branch on overflow set溢出标志被设置时转移 if V=1,PC+=offset
BMI branch on minus负数时转移 if N=1,PC+=offset
BPL branch on plus正数时转移 if N=0,PC+=offset
BBR branch on bit reset (zero)某位被清除时转移
BBS branch on bit set (one)某位被设置时转移
处理器状态指令
CLC clear carry flag清除进位标志 C<–0 C=0
CLD clear decimal mode清除十进制模式 D<–0 D=0
CLI clear interrupt disable bit清除中断禁用 I<–0 I=0
CLV clear overflow flag清除溢出标志 V<–0 V=0
SEC set carry flag进位标志 C<–1 C=1
SED set decimal mode十进制模式 C<–1 D=1
SEI set interrupt disable bit中断禁用 I<–1 I=1
传送指令
TAX transfer accumulator to X index传送累加器到X变址寄存器 X<–A NZ
TAY transfer accumulator to Y index传送累加器到Y变址寄存器 Y<–A NZ
TXA transfer X index to accumulator传送X变址寄存器到累加器 A<–X NZ
TYA transfer Y index to accumulator传送Y变址寄存器到累加器 A<–Y NZ
特殊指令
NOP no operation空操作
BRK force break强行中断 Stack<–PC,PC<–$FFFE B=1

注释:

  1. 这个BIT指令拷贝bit 6到V标志,bit 7到N标志(例外的是在直接寻址模式的时候V & N没有触及)。累加器和操作数进行与操作 ,Z标志将被适当地设置。(的说明:测试数如01…80应先被装入累加器,该指令应该不改变累加器)
  2. 这个BCC & BCS指令:指令分别对应于BLT (大于时跳转) 和BGE (小于时跳转)。

 

寻址模式

一共有15种寻址模式,如下:

隐式寻址 [隐式] Implied Addressing [Implied]
在隐式寻址模式里, 包含操作数的地址被隐含在指令的操作码里。

累加器寻址 [累加器] Accumulator Addressing [Accumulator]
这种寻址模式表现为只有一个操作数,另一个操作数隐含为累加器。

直接寻址 [直接] Immediate Addressing [Immediate]
在直接寻址模式里,操作数被包含在指令的第二个字节里,不需要其他内存寻址。

绝对寻址 [绝对] Absolute Addressing [Absolute]
在绝对寻址模式里,指令的第二个字节指定了有效地址的低八位,第三个字节指定高八位。因此,这种寻址模式允许访问全部的64K可寻址内存。

0页面寻址 [0页面] Zero Page Addressing [Zero Page]
0页面寻址允许只取指令的第二字节并假设高位地址为0,以得到较短的代码和执行时间。小心地使用0页面寻址能有效地增加代码的效率。

绝对变址寻址 [绝对,X 或 绝对,Y] Absolute Indexed Addressing [Absolute,X or Absolute,Y]
绝对变址寻址联合X或Y变址寄存器使用,以“绝对, X”和“绝对, Y”的形式出现。有效地址由X或Y的内容加上指令的第二或第三字节包含的地址得到。这种模式允许变址寄存器包含变址或计数值而指令包含基址。这种寻址模式允许定位任何位置并且可以用变址修改多个地方,用以减少代码和指令时间。

0页面变址寻址 [0页面,X 或 0页面,Y] Zero Page Indexed Addressing [Zero Page,X or Zero Page,Y]
0页面变址寻址联合X或Y变址寄存器使用,以“0页面, X”和“0页面, Y”的形式出现。有效地址由指令的第二个字节加上变址寄存器的内容得到。因为这是一个“0页面”寻址,所以第二字节的内容定位于0页面。另外,因为“0页面”寻址模式的特性,所以不会有进位加到高位内存,也不会发生跨页边界的问题。

相对寻址 [相对] Relative Addressing [Relative]
相对寻址只用在转移(branch)指令指令中;它指定了条件转移的目标。指令的第二个字节变成一个操作数,作为偏移加到指向下一条指令的指令指针上。偏移范围从-128到127字节,相对于下一条指令。

0页面变址间接寻址 [(0页面,X)] Zero Page Indexed Indirect Addressing [(Zero Page,X)]
0页面变址间接寻址(通常参考为 间接 X)指令的第二个字节加到X变址寄存器的内容上;进位被舍弃。加法运算的结果指向0页面的一个内存单元,而这个内存单元是有效地址的低8位。下一个0页面单元是有效地址的高8位。指向有效地址的高8位和低8位都必须在0页面内。

绝对变址间接寻址 [(绝对,X)] Absolute Indexed Indirect Addressing [(Absolute,X)](只用在跳转(Jump)指令)
在绝对变址间接寻址中,指令的第二和第三字节的内容被加到X 寄存器。加法运算的结果指向一个内存单元,而这个内存单元是有效地址的低8位。下一个内存单元是有效地址的高8位。

变址间接寻址 [(0页面),Y] Indexed Indirect Addressing [(Zero Page),Y]
这种寻址通常参考为 间接,Y。指令的第二个字节指向0页面的一个内存单元,这个内存单元的内容被加到Y变址寄存器,结果是有效地址的低8位。加法的进位被加到0页面的下一个内存单元,结果是有效地址的高8位。

0页面间接寻址 [(0页面)] Zero Page Indirect Addressing [(Zero Page)]
在0页面间接寻址模式里,指令的第二个字节指向0页面的一个内存单元,单元的内容是有效地址的低8位,下一个0页面单元的内容是有效地址的高8位。

绝对间接寻址 [(Absolute)] Absolute Indirect Addressing [(Absolute)](只用在跳转(Jump)指令)
指令的第二个字节包含了一个内存单元的低8位地址,第三个字节包含了同一个内存单元的高8位地址。而这个内存单元是有效地址的低位,下一个内存单元是有效地址的高位,最后有效地址被装入16位的指令指针。

(pinokio的说明:[xxxx]表示地址为xxxx的内存数据,xxxx即指针;(yyyy)表示[yyyy]所指向的地址的内存数据,yyyy即指针的指针。下表中,#Oper表示以一个实际的数为操作数,其余为地址)

指令编码

助记符 寻址模式 形式 操作码 指令长度 CPU周期
ADC Immediate直接 ADC #Oper 69 2 2
Zero Page零页面 ADC Zpg 65 2 3
Zero Page,X零页面,X ADC Zpg,X 75 2 4
Absolute绝对 ADC Abs 6D 3 4
Absolute,X绝对,X ADC Abs,X 7D 3 4
Absolute,Y绝对,Y ADC Abs,Y 79 3 4
(Zero Page,X)(零页面,X) ADC (Zpg,X) 61 2 6
(Zero Page),Y(零页面),Y ADC (Zpg),Y 71 2 5
(Zero Page)(零页面) ADC (Zpg) 72 2 5
AND Immediate直接 AND #Oper 29 2 2
Zero Page零页面 AND Zpg 25 2 3
Zero Page,X零页面,X AND Zpg,X 35 2 4
Absolute绝对 AND Abs 2D 3 4
Absolute,X绝对,X AND Abs,X 3D 3 4
Absolute,Y绝对,Y AND Abs,Y 39 3 4
(Zero Page,X)(零页面,X) AND (Zpg,X) 21 2 6
(Zero Page),Y(零页面),Y AND (Zpg),Y 31 2 5
(Zero Page) (零页面) AND (Zpg) 32 2 5
ASL accumulator累加器 ASL A 0A 1 2
Zero Page零页面 ASL Zpg 06 2 5
Zero Page,X零页面,X ASL Zpg,X 16 2 6
Absolute绝对 ASL Abs 0E 3 6
Absolute,X绝对,X ASL Abs,X 1E 3 7
BBR0 Relative相对 BBR0 Oper 0F 2 2
BBR1 Relative相对 BBR1 Oper 1F 2 2
BBR2 Relative相对 BBR2 Oper 2F 2 2
BBR3 Relative相对 BBR3 Oper 3F 2 2
BBR4 Relative相对 BBR4 Oper 4F 2 2
BBR5 Relative相对 BBR5 Oper 5F 2 2
BBR6 Relative相对 BBR6 Oper 6F 2 2
BBR7 Relative相对 BBR7 Oper 7F 2 2
BBS0 Relative相对 BBS0 Oper 8F 2 2
BBS1 Relative相对 BBS1 Oper 9F 2 2
BBS2 Relative相对 BBS2 Oper AF 2 2
BBS3 Relative相对 BBS3 Oper BF 2 2
BBS4 Relative相对 BBS4 Oper CF 2 2
BBS5 Relative相对 BBS5 Oper DF 2 2
BBS6 Relative相对 BBS6 Oper EF 2 2
BBS7 Relative相对 BBS7 Oper FF 2 2
BCC Relative相对 BCC Oper 90 2 2
BCS Relative相对 BCS Oper B0 2 2
BEQ Relative相对 BEQ Oper F0 2 2
BIT Immediate直接 BIT #Oper 89 2 2
Zero Page零页面 BIT Zpg 24 2 3
Zero Page,X零页面,X BIT Zpg,X 34 2 4
Absolute绝对 BIT Abs 2C 3 4
Absolute,X绝对,X BIT Abs,X 3C 3 4
BMI Relative相对 BMI Oper 30 2 2
BNE Relative相对 BNE Oper D0 2 2
BPL Relative相对 BPL Oper 10 2 2
BRA Relative相对 BRA Oper 80 2 3
BRK Implied隐含 BRK 00 1 7
BVC Relative相对 BVC Oper 50 2 2
BVS Relative相对 BVS Oper 70 2 2
CLC Implied隐含 CLC 18 1 2
CLD Implied隐含 CLD D8 1 2
CLI Implied隐含 CLI 58 1 2
CLV Implied隐含 CLV B8 1 2
CMP Immediate直接 CMP #Oper C9 2 2
Zero Page零页面 CMP Zpg C5 2 3
Zero Page,X零页面,X CMP Zpg D5 2 4
Absolute绝对 CMP Abs CD 3 4
Absolute,X绝对,X CMP Abs,X DD 3 4
Absolute,Y绝对,Y CMP Abs,Y D9 3 4
(Zero Page,X)( 零页面,X) CMP (Zpg,X) C1 2 6
(Zero Page),Y(零页面),Y CMP (Zpg),Y D1 2 5
(Zero Page) (零页面) CMP (Zpg) D2 2 5
CPX Immediate直接 CPX #Oper E0 2 2
Zero Page零页面 CPX Zpg E4 2 3
Absolute绝对 CPX Abs EC 3 4
CPY Immediate直接 CPY #Oper C0 2 2
Zero Page零页面 CPY Zpg C4 2 3
Absolute绝对 CPY Abs CC 3 4
DEA accumulator累加器 DEA 3A 1 2
DEC Zero Page  零页面 DEC Zpg C6 2 5
Zero Page,X  零页面,X DEC Zpg,X D6 2 6
Absolute  绝对 DEC Abs CE 3 6
Absolute,X绝对,X DEC Abs,X DE 3 7
DEX Implied  隐含 DEX CA 1 2
DEY Implied  隐含 DEY 88 1 2
EOR Immediate  直接 EOR #Oper 49 2 2
Zero Page  零页面 EOR Zpg 45 2 3
Zero Page,X  零页面,X EOR Zpg,X 55 2 4
Absolute  绝对 EOR Abs 4D 3 4
Absolute,X  绝对,X EOR Abs,X 5D 3 4
Absolute,Y  绝对,Y EOR Abs,Y 59 3 4
(Zero Page,X)  (零页面,X) EOR (Zpg,X) 41 2 6
(Zero Page),Y  (零页面),Y EOR (Zpg),Y 51 2 5
(Zero Page) (零页面) EOR (Zpg) 52 2 5
INA accumulator累加器 INA 1A 1 2
INC Zero Page零页面 INC Zpg E6 2 5
Zero Page,X零页面,X INC Zpg,X F6 2 6
Absolute绝对 INC Abs EE 3 6
Absolute,X绝对,X INC Abs,X FE 3 7
INX Implied隐含 INX E8 1 2
INY Implied隐含 INY C8 1 2
JMP Absolute绝对 JMP Abs 4C 3 3
(Absolute) (绝对) JMP (Abs) 6C 3 5
(Absolute,X) (绝对,X) JMP (Abs,X) 7C 3 6
JSR Absolute绝对 JSR Abs 20 3 6
LDA Immediate直接 LDA #Oper A9 2 2
Zero Page零页面 LDA Zpg A5 2 3
Zero Page,X零页面,X LDA Zpg,X B5 2 4
Absolute绝对 LDA Abs AD 3 4
Absolute,X绝对,X LDA Abs,X BD 3 4
Absolute,Y绝对,Y LDA Abs,Y B9 3 4
(Zero Page,X)(零页面,X) LDA (Zpg,X) A1 2 6
(Zero Page),Y(零页面),Y LDA (Zpg),Y B1 2 5
(Zero Page)(零页面) LDA (Zpg) B2 2 5
LDX Immediate直接 LDX #Oper A2 2 2
Zero Page零页面 LDX Zpg A6 2 3
Zero Page,Y 零页面,Y LDX Zpg,Y B6 2 4
Absolute绝对 LDX Abs AE 3 4
Absolute,Y绝对,Y LDX Abs,Y BE 3 4
LDY Immediate直接 LDY #Oper A0 2 2
Zero Page零页面 LDY Zpg A4 2 3
Zero Page,Y 零页面,Y LDY Zpg,X B4 2 4
Absolute绝对 LDY Abs AC 3 4
Absolute,Y绝对,Y LDY Abs,X BC 3 4
LSR accumulator累加器 LSR A 4A 1 2
Zero Page 零页面 LSR Zpg 46 2 5
Zero Page,X零页面,X LSR Zpg,X 56 2 6
Absolute绝对 LSR Abs 4E 3 6
Absolute,X绝对,X LSR Abs,X 5E 3 7
NOP Implied隐含 NOP EA 1 2
ORA Immediate直接 ORA #Oper 09 2 2
Zero Page零页面 ORA Zpg 05 2 3
Zero Page,X零页面,X ORA Zpg,X 15 2 4
Absolute绝对 ORA Abs 0D 3 4
Absolute,X绝对,X ORA Abs,X 1D 3 4
Absolute,Y绝对,Y ORA Abs,Y 19 3 4
(Zero Page,X)(零页面,X) ORA (Zpg,X) 01 2 6
(Zero Page),Y(零页面),Y ORA (Zpg),Y 11 2 5
(Zero Page)(零页面) ORA (Zpg) 12 2 5
PHA Implied隐含 PHA 48 1 3
PHP Implied隐含 PHP 08 1 3
PHX Implied隐含 PHX DA 1 3
PHY Implied隐含 PHY 5A 1 3
PLA Implied隐含 PLA 68 1 4
PLP Implied隐含 PLP 28 1 4
PLX Implied隐含 PLX FA 1 4
PLY Implied隐含 PLY 7A 1 4
ROL accumulator累加器 ROL A 2A 1 2
Zero Page零页面 ROL Zpg 26 2 5
Zero Page,X零页面,X ROL Zpg,X 36 2 6
Absolute绝对 ROL Abs 2E 3 6
Absolute,X绝对,X ROL Abs,X 3E 3 7
ROR accumulator累加器 ROR A 6A 1 2
Zero Page零页面 ROR Zpg 66 2 5
Zero Page,X零页面,X ROR Zpg,X 76 2 6
Absolute绝对 ROR Abs 6E 3 6
Absolute,X绝对,X ROR Abs,X 7E 3 7
RTI Implied隐含 RTI 40 1 6
RTS Implied隐含 RTS 60 1 6
SBC Immediate直接 SBC #Oper E9 2 2
Zero Page零页面 SBC Zpg E5 2 3
Zero Page,X零页面,X SBC Zpg,X F5 2 4
Absolute绝对 SBC Abs ED 3 4
Absolute,X绝对,X SBC Abs,X FD 3 4
Absolute,Y绝对,Y SBC Abs,Y F9 3 4
(Zero Page,X)(零页面,X) SBC (Zpg,X) E1 2 6
(Zero Page),Y(零页面),Y SBC (Zpg),Y F1 2 5
(Zero Page)(零页面) SBC (Zpg) F2 2 5
SEC Implied隐含 SEC 38 1 2
SED Implied隐含 SED F8 1 2
SEI Implied隐含 SEI 78 1 2
STA Zero Page零页面 STA Zpg 85 2 3
Zero Page,X零页面,X STA Zpg,X 95 2 4
Absolute绝对 STA Abs 8D 3 4
Absolute,X绝对,X STA Abs,X 9D 3 5
Absolute,Y绝对,Y STA Abs,Y 99 3 5
(Zero Page,X)(零页面,X) STA (Zpg,X) 81 2 6
(Zero Page),Y(零页面),Y STA (Zpg),Y 91 2 6
(Zero Page)(零页面) STA (Zpg) 92 2 5
STX Zero Page零页面 STX Zpg 86 2 3
Zero Page,Y 零页面,Y STX Zpg,Y 96 2 4
Absolute绝对 STX Abs 8E 3 4
STY Zero Page零页面 STY Zpg 84 2 3
Zero Page,X零页面,X STY Zpg,X 94 2 4
Absolute绝对 STY Abs 8C 3 4
STZ Zero Page零页面 STZ Zpg 64 2 3
Zero Page,X零页面,X STZ Zpg,X 74 2 4
Absolute绝对 STZ Abs 9C 3 4
Absolute,X绝对,X STZ Abs,X 9E 3 5
TAX Implied隐含 TAX AA 1 2
TAY Implied隐含 TAY A8 1 2
TRB Zero Page零页面 TRB Zpg 14 2 5
Absolute绝对 TRB Abs 1C 3 6
TSB Zero Page零页面 TSB Zpg 04 2 5
Absolute绝对 TSB Abs 0C 3 6
TSX Implied隐含 TSX BA 1 2
TXA Implied隐含 TXA 8A 1 2
TXS Implied隐含 TXS 9A 1 2
TYA Implied隐含 TYA 98 1 2
0

6502 CPU汇编语言指令集》有1个想法

TomDang

太赞了!正想写一个FC模拟器,指令集应该是一样的

0
回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注