0

所以我正在写一个程序是汇编,并且我正在尝试使用子例程,但是我有一个问题。我编写了一个类似于 switch case 的例程。它读取一个 input ,并根据它的 value ,将以下子例程的地址写入堆栈中的保留地址。

它看起来像这样:

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

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

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

任何帮助,将不胜感激。

4

1 回答 1

0

该指令jsr r5,@0(sp)将旧的压r5入堆栈并将当前R7(PC)放入r5。因此,您的程序不会跳转到堆栈上的地址,而是跳转到存储在 中的地址r5,无论它是什么。
因此,在您的示例中,第一jsr条指令写入r5堆栈,然后分配1004r5.
编辑:当程序返回时,它会从堆栈rts中恢复旧值。 因此,第二条指令再次将该值压入堆栈,然后跳转到该地址,因为它位于堆栈顶部(距离 0)。 如果第一个调用的子程序确实在堆栈顶部留下了一个子程序地址,那么第二个r5
jsr
jsrjsr应该跳到那里,只好用一个来jsr r5,@2(sp)代替。但我认为这是除了良好的编程风格之外的一切。
希望这次我做对了...

于 2013-05-14T20:09:24.050 回答