【问题标题】:Addressing in 6502在 6502 中寻址
【发布时间】:2018-09-28 07:20:47
【问题描述】:

我最近开始在 6502 汇编中编程,但遇到了问题。我希望能够存储一个从地址 $0300 开始的 16 位内存地址,然后我想在该地址存储一个值。

例如存储地址 $2016 将是 $0300:#$20, $0301:#$16。然后我想读取这两个字节并将一个值存储为 2016 美元。我似乎找不到允许这样做的寻址模式,是否有类似的东西或者我必须使用零分页。

【问题讨论】:

  • 确实你不能直接这样做。如你所说,你可以通过零页。

标签: assembly 6502 addressing-mode


【解决方案1】:

您需要找到两个零页面位置并通过它们进行索引。间接寻址只能通过零页获得。而且,事实上,没有不使用索引的零页面间接模式。

假设$02$03 可用。将字节复制到那里。

; Store the address you want to access in zp memory
lda $300
sta $03     ; Note I'm swapping the bytes (see below)
lda $301
sta $02
; access the address indirectly through zero page
ldx #0
lda $data
sta ($02,x) ; x is zero so address used is $02

我在将字节复制到零页时交换字节的原因是您已将地址(在您的问题中)以大端顺序存储在$300,即低地址的高字节。 6502 是小端的,这意味着它需要低地址的低字节。您应该真正遵循 6502 约定并存储您的字节,以便 $300 包含 $16 并且 $301 包含 $20

【讨论】:

  • 嗯,65C02指令集中有STA(zp)。
【解决方案2】:

$0300:#$20,$0301:#$16。然后我想读取这两个字节并在 $2016 处存储一个值。

如果代码是可写的,则存在另一种不太可取的方法:可以将地址放入绝对存储指令的操作数字节中。

 LDA $301
 STA stins+1
 LDA $300
 STA stins+2
stins:
 STX $FFFF ; value in X; FFFF is placeholder for address

【讨论】:

  • 如果代码在 RAM 中,这是一个常见且可取的习惯用法。
  • @NickWestgate 实际上 IIRC,在 Commodore PET 中,这个技巧在一个地方使用,但代码被“安装”在零页面中,因此前两个 STA 指令可以使用零页面寻址。
  • @JeremyP:喜欢这个吗? retrocomputing.stackexchange.com/q/91/115
  • @Cactus 是的,尽管有趣的是,您并没有通过将代码放在那里真正节省那么多周期。
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多