所以,我已经完成了一个汇编程序,它要求输入一个字符,读取它,回显它,重复四次,然后在一个连续的字符串中打印出这些字符。然后我想尝试使用子程序(我们还没有在课堂上学习过),所以我制作了以下子程序来将换行符打印到控制台:
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
从该子例程“返回”?如何做到这一点?
谢谢!