2

所以,我已经完成了一个汇编程序,它要求输入一个字符,读取它,回显它,重复四次,然后在一个连续的字符串中打印出这些字符。然后我想尝试使用子程序(我们还没有在课堂上学习过),所以我制作了以下子程序来将换行符打印到控制台:

PRINT_NEWLINE                         ;procedure to print a newline
  AND   R0,R0,#0                      ;clear output register
  LD    R0,NEWLINE                    ;load newline into output regiester
  TRAP  x21                           ;print it out
  RET                                 ;jump to address in R7

它像这样被“调用”:

JSR PRINT_NEWLINE

运行此程序后,我注意到一些奇怪的事情,程序似乎在第一次调用PRINT_NEWLINE. 然后我意识到 TRAP 保存了下一条指令的地址,在这种情况下是RET, in R7,用于子程序链接的寄存器。这将覆盖由 保存的R7地址JSR。所以它似乎停止的原因是在TRAP例程完成后,它会加载我的RET指令。实际上,由于TRAP,将 pc 计数器更改为自身。有点像无限循环。

这一切都很好,我明白发生了什么,但是有没有办法可以TRAP在我的子例程中使用系统例程,同时仍然使用系统JSR指令?

当然,我可以在JSR PRINT_NEWLINE调用之后将指令的地址手动存储到不同的寄存器中,然后在我的PRINT_NEWLINE子程序结束时,存储JMP到该寄存器中的地址。

但是,这对我来说似乎是错误的,我是一名程序员,因此我很懒惰,宁愿只是享受别人的劳动成果并使用 and 的JSR组合RET

那么是否可以TRAP在子例程中调用例程并仍然用于RET从该子例程“返回”?如何做到这一点?

谢谢!

4

1 回答 1

3

您需要R7在调用之前保存其他地方的值,然后TRAP再恢复它。对于嵌套的子例程调用,您也需要这样做。大多数 RISC 架构需要用户保存某种形式的返回地址;它们不像 x86 处理器那样在硬件中实现内存堆栈。

于 2011-02-24T06:16:22.490 回答