| 语法约定 | |
|---|---|
| addr | 2字节地址 |
| addr/const | 2字节值:是一个地址或一个常数 |
| const | 1-2字节的常数 |
| destbk | 字符串将被移动到的64K存储段 |
| dp | 1字节直接页面(对6502是零页面)偏移量 |
| label | 代码标签和指令放在相同的64K存储段内 |
| long | 3字节的地址(包括存储段字节) |
| nearlabel | 非常靠近指令的代码标签,可以用一个字节的有符号偏移量到达 |
| sr | 1字节的堆栈相对偏移量 |
| srcebk | 字符串将被移出的源64K存储段 |
| 标志 | |
| 位 |
7 6 5 4 3 2 1 0
|
|
n v m x d i z c
| |
|
e
| |
| n - 负的 | |
| v - 溢出 | |
| m - 8/16位内存/累加器 | |
| x - 8/16位变址寄存器 | |
| d - 十进位模式 | |
| i - IRQ禁用/启用 | |
| z - 零结果 | |
| c - 进位 | |
| e - 模拟 | |
ADC:加累加器(带进位)
当使用16位累加器模式的时候,和预想的一样,操作产生的进位会正确地从从位7进入位8。(比如:$FF+4=$0103,1在累加器的高端字节,3在累加器的低端字节。)这样,只有在低端字节被加时才有清除进位的必要。和在8位累加器模式下一样,手动检测位15上的进位仍是必要的。
在16位模式下,低端字节位于有效地址上,而高端字节则位于有效地址的下一个单元上。
该指令会影响的标志:nv----zc
| 寻址方式 | 语法 | 操作码 | 指令长度 | 周期 | 备注 |
|---|---|---|---|---|---|
| 直接寻址 | ADC #const |
69
|
2*
|
2
| 1 |
| 绝对寻址 | ADC addr |
6D
|
3
|
4
| 1 |
| 绝对长程寻址 | ADC long |
6F
|
4
|
5
| 1 |
| 直接页面寻址 | ADC dp |
65
|
2
|
3
| 1,2 |
| 直接页面间接寻址 | ADC (dp) |
72
|
2
|
5
| 1,2 |
| 直接页面间接长程寻址 | ADC [dp] |
67
|
2
|
6
| 1,2 |
| 绝对变址X寻址 | ADC addr,X |
7D
|
3
|
4
| 1,3 |
| 绝对变址X长程寻址 | ADC long,X |
7F
|
4
|
5
| 1 |
| 绝对变址Y寻址 | ADC addr,Y |
79
|
3 |
4
| 1,3 |
| 直接页面变址X寻址 | ADC dp,X |
75
|
2
|
4
| 1,2 |
| 直接页面变址X,间接寻址 | ADC (dp,X) |
61
|
2
|
6
| 1,2 |
| 直接页面间接,变址Y寻址 | ADC (dp),Y |
71
|
2
|
5
| 1,2,3 |
| 直接页面间接长程,变址Y寻址 | ADC [dp],Y |
77
|
2
|
6
| 1,2 |
| 堆栈相对寻址 | ADC sr,S |
63
|
2
|
4
| 1 |
| 堆栈相对间接,变址Y寻址 | ADC (sr,S),Y |
73
|
2
|
7
| 1 |
| * | 如果m=0(16位内存/累加器),则增加一个字节 |
| 1 | 如果m=0(16位内存/累加器),则增加一个周期 |
| 2 | 如果直接页面寄存器的低端字节不为零,则增加一个周期 |
| 3 | 如果增加变址越过页面边界,则增加一个周期 |
AND:与累加器
一般是将位于操作数给出的有效地址的数据和累加器进行“与”操作。如果在16位累加器模式(m=0)下,从内存取出的数据是16位宽的,低端字节位于有效地址而高端字节位于有效地址的下一个单元。
该指令会影响的标志:n-----z-
| 寻址方式 | 语法 | 操作码 | 指令长度 | 周期 | 备注 |
|---|---|---|---|---|---|
| 直接寻址 | AND #const |
29
|
2*
|
2
| 1 |
| 绝对寻址 | AND addr |
2D
|
3
|
4
| 1 |
| 绝对长程寻址 | AND long |
2F
|
4
|
5
| 1 |
| 直接页面寻址 | AND dp |
25
|
2
|
3
| 1,2 |
| 直接页面间接寻址 | AND (dp) |
32
|
2
|
5
| 1,2 |
| 直接页面间接长程寻址 | AND [dp] |
27
|
2
|
6
| 1,2 |
| 绝对变址X寻址 | AND addr,X |
3D
|
3
|
4
| 1,3 |
| 绝对变址X长程寻址 | AND long,X |
3F
|
4
|
5
| 1 |
| 绝对变址Y寻址 | AND addr,Y |
39
|
3 |
4
| 1,3 |
| 直接页面变址X寻址 | AND dp,X |
35
|
2
|
4
| 1,2 |
| 直接页面变址X,间接寻址 | AND (dp,X) |
21
|
2
|
6
| 1,2 |
| 直接页面间接,变址Y寻址 | AND (dp),Y |
31
|
2
|
5
| 1,2,3 |
| 直接页面间接长程,变址Y寻址 | AND [dp],Y |
37
|
2
|
6
| 1,2 |
| 堆栈相对寻址 | AND sr,S |
23
|
2
|
4
| 1 |
| 堆栈相对间接,变址Y寻址 | AND (sr,S),Y |
33
|
2
|
7
| 1 |
| * | 如果m=0(16位内存/累加器),则增加一个字节 |
| 1 | 如果m=0(16位内存/累加器),则增加一个周期 |
| 2 | 如果直接页面寄存器的低端字节不为零,则增加一个周期 |
| 3 | 如果增加变址越过页面边界,则增加一个周期 |
ASL:算术左移
所有的位左移,最高有效位移入进位标志。如果在16位累加器模式(m=0)下,被移动的数据是16位的。
该指令会影响的标志:n-----zc
| 寻址方式 | 语法 | 操作码 | 指令长度 | 周期 | 备注 |
|---|---|---|---|---|---|
| 累加器寻址 | ASL a | 0A | 1 | 2 | |
| 绝对寻址 | ASL addr | 0E | 3 | 6 | 1 |
| 直接页面寻址 | ASL dp | 06 | 2 | 5 | 1,2 |
| 绝对变址X寻址 | ASL addr,X | 1E | 3 | 7 | 1 |
| 直接页面变址X寻址 | ASL dp,X | 16 | 2 | 6 | 1,2 |
| 1 | 如果m=0(16位内存/累加器),则增加两个周期 |
| 2 | 如果直接页面寄存器的低端字节不为零,则增加一个周期 |
转移指令:
下面的转移指令和在6502下表现相同,因此不会作深入的讨论。转移指令不会影响任何的状态寄存器标志。单字节操作数的范围是+128到-127。
| 寻址方式 | 语法 | 操作码 | 指令长度 | 周期 | 备注 |
|---|---|---|---|---|---|
| 程序指针相对寻址 | BCC near | 90 | 2 | 2 | 1,2 |
| 程序指针相对寻址 | BCS near | B0 | 2 | 2 | 1,2 |
| 程序指针相对寻址 | BEQ near | F0 | 2 | 2 | 1,2 |
| 程序指针相对寻址 | BNE near | D0 | 2 | 2 | 1,2 |
| 程序指针相对寻址 | BMI near | 30 | 2 | 2 | 1,2 |
| 程序指针相对寻址 | BPL near | 10 | 2 | 2 | 1,2 |
| 程序指针相对寻址 | BVC near | 50 | 2 | 2 | 1,2 |
| 程序指针相对寻址 | BVS near | 70 | 2 | 2 | 1,2 |
| 1 | 如果转移被捕获,则增加一个周期 |
| 2 | 如果在模拟模式(e=1)下,则增加一个以上的周期 |
新的转移指令:
BRA:无条件转移
无条件转移按操作数转移而不关心状态寄存器的当前状态。单字节操作数的范围是+128到-127。该指令和后面的BRL指令使得写重定位的代码变得容易。
| 寻址方式 | 语法 | 操作码 | 指令长度 | 周期 | 备注 |
|---|---|---|---|---|---|
| 程序指针相对寻址 | BRA near | 80 | 2 | 3 | 1 |
| 1 | 如果在6502模拟模式(e=1)下,则增加一个以上的周期 |
BRL:无条件长程转移
和BRA一样,但操作数是2个字节,给指令提供了64k的范围。这个指令和JMP指令类似,区别在于JMP是绝对寻址而BRL是相对寻址。
该指令不会影响任何标志。
| 寻址方式 | 语法 | 操作码 | 指令长度 | 周期 | 备注 |
|---|---|---|---|---|---|
| 程序指针相对长程寻址 | BRL $xxxx | 82 | 3 | 4 |
BIT:检测累加器的某个位
65816为旧的标志BIT指令提供了3种新的寻址方式。唯一不同的是当处理器处于16位模式下,送到状态寄存器的最高两位是位14和为15;而在8位模式下,位6和位7会被送到状态寄存器。
该指令会影响的标志 nv----z- ( 除直接寻址之外)
------z- ( 在直接模式下)
| 寻址方式 | 语法 | 操作码 | 指令长度 | 周期 | 备注 |
|---|---|---|---|---|---|
| 直接寻址 | BIT #const | 89 | 2* | 2 | |
| 绝对寻址 | BIT addr | 2C | 3 | 6 | 1 |
| 直接页面寻址 | BIT dp | 24 | 2 | 5 | 1,2 |
| 绝对变址X寻址 | BIT addr,X | 3C | 3 | 7 | 1 |
| 直接页面变址X寻址 | BIT dp,X | 34 | 2 | 6 | 1,2 |
| * | 如果m=0(16位内存/累加器),则增加1个字节 |
| 1 | 如果m=0(16位内存/累加器),则增加1个周期 |
| 2 | 如果直接页面寄存器的低端字节不是0,则增加1个周期 |
| 3 | 如果增加变址越过页面边界,则增加1个周期 |
BRK:软暂停
在65816的原本模式下,BRK不受中断禁用标志I的影响。另外,你可以跳过一个字节的签名字节,它指示出是哪个BRK指令使得BRK被执行。新的BRK处理器包含一个硬件向量--因此不再需要通过IRQ来检测BRK位。
当BRK在65816的原本模式下运行时: 程序指针存储寄存器被压入堆栈。 程序指针增加2并且压入堆栈。 状态寄存器压入堆栈。 设置中断禁用标志。 清除十进制模式标志。 程序存储寄存器被清零。 程序指针从位于$FFE6-$FFE7的暂停向量读取。
在6502模拟模式(e=1)下,BRK和它在6502里的前身(b标志设定,状态压入堆栈,SEI和IRQ执行)一样被执行。
| 寻址方式 | 语法 | 操作码 | 指令长度 | 周期 | 备注 |
|---|---|---|---|---|---|
| 堆栈/中断寻址 | BRK | 00 | 2* | 7 | 1 |
| * | BRK是一个字节,但是压入堆栈的程序指针要增加2,因为有可选的签名字节 |
| 1 | 如果在65816的原本模式(e=0)下,则增加一个周期 |
状态寄存器设置和清除:
下面列出的状态设置和复位指令在65816的原本模式和6502模拟模式下的效果是一样。
| 寻址方式 |
标志:nvmxdizc |
助记符 | 操作码 | 指令长度 | 周期 |
|---|---|---|---|---|---|
| 隐式寻址 | - - - - - - - 0 | CLC | 18 | 1 | 2 |
| 隐式寻址 | - - - - 0 - - - | CLD | D8 | 1 | 2 |
| 隐式寻址 | - - - - - 0 - - | CLI | 58 | 1 | 2 |
| 隐式寻址 | - 0 - - - - - - | CLV | B8 | 1 | 2 |
| 隐式寻址 | - - - - - - - 1 | SEC | 38 | 1 | 2 |
| 隐式寻址 | - - - - 1 - - - | SED | F8 | 1 | 2 |
| 隐式寻址 | - - - - - 1 - - | SEI | 78 | 1 | 2 |
CMP:将累加器和内存数据作比较
大致上,这个指令在6502模拟模式下和在65816模式下工作是一样的。
在16位累加器模式下,用于比较的数据低端字节来自有效地址,高端字节来自有效地址的下一个存储单元。
该指令会影响的标志 n-----zc
| 寻址方式 | 语法 | 操作码 | 指令长度 | 周期 | 备注 |
|---|---|---|---|---|---|
| 直接寻址 | CMP #const |
C9
|
2*
|
2
| 1 |
| 绝对寻址 | CMP addr |
CD
|
3
|
4
| 1 |
| 绝对长程寻址 | CMP long |
CF
|
4
|
5
| 1 |
| 直接页面寻址 | CMP dp |
C5
|
2
|
3
| 1,2 |
| 直接页面间接寻址 | CMP (dp) |
D2
|
2
|
5
| 1,2 |
| 直接页面间接长程寻址 | CMP [dp] |
C7
|
2
|
6
| 1,2 |
| 绝对变址X寻址 | CMP addr,X |
DD
|
3
|
4
| 1,3 |
| 绝对变址X长程寻址 | CMP long,X |
DF
|
4
|
7
| 1 |
| 绝对变址Y寻址 | CMP addr,Y |
D9
|
3 |
4
| 1,3 |
| 直接页面变址X寻址 | CMP dp,X |
D5
|
2
|
4
| 1,2 |
| 直接页面变址X,间接寻址 | CMP (dp,X) |
C1
|
2
|
6
| 1,2 |
| 直接页面间接,变址Y寻址 | CMP (dp),Y |
C1
|
2
|
5
| 1,2,3 |
| 直接页面间接长程,变址Y寻址 | CMP [dp],Y |
D7
|
2
|
6
| 1,2 |
| 堆栈相对寻址 | CMP sr,S |
C3
|
2
|
4
| 1 |
| 堆栈相对间接,变址Y寻址 | CMP (sr,S),Y |
D3
|
2
|
7
| 1 |
| * | 如果m=0(16位内存/累加器),则增加一个字节 |
| 1 | 如果m=0(16位内存/累加器),则增加一个周期 |
| 2 | 如果直接页面寄存器的低端字节不为零,则增加一个周期 |
| 3 | 如果增加变址越过页面边界,则增加一个周期 |
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

