-2
   .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. 

我想创建将打印出字符串并打印出其反向的代码。例如“你好 SirriS olleH”。我将如何更改此行

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

以便它初始化为给定字符串的长度,而不是默认设置为 21。干杯。

4

1 回答 1

2

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

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

最后,我建议您使用更好的标签,loop并且Loop信息量不是很大,并且使用仅在大小写不同的标签无论如何都是一个坏主意。

于 2013-08-24T12:06:22.067 回答