notify-ctrl.github.io

6502汇编

主页 > Nes > #4


(不建议硬背下来,需要的时候来看就好)


寻址方式

(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

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

LDX,LDY

和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

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

STX,STY

类似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

PHA(PusH A),A入栈。

助记符 Addressing Mode 操作码
PHA   48

PHP

状态寄存器入栈。

助记符 Addressing Mode 操作码
PHP   08

PLA

PLA(PuLl A from stack),A出栈。(为啥不是pop呢)

影响负数位和零位。

助记符 Addressing Mode 操作码
PLA   68

PLP

状态寄存器出栈。

助记符 Addressing Mode 操作码
PLP   28

逻辑操作指令

AND

将数据和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

EOR

将数据和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

ORA

将数据和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

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

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

自增自减指令

DEC

使某内存处的数据自减1。

影响负数位和零位。

助记符 Addressing Mode 操作码
DEC aa C6
DEC aa,X D6
DEC aaaa CE
DEC aaaa,X DE

DEX,DEY

X–,Y–。

影响负数位和零位。

助记符 Addressing Mode 操作码
DEX   CA
DEY   88

INC

使某内存处的数据自加1。

影响负数位和零位。

助记符 Addressing Mode 操作码
INC $aa E6
INC $aa,X F6
INC $aaaa EE
INC $aaaa,X FE

INX,INY

X++,Y++。

影响负数位和零位。

助记符 Addressing Mode 操作码
INX   E8
INY   C8

移位指令

ASL

ASL(Arithmatic Shift Left),算术左移。就是普通左移位。

影响负数位,进位,零位。

助记符 Addressing Mode 操作码
ASL A 0A
ASL aa 06
ASL aa,X 16
ASL aaaa 0E
ASL aaaa,X 1E

LSR

LSR(Logical Shift Right),逻辑右移。将数据右移,左边空出来的位补0。

影响负数位,进位,零位。

助记符 Addressing Mode 操作码
LSR A 4A
LSR $aa 46
LSR $aa,X 56
LSR $aaaa 4E
LSR $aaaa,X 5E

ROL

左旋。

影响负数位,进位,零位。

助记符 Addressing Mode 操作码
ROL A 2A
ROL $aa 26
ROL $aa,X 36
ROL $aaaa 2E
ROL $aaaa,X 3E

ROR

右旋。

影响负数位,进位,零位。

助记符 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

BCC(Branch on Carry Clear),当进位为0时发生程序分支(即跳转)。

助记符 Addressing Mode 操作码
BCC aa 90

BCS

BCS(Branch on Carry Set),当进位为1时跳转。

助记符 Addressing Mode 操作码
BCS aa B0

BEQ

BEQ(Branch on EQual),当零位为1时跳转。

助记符 Addressing Mode 操作码
BEQ aa F0

BMI

BMI(Branch on result MInus),当负数位为1时发生跳转。

助记符 Addressing Mode 操作码
BMI aa 30  

BNE

BNE(Branch on Not Equal),当零位为0时跳转。

助记符 Addressing Mode 操作码
BNE aa D0

BPL

BPL(Branch on result PLus),当负数位为0时跳转。

助记符 Addressing Mode 操作码
BPL aa 10

BVC

BVC(Branch on oVerflow Clear),当溢出位为0时跳转。

助记符 Addressing Mode 操作码
BVC aa 50

BVS

BVS(Branch on oVerflow Set),当溢出位为1时跳转。

助记符 Addressing Mode 操作码
BVS aa 70

JMP

直接跳转。

助记符 Addressing Mode 操作码
JMP $aaaa 4C
JMP ($aaaa) 6C

JSR

JSR(Jump to SubRoutine),跳转至子过程。和JMP一样,但是执行时会将PC入栈。

助记符 Addressing Mode 操作码
JSR $aaaa 20

RTI

RTI(ReTurn from Interrupt),从中断返回。此指令将PC和状态寄存器从栈中弹出。

助记符 Addressing Mode 操作码
RTI   40

RTS

RTS(ReTurn from Subroutine),从子过程返回,功能是从栈中弹出PC。

助记符 Addressing Mode 操作码
RTS   60

状态位操作指令

BIT

该指令用于与A测试相关数据位。

取数据与A的与运算为结果,将结果的第7位赋予负数位,第6位赋予溢出位。还会根据结果设置零位。

A中的数据和内存中的数据不会受到影响。

助记符 Addressing Mode 操作码
BIT aa 24
BIT aaaa 2C

CMP

将数据和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

CPX,CPY

如同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

BRK(BReaK)指令可引发IRQ中断。参见CPU中断

助记符 Addressing Mode 操作码
BRK   00

NOP

No OPeration,该指令什么都不做。

助记符 Addressing Mode 操作码
NOP   EA

上一篇:CPU

下一篇:PPU