2013-08-24 189 views
-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. 

我想創建打印出字符串並打印出反向的代碼。例如「Hello SirriS olleH」。我將如何更改此行打印出反向字符串

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

因此,它將初始化爲給定字符串的長度,而不是默認設置爲21。乾杯。

回答

2

鑑於你已經有strLen它產生的字符串長度在$t2你可以直接在比較中使用該寄存器。如果你願意的話,你當然也可以把它複製到$t1,但這樣做沒有多大意義。

備註:在您的strLen循環中打印正向字符串可能會有意義,因此您可以擺脫第二個循環。

最後,我建議你使用更好的標籤,loopLoop是不是很豐富的信息,使用不同的標籤是不好的,無論如何是不好的想法。