我目前正在尝试让Getstring的程序集lc3工作,它使用get信函子例程获得一个字符串,然后在按enter/newline之后终止/退出子例程。但是,当我模拟它时,代码会到达RET,然后返回到ADD R1,R0,#-10行,而不是退出到main。我将如何终止循环或让它返回到main?
更新代码: GETSTRING
保存除返回寄存器外更改的所有寄存器。ST R1,GS_R1;以R1为例。ST R7,GS_R7
;.... PUT YOUR CODE HERE ....添加R1,R0,#0
GS_TOP
JSR GETLETTER
添加R1,R0,#-10
BRZ GS_DONE
R0,R1,#0
添加R1,R1,#1
BRNZP GS_TOP
GS_DONE ST R1,#0
;Registers registers you used.
LD R1, GS_R1 ;Restore R1
LD R7, GS_R7
RET ;This subroutine should ONLY have one return here.;GETSTRING储存。在这个子例程中使用的所有.fill、.stringz、.blkw标签都应该放在这里。;------------------------------------------------------------------------------ GS_R1 .fill 0;GETSTRING GS_R7 .fill 0 R1的存储位置;
以下是我的错误:以下提示可能帮助您找到改进解决方案的一些方法:
位置1处字符串中的字符错误:“”应该是“H”。(2次)
位置2处字符串中的字符错误:“”应该是“H”。
位置1处字符串中的字符错误:“”应该是“�”。
位置3处字符串中的字符错误:“”应该是“�”。
位置2处字符串中的字符错误:“”应该是“V”。
位置2处字符串中的字符错误:‘应该是'S’。
位置2处字符串中的字符错误:‘应该是'n’。
位置1处字符串中的字符错误:‘应该是'b’。
发布于 2022-07-19 17:26:50
当一个函数调用另一个函数或调用一个陷阱时,它必须保存其传入的返回地址参数,该参数位于R7中,因为该寄存器将用于这些操作。
例如,当A调用B时,它在R7中传递B一个返回地址。B应该使用A提供的返回地址返回到适当的呼叫站点并恢复A。然而,如果B调用C,那么它还在R7中提供了一个返回地址,C应该用来返回给B。因此,如果B不能保存来自A的传入返回地址,那么调用C的工作就会破坏该值并丢失它与A的链接。
https://stackoverflow.com/questions/73040573
复制相似问题