【问题标题】:6502 indirect addressing issues6502 间接寻址问题
【发布时间】:2016-06-04 14:38:37
【问题描述】:

我在使用 6502 机器的以下代码时遇到了一些问题:

C000 LDA #$00
C002 STA $FE
C004 LDA #$20
C006 STA $FF
C008 LDY #$08
C00A LDX #$00
C00C DEY
C00D CPY #$FF
C00F BEQ $C01B
C011 LDA ($FE),Y
C013 CMP #$2F
C015 BPL $C00C
C017 INX
C018 JMP $C00C
C01B BRK

练习存储从地址 2000 开始的数字 2、1 和 4,并说出 A、X 和 Y 的值。

我正在用笔和纸“运行”我的代码,但由于以下原因我卡在了 C011:
LDA ($FE),Y
它将存储在以这种方式计算的内存地址的值加载到 A 中:

  1. 选择$FE值(一开始是00)
  2. 添加 Y 的值(第一次迭代时为 7)
  3. 我现在有 07
  4. 用存储在 07 的值加载 A

这是正确的吗?我错过了什么吗? 如果不是,我应该在哪里使用存储在2000 20012002 中的值?

提前谢谢..

【问题讨论】:

    标签: assembly 6502 commodore


    【解决方案1】:

    选择 $FE 值(最初是 00)

    实际上,它从$FE加载一个16位的值,然后将Y加到该值上得到有效地址。

    您已将$00 存储在$FE$20 存储在$FF,因此从$FE 加载的16 位值将是$2000

    我在哪里使用存储在 2000 2001 和 2002 中的值

    Y 的值为0、1 和2 时。循环将继续,直到Y 从0 环绕到$FF。


    参见6502.txt 中的“10) 后索引间接”

    【讨论】:

    • 很容易记住后间接因为括号:lda ($00,x)$00 + x的内存地址加载,但lda ($00),y从(0中的内存地址)+ y加载。 lda ($00,x) 在解除引用之前添加 X,但 lda ($00),y 在解除引用之后添加 Y。
    • 假设$2007(第一次迭代)的值为零是否安全?
    【解决方案2】:

    不,你不正确。你错过了LDA ($FE),Y 的含义,它使用indirect indexed(而不是索引间接)寻址模式。间接表示括号内的值是 16 位指针的地址,低字节在前。那是你之前设置的 00 美元和 20 美元,所以是 2000 美元。

    索引是用 Y 完成的,你的循环退出条件是基于 Y 的,所以你有。 A 的值是最后读取的值,所以你也有。

    但是您对 Weather Vane 答案的评论和问题非常相关。由于CMP #$2F 和随后的BPLINX,其他内存位置中的值很重要。 CMP 的作用类似于减法,如果比较寄存器 see here.

    所以 X 的值取决于其他内存值。

    【讨论】:

    • 是的,我知道。事实是,我被要求“从$2000 开始加载我的徽章编号的最低有效字节(解释为十六进制值)。我的编号是0648214,所以我将在$2000、@987654331 中加载14 @ 在$200164$2002。(是的,我意识到我在问题中的值是错误的,但没有任何变化)。这样做,我不知道从$2003$2007 的值. 我在我的虚拟机中转储内存很多次,未设置的值总是为零。我觉得很愚蠢
    • 不需要愚蠢。 ; - ) 组装非常繁琐,直到您掌握了窍门。无论如何,如果您使用的是虚拟机,那么希望它记录初始内存状态。在任何情况下,听起来内存都预设为零(尽管真机不一定是这种情况)。任何位置值 > #$2F 都会触发代码中的 INX。
    • 所以我可以安全地假设为零吗?
    • VICE 模拟了我很少使用的各种 Commodore 系统,但它具有 options to initialize memory 的各种模式,大概就像当时在其他真实系统上发现的那样。 Apple II 有重复的 00 和 FF 以及偶尔的随机值。无论如何,零是分配的安全赌注。 ; - ) 玩得开心,祝你好运。
    • @magicleon 关于$2000 加载的数字,我相信您的徽章编号需要 ASCII 字符。即30 36 34 38 32 31 34 这是因为CMP $2F / BPL 本质上是在问“这个字节是$30 还是更大?”
    【解决方案3】:

    这种寻址模式称为后索引间接,仅用于Y 寄存器。有效地址由地址$00FE$00FF 的(小端)内容构成,Y 添加到该地址。

    您将$2000 存储在这两个页面零位置,而Y 保存7,因此有效地址为$2007,超出了您希望访问的三个字节数据。

    注意,可以直接访问数组

    LDA $2000,Y
    

    但间接方法的优点是您不需要事先知道地址,例如您可以根据运行时条件选择几个表中的一个进行索引。

    【讨论】:

    • 嗯,那么A首先加载了$2007的内容。问题是,我从来没有在$2007 中加载过任何东西......认为内容为零是否安全?我不这么认为..
    • 使用一种称为“未定义行为”的高级语言。如果您没有在地址$2007 设置内容(直接在代码中或因为它是ROM 中的预定义位置),那么您不能假设它的内容。启动时 volatile RAM 可能 的内容会设置为常规模式,但这只是硬件的一个怪癖。如果您使用的是上面评论的虚拟机,则RAM 可能已被主机全部初始化为0,但这不是您应该依赖的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多