我摘录的凌阳6502单片机的汇编指令

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

●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;

●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微处理器中的寄存器 |

+------------------------+

相关文档
最新文档