注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

眼睛想旅行

技术就是我的生命与信仰!

 
 
 

日志

 
 
关于我

精通C,C++,python,Erlang。并熟悉各种其他编程语言,用cocos2dx游戏引擎作过几个项目。会MySQL增删改查,了解OpenGL渲染原理。懂单片机,能设计数字电路系统,会画电路图和设计电路板。喜欢了解最新前沿技术,并持续关注和学习新技术。

网易考拉推荐

任天堂游戏机CPU汇编指令集与寄存器  

2011-02-10 15:38:20|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

6502处理器寄存器组

6502中共有5个8位寄存器和1个16位寄存器 
1.累加寄存器A 
这是8位的寄存器,也是6502中最重要和最常用的寄存器,可用于读写数据,进行各种逻辑运算等等。 
2.变址寄存器X 
这个8位寄存器和A差不多,只是它可以非常方便地加1或减1,常用于数据传送,运算等等3.变址寄存器Y 
和X一样,2个变址寄存器搭配使用使程序更加灵活 
4.堆栈指针SP 
这是8位的寄存器,指向对栈栈顶位置 
在程序运行时。须要一称之为堆栈的RAM块作为数据缓冲区,以暂存程序运行过程中的一些重要数据 
堆栈由连续的RAM单元组成。数据写入堆栈称入栈,数据从堆栈中读出称为出栈,堆栈的操作遵循"先进后出"的操作,即先入栈的数据后出栈。 
系统如何了解当前的堆栈顶在哪以从顶部弹出堆栈呢? 
就要依靠堆栈指针SP,6502规定,堆栈位于第一页($0100-$01ff)的RAM中,因此SP指向的时堆栈顶的低8位,即堆栈顶地址为$00SP,当进行入栈、出栈操作时,栈顶单元发生变化,SP的内容也将加1或减1 
可以用下面程序读出当前SP的内容: 
TSX 
STX$2000 
RTS 
这时$2000即为SP的内容 
5.程序状态字PSW(Program Status Word) 
这也是8位寄存器,用于寄存指令执行的状态信息,PSW的各位状态有的是根据指令执行的结果由硬件自动设置的,有的可以由用户用软件的方法设定。PSW的各位如下(其中第5位未用,保持为0) 
7 6 5 4 3 2 1 0 
N V B D I Z C 
N:负数标志,指令指行完后为负(>7F)则n=0,否则为1 
V:溢出标志,若产生溢出则V=1,否则V=0 
I:中断标志。是否允许系统中断IRQ,=1:禁止,=0:允许 
Z:零标志,结果是否为0,为0则Z=1,否则Z=0 
C:进位标志,结果最高位有进位则C=1,否则C=0 
5.程序计数器PC 
这是6502唯一的一个16为计数器,其内容为将要执行命令的存放地址,寻址范围达64KB($0000-$FFFF),CPU是根据PC的内容找到指令的存储单元,取出指令执行的。PC具有自动加1的功能,CPU每读取一条指令的1字节,PC内容自动加1,指向下一个存储单元,这样就能实现程序的顺序执行 
PC没有地址,用户不能对它进行读写,但可以通过转移,调用,返回等指令改变其内容,以改变程序的执行顺序 

以下为指令集

-------------------------------addr  :代表8位地址    addr16:代表16位地址     data  :立即数-------------------------------
数据传送指令
LDA--由存储器取数送入累加器 M→A

符号码格式         指令操作码       寻址方式
LDA ($addr,X)           A1                       先变址X后间址
LDA $addr               A5                        零页寻址
LDA #$data              A9                        立即寻址
LDA $addr16             AD                        绝对寻址
LDA ($addr),Y           B1                        后变址Y间址
LDA $addr,X             B5                        零页X变址
LDA $addr16,Y           B9                        绝对Y变址
LDA $addr16,X           BD                        绝对X变址

//LDX--由存储器取数送入累加器 M→X

符号码格式    指令操作码      寻址方式
LDX #$data          A2                     立即寻址
LDX $addr            A6                     零页寻址
LDX $addr16        AE                     绝对寻址
LDX $addr,Y         B6                     零页Y变址
LDX $addr16,Y     BE                     绝对Y变址

//LDY--由存储器取数送入累加器 M→Y

符号码格式       指令操作码     寻址方式
LDY #$data             A0                     立即寻址
LDY $addr               A4                     零页寻址
LDY $addr16           AC                    绝对寻址
LDY $addr,X            B4                    零页X变址
LDY $addr16,X        BC                    绝对X变址

//STA--将累加器的内容送入存储器 A--M

符号码格式         指令操作码       寻址方式
STA ($addr,X)           81                    先变址X后间址
STA $addr               85                    零页寻址
STA $addr16            8D                    绝对寻址
STA ($addr),Y           91                    后变址Y间址
STA $addr,X             95                    零页X变址
STA $addr16,Y           99                    绝对Y变址
STA $addr16,X           9D                   绝对X变址

//STX--将寄存器X的内容送入存储器 X--M

符号码格式     指令操作码     寻址方式
STX $addr             86                    零页寻址
STX $addr16         8E                    绝对寻址
STX $addr,Y          96                    零页Y变址

//STY--将寄存器Y的内容送入存储器 Y--M

符号码格式          指令操作码          寻址方式
STY $addr               84                              零页寻址
STY $addr16             8C                             绝对寻址
STY $addr,X             94                             零页X变址

//寄存器和寄存器之间的传送

符号码格式 操作码     寻址方式       指令作用
TAX               AA              寄存器寻址     将累加器A的内容送入变址寄存器X
TXA               8A              寄存器寻址     将变址寄存器X的内容送入累加器A
TAY               A8              寄存器寻址     将累加器A的内容送入变址寄存器Y
TYA               98              寄存器寻址     将变址寄存器Y的内容送入累加器A
TSX               BA              寄存器寻址     将堆栈指针S的内容送入变址寄存器X
TXS               9A              寄存器寻址     将变址寄存器X的内容送入堆栈指针S

算术运算指令

1. ADC--累加器,存储器,进位标志C相加,结果送累加器A  A+M+C→A

符号码格式      指令操作码      寻址方式
ADC ($addr,X)        61                    先变址X后间址         
ADC $addr             65                    零页寻址
ADC #$data           69                    立即寻址
ADC $addr16         6D                    绝对寻址
ADC ($addr),Y       71                    后变址Y间址
ADC $addr,X          75                    零页X变址
ADC $addr16,Y      79                    绝对Y变址
ADC $addr16,X      7D                    绝对X变址

注意:由于进位标志C页会参加运算,所以在做加法运算时,一般要在前面加指令 CLC,清除进位标志

2. SBC--从累加器减去存储器和进位标志C,结果送累加器  A-M-C→A

符号码格式       指令操作码      寻址方式
SBC ($addr,X)       E1              先变址X后间址
SBC $addr             E5              零页寻址
SBC #$data           E9              立即寻址
SBC $addr16         ED              绝对寻址
SBC ($addr),Y       F1           后变址Y间址
SBC $addr,X          F5              零页X变址
SBC $addr16,Y      F9              绝对Y变址
SBC $addr16,X      FD              绝对X变址

注意:由于在做减法运算时,进位标志C会参与运算,所以在做减法前要先加指令 SEC,置进位标志

3. INC--存储器单元内容增1  M+1→M

符号码格式    指令操作码  寻址方式
INC $addr             E6              零页寻址
INC $addr16         EE              绝对寻址
INC $addr,X          F6              零页X变址
INC $addr16,X      FE              绝对X变址

4. DEC--存储器单元内容减1  M-1→M

符号码格式     指令操作码     寻址方式
DEC $addr            C6              零页寻址
DEC $addr16        CE              绝对寻址
DEC $addr,X         D6              零页X变址
DEC $addr16,X     DE              绝对X变址

5. 寄存器X,Y加1减1

符号码格式 指令操作码 寻址方式
INX               E8              隐含寻址
DEX              CA              隐含寻址
INY               C8              隐含寻址
DEY              88              隐含寻址

逻辑运算指令

1.AND--寄存器与累加器相与,结果送累加器  A∧M→A

符号码格式           指令操作码          寻址方式
AND ($addr,X)           21              先变址X后间址
AND $addr               25              零页寻址
AND #$data              29              立即寻址
AND $addr16             2D              绝对寻址
AND ($addr),Y           31              后变址Y间址
AND $addr,X             35              零页X变址
AND $addr16,Y           39              绝对Y变址
AND $addr16,X           3D              绝对X变址

2.ORA--寄存器与累加器相或,结果送累加器  A∨M→A

符号码格式          指令操作码     寻址方式
ORA ($addr,X)           01                 先变址X后间址
ORA $addr               05                 零页寻址
ORA #$data              09                 立即寻址
ORA $addr16             0D                 绝对寻址
ORA ($addr),Y           11                 后变址Y间址
ORA $addr,X             15                 零页X变址
ORA $addr16,Y           19                 绝对Y变址
ORA $addr16,X           1D                 绝对X变址

3.EOR--寄存器与累加器相异或,结果送累加器  A≮M→A

符号码格式        指令操作码     寻址方式
EOR ($addr,X)           41                     先变址X后间址
EOR $addr               45                     零页寻址
EOR #$data              49                     立即寻址
EOR $addr16             4D                     绝对寻址
EOR ($addr),Y           51                     后变址Y间址
EOR $addr,X             55                     零页X变址
EOR $addr16,Y          59                     绝对Y变址
EOR $addr16,X           5D                     绝对X变址

置标志位指令
1. CLC--清除进位标志         0→C   机器码 18   
2. SEC--置进位标志C          1→C   机器码 38    
3. CLD--清除十进制运算标志D  0→D   机器码 D8    
4. SED--置十进制运算标志D    1→D   机器码 F8   
5. CLV--清除溢出标志V        0→V   机器码 B8
6. CLI--清除中断禁止指令I    0→I    机器码 58   
7. SEI--置位中断禁止标志I    1→I    机器码 78

比较指令
1. CMP--累加器和存储器比较
符号码格式       指令操作码      寻址方式
CMP ($addr,X)           C1                   先变址X后间址
CMP $addr               C5                   零页寻址
CMP #$data              C9                   立即寻址
CMP $addr16           CD                   绝对寻址
CMP ($addr),Y          D1                   后变址Y间址
CMP $addr,X            D5                   零页X变址
CMP $addr16,Y        D9                   绝对Y变址
CMP $addr16,X        DD                   绝对X变址

2. CPX--寄存器X的内容和存储器比较
符号码格式   指令操作码 寻址方式
CPX #$data        E0            立即寻址
CPX $addr          E4            零页寻址
CPX $addr16      EC            绝对寻址

3. CPY--寄存器Y的内容和存储器比较
符号码格式        指令操作码    寻址方式
CPY #$data              C0                   立即寻址
CPY $addr               C4                  零页寻址
CPY $addr16            CC                  绝对寻址

移位指令
1. 算术左移指令ASL
符号码格式      指令操作码 寻址方式
ASL                     0A               累加器寻址
ASL $data             06               零页寻址
ASL $addr16         0E               绝对寻址
ASL $addr,X         16               零页X变址
ASL $addr16,X     1E               绝对X变址

2. 逻辑右移指令LSR

符号码格式   指令操作码   寻址方式
LSR                    4A               累加器寻址
LSR $data          46               零页寻址
LSR $addr16      4E               绝对寻址
LSR $addr,X       56               零页X变址
LSR $addr16,X    5E               绝对X变址

3. 循环左移指令ROL

符号码格式        指令操作码     寻址方式
ROL                     2A                      累加器寻址
ROL $data               26                       零页寻址
ROL $addr16           2E                       绝对寻址
ROL $addr,X            36                       零页X变址
ROL $addr16,X        3E                       绝对X变址
ROL的移位功能是将字节内容连同进位C一起依次向左移1位

4. 循环右移指令ROR
符号码格式      指令操作码         寻址方式
ROR                     6A                           累加器寻址
ROR $data             66                            零页寻址
ROR $addr16         6E                            绝对寻址
ROR $addr,X          76                            零页X变址
ROR $addr16,X      7E                            绝对X变址
ROR的移位功能是将字节内容连同进位C一起依次向右移1位

堆栈操作指令
1. 累加器进栈指令 PHA    机器码 48
2. 累加器出栈指令 PLA    机器码 68

跳转指令
1. JMP--无条件转移指令
符号码格式     指令操作码     寻址方式
JMP  $data16        4C                   绝对寻址
JMP ($data16)      5C                   间接寻址
2. 条件转移指令
符号码格式    操作码          寻址方式               指令功能
BEQ $data16      F0               相对寻址              如果标志位Z=1则转移,否则继续
BNE $data16      D0               相对寻址              如果标志位Z=0则转移,否则继续
BCS $data16      B0               相对寻址              如果标志位C=1则转移,否则继续
BCC $data16      90               相对寻址              如果标志位C=0则转移,否则继续
BMI $data16      30               相对寻址              如果标志位N=1则转移,否则继续
BPL $data16      10               相对寻址              如果标志位N=0则转移,否则继续
BVS $data16      70               相对寻址              如果标志位V=1则转移,否则继续
BVC $data16      50               相对寻址              如果标志位V=0则转移,否则继续

3. 转移到子程序指令JSR和从主程序返回指令RTS

JSR指令仅仅是 绝对寻址,它的操作码是 20
       RTS指令是     隐含寻址,它的操作码是 60

我的网站,有兴趣的可以去看看,写点东西,给我拉拉人气:http://www.k557.com/bbs/forum.php?gid=59

www.k557.com

www.k557.com/bbs

  评论这张
 
阅读(733)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017