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

疾风之狼博客

 
 
 

日志

 
 

[转载]6502基础知识(作者:Cwj)  

2007-04-14 13:01:03|  分类: NES资料 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
【基本概念】?1.寄存器?2.寻址方式【关于】 操作码:用来表示指令所规定的操作性质,如取数、存数、算术运算、转移操作等。 操作数地址:用来指出操作数在什么地方,所以又称为地址码。 1.累加寄存器A?2.变址寄存器X?3.变址寄存器Y?4.程序计数器PC?5.堆栈指针S?6.标志寄存器P(或称处理机状态寄存器) 这是个8位寄存器,它与算术逻辑运算单元ALU一起完成各种算术逻辑运算,它既可存放操作前的初始数据,又可存放操作结果,所以称为累加器。 变址寄存器X是8位寄存器,它在编程中被当做一个计数器来用.它可以由指令控制而被置成一个常数,并能方便地用加1、减1、比较操作来修改和测试其内容,以使得程序能够方便灵活地处理数据抉、表格等问题。 它的用法基本同于变址寄存器X.在有些情况下,例如在程序中要同时处理两个以上的数据块时,一个变址寄存器就显得不够用,所以6502中有两个用于变址的寄存器X和Y. 它是6502中程序员可访问寄存器中唯一的16位寄存器,PC是用来存放指令地址码的寄存器。由于程序的执行一般为顺序执行方式,每取出一个指令字节后PC即自动加1,为取下一个指令字节做好准备。所以程序计数器PC中的内容往往是指向下一个指令字节地址。但在执行转移指令时,PC中将被放进要转移的目标地址码。 它是用来指示堆栈栈顶位置的寄存器,由于6502规定堆栈设置在第1页存储器中,所以堆栈指针S也是条8位寄存器,只用来指出堆栈位置的低八位地址。S具有在数据进栈操作时自动减1,而在数据出栈操作时自动加1的功能。 【概况】?C(0):进位标志?Z(1):零标志?I(2):中断禁止(又称中断屏蔽)标志?D(3):十进制运算标志?B(4):BRK指令标志?V(6):溢出标志?N(7):负数标志? S 这也是条8位寄存器,但是只用其中7位,第5位空着不用。每条指令在执行之后往往会发生进位溢出,以及结果为全零,或是结果为正数、负数的情况,指令执行后常常需要保留这些情况作为条件分支的根据,标志寄存器P就是为了适应这种需要而设置的。在P寄存器中设置了以下七个标志位:第0位 C、第1位 Z、第2位 I、第3位 D、第4位 B、第5位 空 、第6位 V、第7位 N。标志位常常在执行条件转移指令时作为条件判断的依据。标志寄存器中有些标志位可以由置标志位指令进行置位和复位。 m 指令执行完毕后的最高位进位状态,若最高位有进位则使C置为1,若最高位无进位则使C置为0。 w 指令执行完毕后结果为0,则Z被置为1,否则Z被置为0。 此位置0表示准许中断,置1表示禁止中断,但非屏蔽中断请求不受此约束。 此位置0使6502作二进制运算;此位置1则使6502作十进制运算。(D标志位状态仅仅对于后续的加指令和减指令有作用。 此位被置1表示是由于执行了BRK指令而使程序被中止。 指令执行完毕后若产生溢出则此标志槐恢?(用于有符号数的操作)。 ?  x 指令执行完毕后,若结果最高位bit7为1,表示结菏騈标志位被置1;若结果最高位为0,表示结果为正数,N标志被置0。 【概述】?1.立即寻址?2.绝对寻址?3.零页寻址?4.累加器寻址?5.隐含寻址?6.使用X寄存器的绝对变址?7.使用Y寄存器的绝对变址?8.使用X寄存器的零页变址?9.使用Y寄存器的零页变址?10.间接寻址?11.相对寻址?12.先变址(X)间接寻址?13.后变址(Y)间接寻址? 这13种寻址方式在编制程序时可供灵活选用。每条指令可以允许使用哪几种寻址方式,请查阅6502指令表。至于在什么情况下选用哪种寻址方式,这要根据编制程序的具体需要而定。概述如下:立即寻址一般用于设置初始数据。一般说来,累加器寻址,隐含寻址的操作数多放在6502内部的寄存器中,取操作数不必访问存贮器,所以编制程序时使用这类寻址方式的指令可以加快程序执行速度。零页寻址由于占用字节少,执行速度快,因而弥补了6502微处理器内部寄存器数量不多的缺陷,所以在可能情况下,应多使用零页寻址。变址寻址方式用于处理数据块则较为理想。间接寻址常用来存放专用程序的入口地址,这样就使专用程序块可以方便的在存贮器中浮动,只要将程序块的起始地址放在这种间接寻址方式选用的间接地址中即可。相对寻址用跳转步长来代替跳转地址,减少了指令的字节长度,缩短了指令执行时间。后变址(Y)间接寻址常用于动态数据块处理,即数据块在存贮器中存放的位置是可以变化的,只要把数据块首地址置入这种寻址方式所选用的零页地址中即可。先变址(X)间接寻址则用于多个数据块处理。应当注意,在遇到变址计算的寻址方式中,有些寻址方式不允许跨页,如零页X变址,零页Y变址和先变址(X)间接寻址。而有些寻址方式则允许跨页,如绝对X变址,绝对Y变址和后变址(Y)间接寻址。此外唯一只被JMP指令采用的间接寻址方式也不允许跨页。 采用立即寻址(IMMEDIATE)的指令都是两字节指令。指令的操作数部分给出的不是操作数地址而直接就是操作数本身,我们把它称为立即数。这种寻址方式的指令格式为:第1字节:操作码 第2字节:操作数。例如取数指令LDA #$FF,其中#表示后随的是立即数,$是十六进制数表示符号。指令LDA #$FF用十六进制数表示的机器码为:第一字节:A9 第二字节:FF。这条指令的功能是把FF这个立即数送到累加器A。 x ? ? 采用绝对寻址(ABSOLUTE)的指令皆为三字节指令。指令的操作数部分给出的是操作数在存贮器中的有效地址,称为绝对地址,又称直接地址。它的指令格式为:第1字节:操作码 第2字节:操作数地址低字节 第3字节:操作数地址高字节。由于操作数地址是用两个字节(十六位)表示,所以它可以是整个64K存贮器中的任何一个地址。但是注意,这种寻址方式的指令表示成机器码时,操作数地址是低字节在前,高字节在后。例如取数指令LDA $0300的机器码为:第1字节:AD 第2字节:00 第3字节:03。这条指令的功能是把存贮器0300地址单元中存放的操作数取出来送到累加器A。采用零页寻址(ZERO PAGE)的指令皆为两字节指令。64K存贮器可以按高8位地址码划分为256页,高8位为0的地址范围称做零页。零页寻址和绝对寻址的区别在于零页寻址方式中操作数的地址仅限于存贮器的零页范围(0000~00FF)所以在表示操作数的地址码时,就无需表示出高8位地址。它的指令格式为:第1字节:操作码 第2字节:操作数的零页地址。例如取数指令LDA $06的操作数地址只有一个字节06,这就表示它是个零页地址0006,这条指令的机器码为:第1字节:A5 第2字节:06。它的功能是把存贮器0006单元中存放的操作数取出来送到累加器A。 采用累加器寻址(ACCUM)的指令皆为单字节指令。指令操作所需要的操作数存在累加器A中,因此这个操作数地址A并不需要单独占用指令字节来表示,而只要隐含在操髀胱纸谥芯托辛耍哉饫嘀噶罹椭挥幸桓霾僮髀胱纸凇@缪纷笠浦噶頡OL A的机器码为:第1字节:2A。这条指令的功能是把累加器A中的操作数作一次连同进位C在内的循环左移。 x 采用隐含寻址(IMPLIED)的指令亦为单字节指令。隐含寻址和累加器寻址两种方式的区别在于隐含寻址中的操作数地址是除去累加器A以外的其它寄存器X,Y,S或P。这类指令也只有一个操作码字节。例如X减1指令DEX的机器码为:第1字节:CA。这条指令的功能是把X寄存器中的内容减1后再送回X寄存器(X-1→X)此外还有几条栈操作指令或者和栈操作有关的返回指令也都采用了隐含寻址方式,它们的操作数无需单独占用指令字节。 x ? ? 为了方便起见,把这种寻址方式简称为绝对X变址——ABS.X。采用绝对X变址方式的指令皆为三字节指令。这种寻址方式是把一个16位绝对地址作为基地址再和一个作为偏移量的X变址寄存器内容相加,经过这样的变址寻址所得的地址才是操作数的有效地址。它的指令格式旱?字节:操作码 第2字节:基地址低字节 第3字节:基地址高字节。例如取数指令LDA $0350,X的机器码为:第1字节:BD 第2字节:50 第3字节:03。这条指令的功能是把0350+X单元中的操作数取出来送到累加器A。若X=06,就把0350+06=0356单元中的数取出来送到累加器A。这种寻址方式简称为绝对Y变址——ABS.Y。采用绝对Y变址的指令亦为三字节指令。它和绝对X变址方式的区别仅在于变址寄存器用的是Y而不是X。它的指令格式为:第1字节:操作码 第2字节:基地址低字节 第3字节:基地址高字节。例如取数指令LDA $6050,Y的机器码为:第1字节:B9 第2字节:50 第3字节:60。这条指令的功能是把6050+Y单元中的操作数取出来送到累加器A。 x ? 2 这种寻址方式简称为零页X变址——Z·PAGE,X。采用零页X变址方式的指令皆为两字节指令。它和绝对X变址方式的区别仅在于操作数基地址用的是零页地址而不是绝对地址。它的指令格式为:第1字节:操作码 第2字节:零页基地址。例如取数指令LDA $06,X的机器码为:第1字节:B5 第2字节:06。这条指令的功能是把0006+X单元中的操作数取出来送到累加器A。 x < ? 这种寻址方式简称为零页Y变址——Z·PAGE,Y。采用零页Y变址方式的指令亦为两字节指令。它和绝对Y变址方式的区别仅在于操作数基地址用的是零页地址而不是绝对地址。它的指令格式为:第1字节:操作码 第2字节:零页基地址。要注意的是在6502中采用这种寻址方式的指令只有两条LDX和STX。例如取数指令LDX $06,Y的机器码为:第1字节:B6 第2字节:06。这条指令的功能是把0006+Y单元中的操作数取出来送到变址寄存器X。间接寻址方式(INDIRECT)在6502中仅仅用于无条件转移JMP这一条指令,是三字节指令。它的操作数部分给出的是操作数的间接地址,间接地址是指存放操作数有效地址码的地址。它的指令格式为:第1字节:操作码 第2字节:间接地址低字节 第3字节:间接地址高字节。由于操作数有效地址是16位,而每一存贮单元内容只有8位,所以操作数的有效地址必须通过两次间接寻址才能得到。例如无条件转移指令JMP($1000)(指令中的括号即表示间接寻址)。它的机器码为:第一字节:6C 第二字节:00 第三字节:10。为了求得有效地址,第一次要对1000单元间接寻址得到有效地址低8位,第二次再对1000+1=1001单元间接寻址得到有效地址高8位,把两次间接寻址的结果合在一起就是有效地址。此处若是已有1000单元的内容为$FF(用(1000)=FF表示),1001单元内容为$2F(用(1001)=2F表示)那么有效地址就是2FFF。此条指令JMP($1000)的功能就是无条件转移到2FFF地址处。放在0300~0302单元中的JMP($1000)指令执行完毕后就转到2FFF单元处,接着再执行2FFF~3000单元中放的指令LDA #$FF。 x U" ( 相对寻址方式(RELATIVE)只用于条件转移指令,指令长度为两字节。第一字节为操作码,第二字节为条件转移指令的跳转步长,又称为偏移量D。偏移量D的值可正可负,符号位表示在Bit7处,D若为负则用补码表示。它的指令格式为:第一字节:操作码 第二字节:偏移量D。相对寻址方式是用本条指令第一个指令字节所在地址和偏移量D相加来得到有效地址。例如指令BCC*+5放在存贮器$0350和$0351两单元中,这条指令的功能是:如果跳转条件成立(C=0),下条指令的地址(转移地址)就应为0350+5=0355,如果跳转条件不成立,则下条指令地址就应为0350+2=0352。指令中的*即表示本条指令第一个字节存放的地址(在这里是0350)。由于在取出一条指令后,PC表示的已是下条指令所在地址,所以在取出两字节的条件转移指令后,PC就是已加过2的PC值。例如此例中取出指令BCC*+5后,PC=0302因此在相对寻址方式的符号指令转换成对应的机器码时,第二字节中填的偏移量D应是从加过2的PC值0302开始算起的。此例要求从0350单元跳到0355单元,故偏移量D应填为03,因为0352+03=0355。所以BCC*+5这条指令的机器码为:第一字节:90 第二字节03。同理,当偏移量D为负时,例如把BCC*+5改为BCC*-5仍放在$0350和$0351两单元中,那么BCC*-5这条指令执行时,若跳转条件成立(C=0)则转移的目的地址是0350-5=034B,而计算偏移量D是从加过2的PC=0352算起,所以D=F9(-7的补码),因为0352-7=034B,可知BCC*-7这条指令的机器码为:第一字节:90 第二字节:F9。但是为了避免计算偏移量所带来,在使用汇编语言书写源程序时,偏移量都一律用转移目标地址处的符号地址来代替。相对寻址方式的跳转步长范围,若从条件转移指令第一个指令字节所在的PC值开始计算,则应为:-126~+129(十进制)。超过这个范围就不能使用相对寻址方式。 $( 9+ 采用先变址(X)间接寻址方式——(IND,X)的指令皆为两字节指令。这种寻址方式是指先以X作为变址寄存器和零页基地址IND相加IND+X。但是这个变址计算所得到的还只是一个间接地址,还必须再经过两渭浣友爸罚拍艿玫接行У刂贰5谝淮问嵌訧ND+X间址得到有效地址低8位,第二次再对IND+X+1间址得到有效地址高8位。注意IND只能是个零页地址。这种寻址方式的指令格式为:第一字节:操作码 第二字节:零页基地址。例如取数指令LDA ($06,X)的机器码为:第一字节:A1 第二字节:06。若已有变址寄存器X=02,存贮单元(08)=65,(09)=87则根据先变址(X)间接寻址方式规定,执行这条指令的操作数地址低8位是(06+X)=(06+2)=(08)=65,操作数地址高8位是(06+X+1)=(06+2+1)=(09)=87,由此最后得到了操作数有效地址位:8765。所以这条指令的功能是把8765地址单元中的数取出来送到累加器A。注意这种先变址的间接寻址方式中变址寄存器只能用X。 x 采用后变址(Y)间接寻址方式——(IND),Y的指令皆为两字节指令。这种寻址方式是指先对IND部分所指出的零页地址作一次间接寻址,得到一个低8位地址,再对IND+1作一次间接寻址,得到一个高8位地址,最后把这高、低两部分地址合起来作为16位的基地址,并以Y为变址寄存器进行变址计算就得到了操作数的有效地址。注意,IND是个零页地址。这种寻址方式指令的格式为:第一字节:操作码 第二字节:零页间接地址。例如取数指令LDA ($06),Y的机器码为:第一字节:B1 第二字节:06。若已有变址寄存器Y=02,存贮单元(06)=65,(07)=87为了得到有效地址,先要对IND=06单元作第一次间接寻址,得到(06)=65,再对IND+1=06+1=07单元作第二次间接寻址,得到(07)=87,最后把8765合起来作为基地址,并以Y为变址寄存器进行变址计算就得到了操作数的有效地址为:8765+02=8767。所以这条指令的功能是把8767地址单元中的数取出来送到累加器A。注意这种后变址的间接寻址方式中变址寄存器只能是用Y。

作者: Cwj
  评论这张
 
阅读(181)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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