-1

我正在研究一个问题,其目标是创建一个模拟陷阱(PUTS)的子例程,它将向控制台写入一个字符串,可以假设这个字符串地址在 r0

这就是我到目前为止所拥有的,它适用于第一个字符's'之后它会不断循环打印>>>>>>我尝试了所有建议?

 .orig x3000 
 lea r0, string ;


 br putss




 putss

  ldr r1, r0,#0 
   add r0, r1,#0
  add r4, r0, #-4
  brz theend
  out
  and r1,r1,#0
 add r0,r0,#1 ; keeps fetching next chara


   br putss





  theend
   halt









     string .STRINGZ "salazar"

     .end
4

1 回答 1

0

好吧

1.

br putss

使用 JSR 调用子例程。如果您必须分支到子例程,那么一旦子例程完成,控制流将如何返回到子例程的调用者?

另一点是,如果您需要在子例程中调用 TRAP,则必须保存并恢复 R7,因为作为调用 TRAP 的一部分,它将在 R7 中写入其返回地址,这将破坏返回地址以返回给调用者。也许这就是您使用 BR 的原因?

2.

add r0, r1,#0

这是不好的。这会破坏调用子例程时 R0 中包含的字符串数据的地址。我不明白你为什么要这样做?

3.

and r1,r1,#0

这似乎没有必要,当 LDR R1, ... 发生时,您将覆盖 R1 中的值。

4.

add r4, r0, #-4

似乎没有必要?读取值为 0(nul 终止符)的字符时,PUTS 结束。

5.

theend
halt

不要在子程序中执行此操作,完成后的子程序应该简单地使用 ret 返回给调用者。如果您调用其他人的子程序,您不会希望程序终止。

于 2017-12-10T05:08:11.720 回答