assembly 努力理解6502汇编语言的“Y索引的零页间接地址”

w51jfk4q  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(154)

这是专门针对内斯控制台的,它使用了一个稍微修改过的8位6502微处理器。下面是代码,我的评论解释了每一行的作用,就我的基本理解而言(如果我误解了任何一行,请告诉我):

lda #$00   ; Load the accumulator (A register) with the immediate value 0x00
sta $02    ; Store the value in the accumulator into memory address $02

lda #$03   ; Load the accumulator with the immediate value 0x03
sta $03    ; Store the value in the accumulator into memory address $03

lda #$14   ; Load the accumulator with the immediate value 0x14
sta $0302  ; Store the value in the accumulator into memory address $0302

clc        ; Clear the carry flag (CLC instruction)
lda #$10   ; Load the accumulator with the immediate value 0x10
ldy #$02   ; Load the Y register with the immediate value 0x02

adc ($02),y

字符串
看起来,在最后一行adc ($02)之前,存储器地址和寄存器的状态如下:

  • $02 = 0x00
  • $03 = 0x03
  • $0302 = 0x14
  • A = 0x10
  • Y = 0x02

因此,最后一行在我看来似乎表明了以下几点:

  1. $02 + Y
  2. 0x00 + 0x02
  3. 0x02,存储在该地址的值为0x00
    1.现在我们将0x00添加到一个寄存器,它只是0x10,但显然结果应该如下,因此我有点困惑,我犯了一个错误:
    A=$24 X=$00 Y=$02
    一些额外的说明,假设以下是正确的:
  • 内存位置$02和$03中的值先前已设置为指定地址$0300。*

这是什么时候发生的?我特别想理解这行。它们都指定为地址$0300吗?

dfty9e19

dfty9e191#

adc ($02),y是间接索引寻址的一个例子。$02周围的括号表示$02不包含操作数,但$02$03一起包含一个16位地址,当添加到y时包含操作数。
下面是adc ($02),y发生的序列

  1. CPU在地址$02加载数字,即$00
  2. CPU在$03加载地址,即$03
  3. CPU从它完成的两次加载中形成一个16位数。6502是小端字节序,因此低地址的数字成为低字节。我们最终得到$0300。这有时称为基址
  4. CPU将y与基址相加得到$0302。这个新的数字用作查找操作数的地址。
  5. CPU加载$0302处的字节,即$14,并将其添加到累加器中。

相关问题