我最近开始用6502汇编语言编程,但遇到了问题。我希望能够存储一个从$ 0300开始的16位内存地址,然后我想在该地址存储一个值。
例如,存储地址$ 2016将为$ 0300:#$ 20,$ 0301:#$ 16。然后我想读取这两个字节并在$ 2016中存储一个值。我似乎找不到能够允许这种寻址的寻址模式,是否有类似的东西,或者我必须使用零分页。
答案 0 :(得分:5)
您需要找到两个零页面位置并通过这些位置进行索引。间接寻址仅可通过零页进行。而且,实际上,没有零页间接模式也不使用索引。
假设$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
。
答案 1 :(得分:4)
$ 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