反向打印字符串

时间:2013-08-24 08:49:50

标签: assembly mips

   .data 
 str: .asciiz "Hello Sir"  
.text 

la $a0, str # load the address of the string 
addi $t0, $a0, 0 # starting address of array 
#TODO: find length of string, it's zero terminated, so loop until a zero 

strLen:                 #getting length of string
lb      $t1, str($t2)   #loading value
add     $t2, $t2, 1
bne     $t1, $zero, strLen
sub     $t2, $t2, 1
li      $v0, 11         #load imediate - print low-level byte



addi $t1, $a0, 21 # initialize loop counter to array end position
loop: lb $a0, 0($t0) # load a single character 
  li $v0, 11 # specify print character service 3 
  syscall # print 
  addi $t0, $t0, 1 # add 1 to the loop index 
  blt $t0, $t1, loop # continue if not at string length 


Loop:
sub     $t2, $t2, 1
la      $t1, str($t2)   #loading value
lb      $a0, ($t1)
syscall

bnez    $t2, Loop
  li $v0, 10 # system call for exit 
  syscall # we are out of here. 

我想创建将打印出字符串并打印出来的代码。例如“Hello SirriS olleH”。我该如何更改此行

  addi $t1, $a0, 21 # initialize loop counter to array end position

使其初始化为给定字符串的长度,而不是默认设置为21。欢呼声。

1 个答案:

答案 0 :(得分:2)

鉴于您已经strLen生成了$t2中的字符串长度,您可以直接在比较中使用该寄存器。当然,如果你愿意,你也可以将它复制到$t1,但这样做并没有多大意义。

旁注:在strLen循环中打印前向字符串可能是有意义的,这样就可以摆脱第二个循环。

最后,我建议您使用更好的标签,loopLoop信息量不大,并且使用仅在案例上有所不同的标签无论如何都是个坏主意。