关于NES平台6502汇编“零页间接Y变址寻址”的技术问询
NES(6502变体)汇编指令
adc ($02),y执行逻辑疑问 以下是带注释的6502汇编代码(注释无误):
lda #$00 ; 将立即数0x00加载至累加器(A寄存器) sta $02 ; 将累加器中的值存储至内存地址$02 lda #$03 ; 将立即数0x03加载至累加器 sta $03 ; 将累加器中的值存储至内存地址$03 lda #$14 ; 将立即数0x14加载至累加器 sta $0302 ; 将累加器中的值存储至内存地址$0302 clc ; 清除进位标志(CLC指令) lda #$10 ; 将立即数0x10加载至累加器 ldy #$02 ; 将立即数0x02加载至Y寄存器 adc ($02),y
执行最后一行adc ($02),y前,内存及寄存器状态:
$02=0x00$03=0x03$0302=0x14A=0x10Y=0x02
你的理解错误点
你对adc ($02),y的寻址逻辑完全搞错了,6502的间接寻址+Y变址格式(addr),y的执行步骤是:
- 从
addr(低字节)和addr+1(高字节)读取16位基地址:这里$02存低字节0x00,$03存高字节0x03,组合成基地址$0300 - 将Y寄存器的值加到这个16位基地址上,得到最终操作数地址:
$0300 + $02 = $0302 - 取出
$0302中的值0x14,与A寄存器的0x10相加,再加上进位标志(之前执行了clc,进位为0),结果是0x10 + 0x14 = 0x24,这就是最终A寄存器的值$24,和实际结果完全匹配。
关于补充说明的疑问
补充说明里的“内存地址$02和$03中的值此前被设置为指定地址$0300”,指的就是代码前4行的操作:sta $02把$00写入低字节,sta $03把$03写入高字节,两者组合起来就是16位地址$0300(6502采用小端序,低字节存低地址,高字节存高地址),不是“共同指向”,而是共同组成这个16位地址的两个字节。
内容的提问来源于stack exchange,提问作者Dainank
相关产品推荐
相关产品推荐

