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
相关产品推荐
相关产品推荐

