6502 间接访问模式
6502 Indirect acces mode
我的问题是关于 6502 汇编语言的。我正在尝试使用此网站学习它 https://skilldrick.github.io/easy6502/。
关于寻址模式的话题。我不明白间接寻址模式。请参阅下面的源代码示例。
LDA #
STA $f0
LDA #$cc
STA $f1
JMP ([=10=]f0) ;dereferences to $cc01
为什么 JMP ([=11=]f0)
被取消引用为 $cc01
而不是 cc
。
我的记忆是这样的
00f0: 01 cc 00 00 00 00 00 00 00 00 00 00 00 00 84
这里你看到 00f0
以 01
开头,然后是 cc
,所以在我看来跳转指令将取消引用 cc
更合乎逻辑,但是为什么这会以某种方式逆转?
6502 是小端。这意味着对于占用两个字节的 16 位值,最低字节存储在最低地址。在两个 STA
之后,您有:
00f0: 01
00f1: cc
JMP
指令将 f0
处的字节加载到目标地址的低字节,并将 f1
处的字节加载到目标地址的高字节,这意味着你跳转到cc01
。
关于“为什么 这会以某种方式颠倒过来?”的附加答案:小端遵循进位运行的方向,因此实施起来更便宜。在你掌握所有信息之前,你已经有足够的信息开始做算术了。
这是6502在处理一条$aabb, X
指令时的循环分解:
- 获取指令
- 获取操作数地址的低字节
- 将操作数地址低字节加入X寄存器,取操作数地址高字节
- 从地址读取高字节$aa,低字节$bb + X,如果有进位则计算出$aa+1,待会儿使用...
- 如果有进位则从正确的地址读取
因此,如果那是 LDA
,那么如果您不跨越页面边界,则成本为四个周期,如果跨越则为五个。现在想象地址以大端格式存储。那么:
- 获取指令
- 获取操作数地址的高字节
- 获取操作数地址的低字节
- 将X加到操作数地址的低字节
- 从地址读取高字节$aa,低字节$bb + X,如果有进位则计算出$aa+1,待会儿使用...
- 如果有进位则从正确的地址读取
所以你增加了一个周期的成本。拿到低字节后才能开始,一个周期后才拿到低字节。
因此,如果您不安排首先获取最低字节,那么您就是在浪费时间。
我的问题是关于 6502 汇编语言的。我正在尝试使用此网站学习它 https://skilldrick.github.io/easy6502/。
关于寻址模式的话题。我不明白间接寻址模式。请参阅下面的源代码示例。
LDA #
STA $f0
LDA #$cc
STA $f1
JMP ([=10=]f0) ;dereferences to $cc01
为什么 JMP ([=11=]f0)
被取消引用为 $cc01
而不是 cc
。
我的记忆是这样的
00f0: 01 cc 00 00 00 00 00 00 00 00 00 00 00 00 84
这里你看到 00f0
以 01
开头,然后是 cc
,所以在我看来跳转指令将取消引用 cc
更合乎逻辑,但是为什么这会以某种方式逆转?
6502 是小端。这意味着对于占用两个字节的 16 位值,最低字节存储在最低地址。在两个 STA
之后,您有:
00f0: 01
00f1: cc
JMP
指令将 f0
处的字节加载到目标地址的低字节,并将 f1
处的字节加载到目标地址的高字节,这意味着你跳转到cc01
。
关于“为什么 这会以某种方式颠倒过来?”的附加答案:小端遵循进位运行的方向,因此实施起来更便宜。在你掌握所有信息之前,你已经有足够的信息开始做算术了。
这是6502在处理一条$aabb, X
指令时的循环分解:
- 获取指令
- 获取操作数地址的低字节
- 将操作数地址低字节加入X寄存器,取操作数地址高字节
- 从地址读取高字节$aa,低字节$bb + X,如果有进位则计算出$aa+1,待会儿使用...
- 如果有进位则从正确的地址读取
因此,如果那是 LDA
,那么如果您不跨越页面边界,则成本为四个周期,如果跨越则为五个。现在想象地址以大端格式存储。那么:
- 获取指令
- 获取操作数地址的高字节
- 获取操作数地址的低字节
- 将X加到操作数地址的低字节
- 从地址读取高字节$aa,低字节$bb + X,如果有进位则计算出$aa+1,待会儿使用...
- 如果有进位则从正确的地址读取
所以你增加了一个周期的成本。拿到低字节后才能开始,一个周期后才拿到低字节。
因此,如果您不安排首先获取最低字节,那么您就是在浪费时间。