Assembly PDP-11组件中的子例程

Assembly PDP-11组件中的子例程,assembly,Assembly,所以我写的程序是汇编,我试图使用子程序,但我有一个问题。 我写了一个类似于开关盒的例程。它读取一个输入,并根据其值将以下子程序的地址写入堆栈中的保留地址 它看起来像这样: 1000 jsr r5,switchcase // let the return address be 1004 1004 jsr r5,@0(sp) 第一个jsr进入开关盒,它写入堆栈中的第一个地址。 第二个跳转到那个地址 我用的是一个模拟器,每次它到达那条线,它就会停下来。我不知道出了什么问题:/ 任

所以我写的程序是汇编,我试图使用子程序,但我有一个问题。 我写了一个类似于开关盒的例程。它读取一个输入,并根据其值将以下子程序的地址写入堆栈中的保留地址

它看起来像这样:

1000    jsr r5,switchcase
    // let the return address be 1004
1004    jsr r5,@0(sp)
第一个jsr进入开关盒,它写入堆栈中的第一个地址。 第二个跳转到那个地址

我用的是一个模拟器,每次它到达那条线,它就会停下来。我不知道出了什么问题:/


任何帮助都将不胜感激。

指令
jsr r5,@0(sp)
将旧的
r5
推到堆栈上,并将当前的
R7
(PC)放入
r5
。因此,您的程序不会跳转到堆栈上的地址,而是跳转到存储在
r5
中的地址,这是什么。
因此,在您的示例中,第一条
jsr
指令将
r5
写入堆栈,然后将
1004
赋值给
r5

编辑:当程序以
rts
返回时,它从堆栈中恢复
r5
的旧值。
第二条
jsr
指令再次将该值推送到堆栈上,然后跳转到该地址,因为它位于堆栈顶部(距离为0)。
如果用第一个
jsr
调用的子例程确实在堆栈顶部留下了一个子例程地址,而第二个
jsr
应该跳转到那里,则必须使用
jsr r5、@2(sp)
。但是我会把它看作是好的编程风格。
希望这次我答对了…

您是否考虑到
jsr
将返回值推送到堆栈上,从而更改您需要使用的偏移量?@Mark Ransom:实际上,jsr r5,。。。将r5推送到堆栈上,然后将当前PC分配给r5。但是第二个jsr不会也将1008写入r5吗?另外,第一个子例程的返回应该会修复堆栈。@JeremyP:你完全正确,谢谢你指出这一点。对不起,我30年前做过PDP11编程。。。我将编辑我的答案以更正它。