所以我写的程序是程序集,我正在尝试使用子程序,但是我遇到了问题。 我写了一个类似于开关盒的例行程序。它读取一个输入,并根据它的值,将堆栈中的保留地址写入以下子程序的地址。
它看起来像这样:
1000 jsr r5,switchcase
// let the return address be 1004
1004 jsr r5,@0(sp)
第一个jsr转到switch case,它写入堆栈中的第一个地址。 第二个跳到那个地址。
我正在使用模拟器,每次到达该线时它都会停止。我不知道出了什么问题:/
任何帮助将不胜感激。
答案 0 :(得分:0)
指令jsr r5,@0(sp)
将旧r5
推入堆栈,并将当前R7
(PC)放入r5
。因此,您的程序不会跳转到堆栈中的地址,而是跳转到r5
中存储的地址,这是wharever。
因此,在您的示例中,第一个jsr
指令将r5
写入堆栈,然后将1004
分配给r5
。
编辑:当程序返回rts
时,它会从堆栈中恢复旧值r5
。
第二个jsr
指令再次将此值推送到堆栈上,然后跳转到该地址,因为它位于堆栈顶部(距离0)。
如果使用1st jsr
调用的子例程确实在堆栈顶部留下了子例程地址,并且第二个jsr
应该跳到那里,则必须使用jsr r5,@2(sp)
。但我认为这不仅仅是良好的编程风格
希望这次我做对了......