PDP-11组装中的子程序

时间:2013-05-14 15:46:13

标签: assembly

所以我写的程序是程序集,我正在尝试使用子程序,但是我遇到了问题。 我写了一个类似于开关盒的例行程序。它读取一个输入,并根据它的值,将堆栈中的保留地址写入以下子程序的地址。

它看起来像这样:

1000    jsr r5,switchcase
    // let the return address be 1004
1004    jsr r5,@0(sp)

第一个jsr转到switch case,它写入堆栈中的第一个地址。 第二个跳到那个地址。

我正在使用模拟器,每次到达该线时它都会停止。我不知道出了什么问题:/

任何帮助将不胜感激。

1 个答案:

答案 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)。但我认为这不仅仅是良好的编程风格 希望这次我做对了......