所以我正在写一个汇编程序,我试着使用子例程,但是我有一个问题。我写了一个类似于开关情况的例程。它读取一个输入,并根据它的值,将以下子例程的地址写入堆栈中的保留地址。
它看起来像这样:
1000 jsr r5,switchcase
// let the return address be 1004
1004 jsr r5,@0(sp)第一个jsr转到切换用例,它写入堆栈中的第一个地址。第二个跳转到该地址。
我正在使用一个模拟器,每次它到达这一行,它就会停止。我不知道哪里出了问题:/
任何帮助都将不胜感激。
发布于 2013-05-15 04:09:24
指令jsr r5,@0(sp)将旧的r5压入堆栈,并将当前的R7 (PC)放入r5。因此,您的程序不会跳转到堆栈上的地址,而是跳转到存储在r5中的地址。
因此,在您的示例中,第一条jsr指令将r5写入堆栈,然后将1004赋值给r5。
编辑:当程序返回rts时,它从堆栈恢复r5的旧值。
第二个jsr指令再次将该值推送到堆栈上,然后跳转到该地址,因为它位于堆栈顶部(距离0)。
如果用第一个jsr调用的子例程确实在堆栈顶部留下了一个子例程地址,并且第二个jsr应该跳到那里,则必须使用jsr r5,@2(sp)。但我认为这是比好的编程风格更重要的事情。
希望这次我没弄错..。
https://stackoverflow.com/questions/16547531
复制相似问题