2011-11-19 170 views
5

Tôi đang cố gắng nhắc người dùng cho độ dài của một chuỗi, phân bổ không gian cho chuỗi đó, sau đó in ra ngược lại.Đảo ngược một chuỗi trong MIPS Assembly

Đối với cuộc sống của tôi, tôi không thể hiểu tại sao điều này không hoạt động ..

Sample Output: 
(spim) run  
Please enter an integer:  
7  
string 
(spim) 

Bây giờ theo chiều dài của "chuỗi" nên 6 phải không? + Ký tự kết thúc null mà nên làm cho nó 7. Có thể bất cứ ai phát hiện ra nơi tôi đang đi sai với cách tiếp cận của tôi?

.data 
    nl: .asciiz "\n" 
    inputPrompt: .asciiz "Please enter an integer:\n" 

    theString: .space 32 
    theInteger: .word 1 

.text 
main: 
    la $a0, inputPrompt #load address a0 with prompt 
    li $v0, 4  #load system call, print string into v0 
    syscall 

    li $v0, 5  #load system call, read int into v0 
    syscall 
    sw $v0, theInteger #store saved int into $t0 

    li $v0, 8   #load system call, read string with mem address 
    la $a0, theString #load address of reserved string space 
    lw $a1, theInteger #load address of saved int length for string  
    syscall 

    lw $t0, theInteger 
    add $a1,$zero,$t0 #pass lenght of string 
    jal stringreverse #reverse the string 

stringreverse: 
    add $t0,$a0,$zero #starting address 
    add $t1,$zero,$zero  #i = 0 
    addi $t2,$a1,-1  #j = length-1 

loop: 
    add $t3,$t0,$t1 
    lb $t4,0($t3) #the lb string[i] 
    add $t5,$t0,$t2 
    lb $t6,0($t5) #the lb string[j] 
    sb $t4,0($t5) #string[j] = string[i] 
    sb $t6,0($t3) #string[i] = string[j] 
    addi $t1,$t1,1 #i++ 
    addi $t2,$t2,-1  #j-- 

    slt $t6,$t2,$t1 
    beqz $t6,loop 

exit: 
    li $v1, 4  #system call to print reversed string 
    la $a2, 0($a1) 
    syscall 

    li $v0, 10 
    syscall   # Exit program 
+0

Các bạn đã thử bước qua mã trong trình gỡ lỗi? Có vẻ như bạn giả sử địa chỉ của chuỗi trong '$ a0' bị bỏ lại sau khi syscall 8 trả về, bạn có chắc chắn đó là trường hợp không? – user786653

+2

[Trình mô phỏng MARS MIPS] (http://courses.missouristate.edu/KenVollmar/MARS/) hoạt động kỳ diệu để gỡ lỗi lắp ráp – Msonic

Trả lời

6

đã có một lỗi nhỏ trong chỉ mục ... và thay vì tái viết trên đầu trang của một tuổi tôi đã từng không gian bộ nhớ mới gọi là ngược lại ...

stringreverse: 
    add $t0,$a0,$zero #starting address 
    add $t1,$zero,$zero  
    add $t3,$zero,$zero  #i = 0 
    addi $t2,$a1,-2  #j = length-1 

loop: 
    add $t5,$t0,$t2 
    lb $t6,0($t5) #the lb string[j] 
    sb $t6,reverse($t3) 
    addi $t2,$t2,-1  #j-- 
    addi $t3,$t3,+1  #i++ 

    slt $t7,$t2,$t1 
    beqz $t7,loop