




已阅读5页,还剩80页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4. 指令 指令这部分是我讲述的重点,但这不表示寄存器和寻址方式不重要!切记要先看完xade的文档再继续。 SFC的指令可以分成几大类: 5.1 赋值和存储 5.2 数学运算 5.3 逻辑运算 5.4 分支和子程序 5.5 设置状态寄存器 5.6 寄存器之间的数据交换 5.7 堆栈操作 5.8 其它 4.1 赋值和存储 LDA 这个指令是直接把一个数字放入A寄存器,或者从内存中取一个数字放入A寄存器,依据寻址方式的不同。它们类似于C里面的a=5这样的赋值语句。 例:A寄存器原有值为$2390,执行LDA指令后,A寄存器的内容变成$FFFF。 A: 2390 LDA #$FFFF A: FFFF LDX 和LDA很相似,唯一区别是数字要放入X寄存器,而不是A寄存器。 LDY 和LDA很相似,唯一区别是数字要放入Y寄存器,而不是A寄存器。 STA 既然有把内存单元读入寄存器的指令,那当然也要有把寄存器内容写回内存的指令。STA指令就是把A寄存器的内容写入指定的内存单元,具体要写入哪个内存单元依据寻址方式的不同而不同。 例:A寄存器现在的值为$000F,执行STA指令后,这个值被写入内存单元$2100。 A: 000F STA $2100 STX 和STA很相似,唯一区别是把X寄存器的内容写入指定的内存单元,而不是A寄存器。 STY 和STA很相似,唯一区别是把Y寄存器的内容写入指定的内存单元,而不是A寄存器。 STZ 这个指令是把指定的内存单元置零,即写入00到指定单元。它等同于执行 LDA #$0000 STA 指定内存单元 4.2 数学运算 ADC 加法指令 这个指令是直接把一个数与A寄存器中的数相加,或者从内存中取一个数与A寄存器相加,依据寻址方式的不同。相加结果放回A寄存器。它类似于C里面的 a = a + num 这样的赋值语句。但是,ADC这个指令一般叫做“带进位加法”,因为如果状态寄存器P中的“进位”位的值是1, 那么要在结果上再加1,放回A寄存器。也就是说,ADC执行的是3个数的相加:A寄存器 + 操作数 + P寄存器的进位位 例:A寄存器原有值为$2390,P寄存器的进位位是1。执行下列指令后,A寄存器的内容变成$23E1。 A: 2390 ADC #$0050 A: 23E1 SBC 减法指令 这个指令是从A寄存器中减去一个直接数,或减去一个内存中的数,依据寻址方式的不同。结果放回A寄存器。它类似于C里面的 a = a - num 这样的赋值语句。但是,SBC这个指令一般叫做“带借位减法”,因为如果状态寄存器P中的“进位”位的值是1, 那么要在结果上再减1,放回A寄存器。也就是说,SBC执行的是3个数的相减:A寄存器 - 操作数 - P寄存器的进位位 例:A寄存器原有值为$0060,P寄存器的进位位是1。执行下列指令后,A寄存器的内容变成$000F。 A: 0060 SBC #$0050 A: 000F DEC 本指令很简单,就是把A寄存器或指定地址的数值减一。类似于C语言中的-操作,即a-。 例: A: 0001 DEC A; A: 0000 DEX 把X寄存器的数值减一。类似DEC DEY 把Y寄存器的数值减一。类似DEC INC 本指令很简单,就是把A寄存器或指定地址的数值加一。类似于C语言中的+操作,即a+。 例: A: 0001 INC A; A: 0002 INX 把X寄存器的数值加一。类似INC INY 把Y寄存器的数值加一。类似INC CMP 比较指令 这个指令执行 A寄存器 减去操作数的运算,但是结果不保存,也就是说A寄存器和操作数都不受影响,唯一受影响的是状态寄存器P。 例如:A寄存器值为$0020,执行CMP #$20后,A寄存器的值还是$0020不变;而P寄存器的Z标志位被置为1 A: 0020 P: -mx-i- CMP #$20 A: 0020 P: -mx-iz- BEQ next 这个指令一般是配合条件转移语句使用,上面那两条指令的效果类似于C语言中的 if (a=20) goto next CPX 与CMP类似,但是是比较X寄存器 与操作数,寻址方式也只有3种。 CPY 与CMP类似,但是是比较Y寄存器 与操作数,寻址方式也只有3种。 ASL 算术左移 把操作数的全部二进制位,每一位向左移一位,最后一位补零。实际相当于乘以2。这个指令常被用来做简单乘法。对比想想看,对我们熟悉的一个十进制数,例如345,左移一位并补零,是3450,相当于乘以10。 例:执行下列指令后,A寄存器的值翻了一倍 A: 0010 ASL A A: 0020 LSR 算术右移 把操作数的全部二进制位,每一位向右移一位,最高位补零。实际相当于除以2。这个指令常被用来做简单除法。C语言中类似的指令是整除操作符a%2 ROL 逻辑左移 跟ASL有点类似,把操作数的全部二进制位,每一位向左移一位,最高位移到P寄存器的“进位”位,而最后一位填上“进位”位的原值。 例:A寄存器值为$8000,P寄存器进位位是1,那么执行下列指令后,A的值为$0001 A: 8000 ROL A A: 0001 ROR 逻辑右移 类似于上面的ROL,只是方向相反。/+/6502 微处理器 下面的大多数信息都在 Commodore 64 Programmers Reference Manual 中简单的谈到过,因为它在电 工结构上是可用的,并且这片文档和6502文档没有什么差别,毕竟他们都是6500家族的. 我在合适的地方 做了信息的修改和添加. 理论上你可以用任何你可以找到的代码来模拟6510 (C64处理器).+-+| 6502微处理器中的寄存器 |+-+ 绝大多数的计算都在微处理器中进行. 寄存器是处理器中特别的储存块,它别用来取出和保存处理的信息. 6502有以下的寄存器:+-+| 累加器 (Accumulator) |+-+ 这是微处理器里最重要的寄存器. 很多种机器语言指令都允许你拷贝内存中某个位置的内容到累加器中,允 许你拷贝累加器中的内容到内存某个位置中,直接修改累加器或其他寄存器的内容而不影响到任何内存. 累 加器是唯一有执行数学计算指令的寄存器.+-+| X 索引寄存器 (X Index Register) |+-+ 它是非常重要的寄存器. 那里有几乎所有你能够改变累加器的指令. 但是有一些只有 X 寄存器能够执行的指 令. 许多机器语言指令都允许你拷贝内存的某个位置中的内容到 X 寄存器,拷贝 X 寄存器中的内容到内存 的某个位置中,直接修改 X 或者其他寄存器的内容.+-+| Y 索引寄存器 (Y Index Register) |+-+ 它是非常重要的寄存器. 那里有几乎所有你能够改变累加器和 X 寄存器的指令. 但是有一些只有 X 寄存器能 够执行的指令. 许多机器语言指令都允许你拷贝内存的某个位置中的内容到 Y 寄存器,拷贝 Y 寄存器中的内 容到内存的某个位置中,直接修改 Y 或者其他寄存器的内容.+-+| 状态寄存器 (Status Register) |+-+ 这个寄存器包括8个 标记 (标记 = 显示某些事情发生或者没有发生的东西). 这个寄存器中的位的值得修改 依赖于算术和逻辑运算的结果. 位被描述如下: Bit No. 7 6 5 4 3 2 1 0 S V B D I Z C Bit 0 - C - 进位标记 (Carry flag): 这个标记保存了任何算术操作的大多数重要的位的进位. 然而在减法操 作中,这个标记被清空 - 需要借位责备设置为0,不需要借位则被设置为1. 进位标记也在逻辑操作转移 (shift)和交替 (rorate) 中被使用. Bit 1 - Z - 零标记 (Zero flag): 当任何的算术或逻辑操作产生零结果的时候被设置为1,产生非零结果时被 设置为0. Bit 2 - I: 这是一个允许/禁止中断标记. 如果被设置,则禁止中断. 如果被清空,则允许中断. Bit 3 - D: 这是十进制模式状态标记. 当这个标记被设置,并且需要进位的加或者需要进位的减被执行,原始 值就被转换成为有效的 BCD 码 (Binary Codec Decimal: 二-十进制码,例如: 0x00 - 0x99 = 0 - 99). 生成 的结果仍旧是 BCD 码. Bit 4 - B: 当一个软件中断 (BRK 指令)被执行的时候,这个标记被设置. Bit 5: 未被使用. 任何时候都假定是逻辑1. Bit 6 - V - 溢出标记 (Overflow flag): 当一个算术操作产生出一个过大的结果 (比一字节能描述的大), V 标 记被设置. Bit 7 - S - 信号标记 (Sign flag): 当一个操作的结果被否定时,这个标记被设置; 当结果被肯定是,标记被清 空.+-+| 指令计数器 (Program Counter) |+-+ 这个寄存器保存着当前被执行的机器语言指令的地址. 由于 Commodore VIC-20 的操作系统一直在运行着 (或者, 任何操作系统),指令计数器总是改变着. 它只有在通过某种方法中断微处理器的时候停止.+-+| 栈指针 (Stack Pointer) |+-+ 这个寄存器保存了栈中第一个空区域的位置. 栈是被机器语言程序和计算机使用来临时储存的.+-+| 地址模式 (Addressing Modes) |+-+ 指令需要操作数来操作. 有多种方法来标记处理器从哪里得到操作数. 被用来这样做的不同的方法叫做地址模式. 6502提供11种模式,下面有描述. 1) 快速模式 (Immediate) 在这种模式中,操作数的值在指令中被给出. 在汇编语言中,这种模式以操作数前加 # 来标记. 例如: LDA #$0A - 意思是 load the accumulator with the hex value 0A 在机器代码中,不同的模式以不同的代码标记. 所以 LDA 将依赖于不同的地址模式被翻译成不同的代码. 在这种 模式中,代码是: $A9 $0A 2) & 3) 完全和完全零页面模式 (Absolute and Zero-page Absolute) 在这种模式中,操作数地址被给出. 例如: LDA $31F6 - (汇编语言) $AD $31F6 - (机器代码) 如果地址不是在零页面 - 也就是,任何高字节不是00的地址 - 只有一个字节需要给出. 处理器自动将高字节填为00. 例如: LDA $F4 $A5 $F4 注意不同的模式中不同的指令代码. 同时注意对于两字节地址,低字节先被储存,例如: LDA $31F6 在内存中被存为三个字节: $AD $F6 $31. 绝对零页面通常被叫做零页面. 4) 隐含模式 (Implied) 这种模式不需要任何操作数地址. 它们隐含在指令中. 例如: TAX - (将累加器中的值传给 X 寄存器) $AA 5) 累加器 (Accumulator) 这种模式中,指令操作累加器中的数据,所以不需要操作数. 例如: LSR - 逻辑位右移 (logical bit shift right) $4A 6) & 7) 索引和零页面索引 (Indexed and Zero-page Indexed) 在这种模式中,被给出的地址的值将被与 X 或 Y 索引寄存器中的值相加以成为真正的操作数地址. 例如: LDA $31F6, Y $D9 $31F6 LDA $31F6, X $DD $31f6 注意不同的操作代码将由被使用的索引寄存器确定. 在零页面中,你需要注意,X 与 Y 寄存器的值都是不可互换的. 大多数能够以零页面索引方式工作的都仅用于 X 索引. 例如: LDA $20, X $B5 $20 8) 间接 (Indirect) 这种模式仅适用于 JMP 指令 - 转到新位置 (JuMP to new location). 它的标志是操作数上的圆括号. 操作数是保 存有新位置的字节的地址. 例如: JMP ($215F) 假定: - byte value $215F $76 $2160 $30 这个指令将获取 $215F, $2160 两个字节中的值,然后把它当作转到的地址 - 也就是,$3076 (记得地址中的低字节 先被存储). 9) 预索引间接 (Pre-indexed indirect) 这种模式是将一个零页面地址加上 X 寄存器中的内容,然后给出保存操作数地址的字节的地址. 间接模式在汇编语言 中是由圆括号标记. 例如: LDA ($3E, X) $A1 $3E 假定: - byte value X.reg $05 $0043 $15 $0044 $24 $2415 $6E 这条指令将被如下执行: (i) $3E + $05 = $0043 (ii) 获取 $0043, $0044 两字节中保存的地址 = $2415 (iii) 读取 $2415 中的内容 - 也就是,$6E - 进入累加器 10) 传递索引间接 (Post-indexed indirect) 在这种模式中,一个零页面地址的内容 (包括其后面的字节) 给出一个间接地址,该地址中的内容将与 Y 寄存器中的 值相加生成出操作数的真实地址. 同样,在汇编语言中,这个指令由圆括号标记. 例如: LDA ($4C), Y 注意,圆括号只括起来了指令中的第二个字节,因为它是做间接操作的一部分. 假定: - byte value $004C $00 $004D $21 Y.reg $05 $2105 $6D 这条指令将被如下执行: (i) 读取字节 $4C, $4D 中的内容 = $2100 (ii) 与 Y 寄存器中的内容相加 = $2105 (iii) 读取字节 $2105 中的内容 - 也就是,$6D 到累加器. 注意,这种模式中,仅使用了 Y 寄存器. 11) 关系 (Relative) 这种模式使用分支状况指令 (Branch-on-Condition instructions). 这可能是你使用最多的一种模式. 一个单字节值 将被加到指令计数器中,然后程序就从那个地址继续执行. 这个单字节数将被认为是一个有符号数 - 也就是说,如果 7号位是1,则0-6号位给出的信息将被否定; 如果7号位是0,则此数被肯定. 当升至127字节时,这种模式起用了一种至 任何方向的分支转移 (Branch displacement). 例如: 位号: 7 6 5 4 3 2 1 0 有符号值 无符号值 值 1 0 1 0 0 1 1 1 -39 $A7 值 0 0 1 0 0 1 1 1 +39 $27 指令范例: BEQ $A7 $F0 $A7 这个指令将检查零状态位. 如果被设置,十进制39将从指令计数器中减去,然后程序从那个地址开始执行 (应该是减去 39后的指令计数器中的地址 - 译注). 如果零状态位没有被设置,程序从接下来的地址执行. 注意: a) 在分支指令后,分支转移之前,指令计数器指向指令的开始处. b) 分支状况指令通过检查状态寄存器中的相关状态位来工作. c) 如果你发现你需要的分支超过127个字节,可使用相反的分支状态和一个 JMP. +- | | MCS6502 MICROPROCESSOR INSTRUCTION SET - ALPHABETIC SEQUENCE | +- | | ADC Add Memory to Accumulator with Carry | AND AND Memory with Accumulator | ASL Shift Left One Bit (Memory or Accumulator) | | BCC Branch on Carry Clear | BCS Branch on Carry Set | BEQ Branch on Result Zero | BIT Test Bits in Memory with Accumulator | BMI Branch on Result Minus | BNE Branch on Result not Zero | BPL Branch on Result Plus | BRK Force Break | BVC Branch on Overflow Clear | BVS Branch on Overflow Set | | CLC Clear Carry Flag | CLD Clear Decimal Mode | CLI Clear interrupt Disable Bit | CLV Clear Overflow Flag | CMP Compare Memory and Accumulator | CPX Compare Memory and Index X | CPY Compare Memory and Index Y | | DEC Decrement Memory by One | DEX Decrement Index X by One | DEY Decrement Index Y by One | | EOR Exclusive-Or Memory with Accumulator | | INC Increment Memory by One | INX Increment Index X by One | INY Increment Index Y by One | | JMP Jump to New Location | +- -+ | MCS6502 MICROPROCESSOR INSTRUCTION SET - ALPHABETIC SEQUENCE | | -+ | JSR Jump to New Location Saving Return Address | | LDA Load Accumulator with Memory | LDX Load Index X with Memory | LDY Load Index Y with Memory | LSR Shift Right One Bit (Memory or Accumulator) | | NOP No Operation | | ORA OR Memory with Accumulator | | PHA Push Accumulator on Stack | PHP Push Processor Status on Stack | PLA Pull Accumulator from Stack | PLP Pull Processor Status from Stack | | ROL Rotate One Bit Left (Memory or Accumulator) | ROR Rotate One Bit Right (Memory or Accumulator) | RTI Return from Interrupt | RTS Return from Subroutine | | SBC Subtract Memory from Accumulator with Borrow | SEC Set Carry Flag | SED Set Decimal Mode | SEI Set Interrupt Disable Status | STA Store Accumulator in Memory | STX Store Index X in Memory | STY Store Index Y in Memory | | TAX Transfer Accumulator to Index X | TAY Transfer Accumulator to Index Y | TSX Transfer Stack Pointer to Index X | TXA Transfer Index X to Accumulator | TXS Transfer Index X to Stack Pointer | TYA Transfer Index Y to Accumulator | -+ The following notation applies to this summary: A Accumulator EOR Logical Exclusive Or X, Y Index Registers fromS Transfer from Stack M Memory toS Transfer to Stack P Processor Status Register - Transfer to S Stack Pointer A, C N Z C I D V / / / _ _ / (Ref: 2.2.1) +-+-+-+-+-+ | Addressing Mode| Assembly Language Form| OP CODE |No. Bytes|No. Cycles| +-+-+-+-+-+ | Immediate | ADC #Oper | 69 | 2 | 2 | | Zero Page | ADC Oper | 65 | 2 | 3 | | Zero Page,X | ADC Oper,X | 75 | 2 | 4 | | Absolute | ADC Oper | 60 | 3 | 4 | | Absolute,X | ADC Oper,X | 70 | 3 | 4* | | Absolute,Y | ADC Oper,Y | 79 | 3 | 4* | | (Indirect,X) | ADC (Oper,X) | 61 | 2 | 6 | | (Indirect),Y | ADC (Oper),Y | 71 | 2 | 5* | +-+-+-+-+-+ * Add 1 if page boundary is crossed. AND AND memory with accumulator AND Operation: A / M - A N Z C I D V / / _ _ _ _ (Ref: 2.2.3.0) +-+-+-+-+-+ | Addressing Mode| Assembly Language Form| OP CODE |No. Bytes|No. Cycles| +-+-+-+-+-+ | Immediate | AND #Oper | 29 | 2 | 2 | | Zero Page | AND Oper | 25 | 2 | 3 | | Zero Page,X | AND Oper,X | 35 | 2 | 4 | | Absolute | AND Oper | 2D | 3 | 4 | | Absolute,X | AND Oper,X | 3D | 3 | 4* | | Absolute,Y | AND Oper,Y | 39 | 3 | 4* | | (Indirect,X) | AND (Oper,X) | 21 | 2 | 6 | | (Indirect,Y) | AND (Oper),Y | 31 | 2 | 5 | +-+-+-+-+-+ * Add 1 if page boundary is crossed. ASL ASL Shift Left One Bit (Memory or Accumulator) ASL +-+-+-+-+-+-+-+-+ Operation: C - |7|6|5|4|3|2|1|0| - 0 +-+-+-+-+-+-+-+-+ N Z C I D V / / / _ _ _ (Ref: 10.2) +-+-+-+-+-+ | Addressing Mode| Assembly Langu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 夫妻间忠诚承诺与粉丝影响力合作合同
- 烧伤面积评估与护理要点
- 网络直播导播台租赁及现场灯光音响调试服务合同
- 艺术培训机构教室租赁与课程研发合同
- 婚后家庭财产共有及分割管理细则协议
- 高清体育赛事直播权授权及赛事周边产品开发协议
- 版权侵权赔偿补充协议书
- 票务退改签服务补充协议
- 母婴护理服务质量规范执行与客户权益维护协议
- 网络教育平台兼职教师答疑合同
- 智慧泵站标准化建设解决方案-v2.0
- 2021年山东省青岛市中考数学试卷
- 金属非金属地下矿山六大系统建设规范解析
- GB 24544-2009坠落防护速差自控器
- 小学语文人教三年级下册 《小海伦的秘密》整本书导读课(改)
- 酒类行业中国酒类品类创新研究报告:年轻人的酒
- 新中国的重大科技成就(精编版)
- 食堂竞标书范文(精选十四篇)
- 检维修作业许可证
- 公司法自学辅导顾功耘北京大学出版社
- 桥梁施工基础知识培训图文并茂
评论
0/150
提交评论