gpt4 book ai didi

assembly - 在子例程中使用 TRAP 例程? - LC3 组装

转载 作者:行者123 更新时间:2023-12-04 06:33:37 25 4
gpt4 key购买 nike

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

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 , 在 R7 ,用于子程序链接的寄存器。这将覆盖保存在 R7 中的地址通过 JSR .所以它似乎停止的原因是在 TRAP 之后例程完成后,它会加载我的 RET操作说明。这实际上是因为 TRAP ,将 pc 计数器更改为自身。有点像无限循环。

太好了,我明白发生了什么,但是有没有办法可以使用系统 TRAP我的子例程中的例程,同时仍在使用系统 JSR操作说明?

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

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

那么是否可以调用 TRAP子例程中的例程并且仍然使用 RET从那个子程序“返回”?如何做到这一点?

谢谢!

最佳答案

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

关于assembly - 在子例程中使用 TRAP 例程? - LC3 组装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5101024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com