Assembly 6502年致辞

Assembly 6502年致辞,assembly,6502,addressing-mode,Assembly,6502,Addressing Mode,我最近开始在6502汇编中编程,遇到了一个问题。我希望能够存储一个从地址$0300开始的16位内存地址,然后我希望在该地址存储一个值 例如,存储地址$2016将是$0300:#$20,$0301:#$16。然后我想读取这两个字节,并将值存储为$2016。我似乎找不到一种允许这样做的寻址模式,是否有类似的情况,或者我必须使用零分页。您需要找到两个零页位置,并通过它们进行索引。间接寻址只能通过零页进行。事实上,没有一种零页间接模式不使用索引 假设$02和$03可用。将字节复制到那里 ; Store

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


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

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

假设
$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是little endian,这意味着它在低位地址需要低位字节。您应该真正遵循6502惯例并存储字节,以便
$300
包含
$16
$301
包含
$20

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

事实上,你不能直接这么做。正如你所说,你可以通过零页。好吧,65C02指令集中有STA(zp)。如果代码在RAM中,这是一个常见且可取的习惯用法。@NickWestgate事实上,在Commodore PET中,这个技巧只在一个地方使用,但代码是“安装”的在零页中,以便前两条
STA
指令可以使用零页寻址。@JeremyP:像这样吗@仙人掌是的,虽然有趣的是,你并没有通过把代码放在那里来真正节省那么多的周期。