在6502中寻址

时间:2018-09-28 07:20:48

标签: assembly 6502 addressing-mode

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

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

2 个答案:

答案 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