assembly 为什么这个内斯6502汇编代码在移动到一个作用域过程时不起作用?

kkih6yb8  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(92)

我有一个代码片段,在初始化内斯程序集的游戏之前清除内存.当我像这样将代码留在reset proc中时,它可以工作:

.proc reset
  SEI
  CLD

  LDX #0
  ClearRAM:
    STA $000,x
    STA $100,x
    STA $200,x
    STA $300,x
    STA $400,x
    STA $500,x
    STA $600,x
    STA $700,x
    INX
    BNE ClearRAM
.endproc

字符串
但是,如果我尝试将此ClearRAM片段移动到一个作用域proc中:

.scope Memory
  .proc clear
    LDX #0
    ClearRAM:
      STA $000,x
      STA $100,x
      STA $200,x
      STA $300,x
      STA $400,x
      STA $500,x
      STA $600,x
      STA $700,x
      INX
      BNE ClearRAM
    RTS
  .endproc
.endscope


然后像这样加载:

.proc reset
  SEI
  CLD

  JSR Memory::clear
.endproc


它停止工作。就像它在ClearRAM循环中永远循环一样。
知道我哪里做错了吗
谢谢你,谢谢

r8uurelv

r8uurelv1#

您的代码将清除前2K的RAM内存。(我不知道内斯是否有超过2K的内存。
因为堆栈始终位于使用6502 CPU的系统的前1K内存中(更准确地说:在100h.1FFh范围内),程序也会清除堆栈。
JSR将程序流在RTS之后继续的地址保存到堆栈中,RTS指令从堆栈中读取该地址。
如果您擦除堆栈的内容,RTS将从堆栈中读取一些错误的值并跳转到该地址。
如果程序中的A寄存器包含值12h,则RTS指令将从堆栈中读取1212h,并且程序将在地址1212h(在RTS指令之后)而不是JSR之后的指令继续执行。

相关问题