You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASM 6809执行JSR子程序调用后RTS指令无法正常返回问题咨询

6809汇编RTS返回异常问题解答

你遇到的问题不属于编译器或模拟器误差,是对6809指令集的堆栈操作、子程序调用规则理解存在遗漏,具体原因如下:

6809子程序调用基础规则

  • 执行JSR指令时,CPU会自动将JSR下一条指令的16位内存地址(也就是你示例中clra指令的地址,占2字节)压入硬件堆栈,再跳转到子程序入口执行。
  • 执行RTS指令时,CPU会自动从栈顶弹出2字节数据写入程序计数器PC,以此实现子程序返回。因此RTS执行前,栈顶必须保留JSR压入的原始返回地址,否则就会跳转到错误地址。

你代码的问题所在

你在print子程序第一行使用了puls a,x,y,该指令会按操作数顺序从栈顶依次弹出数据写入对应寄存器:

  • 1字节寄存器A首先读取栈顶1字节,直接占用了返回地址的第一个字节
  • 2字节寄存器X接下来读取后续2字节,占用了返回地址剩余的1字节+堆栈下层的1字节
  • 2字节寄存器Y最后读取后续2字节
    这行执行完成后,栈顶已经完全偏离了原始返回地址的位置,后续RTS弹出的是无效地址,自然无法回到clra处执行。

修正方案

如果需要在子程序中使用A、X、Y寄存器,必须先在子程序开头将这些寄存器的值压栈保存,返回前再恢复,保证返回地址始终在栈顶待RTS读取,正确写法参考:

start:
    clrb
    jsr print
    clra
    rts
 

print:
    pshs a,x,y   ; 先压栈保存寄存器原值,此时栈结构为:[保存的A][保存的X][保存的Y][原始返回地址]
    ; 此处编写子程序实际业务逻辑
    puls a,x,y   ; 恢复寄存器原值,执行后栈顶回到原始返回地址位置
    rts

内容的提问来源于stack exchange,提问作者Black.Jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:48:01