| 65816指令集1
65816指令集
| 语法约定 |
| 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
n:在结果的最高有效位被设置时设置。
v:如果出现有符号的溢出则设置。
z:如果结果是零则设置。
c:如果值满了则设置。
| 寻址方式 |
语法 |
操作码 |
指令长度 |
周期 |
备注 |
| 直接寻址
| 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
|
|
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-
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
|
|
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
n:在结果的最高有效位被设置时设置。
z:如果结果是零则设置。
c:如果高位(位7或位15)移入进位则设置。
| 寻址方式 |
语法 |
操作码 |
指令长度 |
周期 |
备注 |
| 累加器寻址
| 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 进位清除则转移(别名BLT:小于时转移)
BCS 进位设置则转移(别名BGE:大于或等于时转移)
BEQ 如果相等则转移
BNE 如果不相等则转移
BMI 如果结果为负数则转移
BPL 如果结果为正数则转移
BVC 如果溢出标志被清除则转移
BVS 如果溢出标志被设置则转移
| 寻址方式 |
语法 |
操作码 |
指令长度 |
周期 |
备注 |
| 程序指针相对寻址
| 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- ( 在直接模式下)
n 取数据的最高有效位的值。
v 取数据的位6或位14的值。
z 如果mem和acc的逻辑与为零则设置。
| 寻址方式 |
语法 |
操作码 |
指令长度 |
周期 |
备注 |
| 直接寻址
| 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模拟模式下的效果是一样。
CLC 清除进位标志。
CLD 清除十进制标志。
CLI 清除中断标志。
CLV 清除溢出标志。
SEC 设置进位标志。
SED 设置十进制标志。
SEI 设置中断标志。
| 寻址方式 |
标志: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
n:在结果的最高有效位被设置时设置。
z:如果结果是零则设置。
c:如果不需要借位则设置。累加器大于等于内存数据。
如果需要借位则c=0。累加器小于内存数据。
| 寻址方式 |
语法 |
操作码 |
指令长度 |
周期 |
备注 |
| 直接寻址
| 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
|
|
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
| 如果增加变址越过页面边界,则增加一个周期 | (综合电子论坛) |
*注:部份文章为网上收录供大家共同学习参考之用,并不代表本站意见。如存在版权问题请马上通知我们,我们将马上删除。 |