2013-10-12 117 views
0

我有一個程序會使用選擇排序算法方法對字符串進行排序。程序將接收用戶輸入的字符串,並使用選擇排序算法對其進行排序。我的問題是當我運行它時出現錯誤,提示「提取地址未在字邊界上對齊」。我應該怎麼做才能解決這個問題?我對mips編程相對來說比較陌生。以mips對字符串進行排序

.data 
prompt: .asciiz "\n\nEnter an string of characters: " 
result: .asciiz "\n\nHere is the string you entered: " 
buffer: .space 80 
length: .word 80 
before: .asciiz "Before sort:\n" 
space: .asciiz " " 
after: .asciiz "\n\nAfter Sort\n" 
newLine: .asciiz "\n" 

.text 
.globl main 

main: 
#Prints the prompt string 
li $v0, 4 
la $a0, prompt 
syscall 

#reads string from user and saves in $a0 
li $v0, 8 
la $a0, buffer 
li $a1, 80 
syscall 

#Prints the result string 
li $v0, 4 
la $a0, result 
syscall 

#Prints the string entered by the user 
la $a0, buffer 
li $v0, 4 
syscall  

li  $t5, 0  # t5 is k = 0 

la  $t7, length  
    lw  $t7, 0($t7)  # t7 = length 

addi $t8, $t7, -1 # t8 = length - 1 
la $t6, 0($a0) # t6 = address of the array 

outerLoop: slt $t0, $t5, $t8 # if k < length - 1 t0 = 1 
beq $t0, $zero, breakOuterLoop # k >= (length - 1) 
add $t9, $zero, $t5 # t9 is min = k 

addi $t1, $t5, 1  # t1 is j = k + 1 

innerLoop: slt $t0, $t1, $t7 # if j < length t0 = 1 
beq $t0, $zero, breakInnerLoop 

add $s3, $t9, $t9 # s3 = 2 * min 
add $s3, $s3, $s3 # s3 = 4 * min 
add $s3, $a0, $s3 # s3 is address of list[min] 
lw $t2, 0($s3)  # t2 is list[min] 

add $s0, $t1, $t1 # s0 = 2 * j 
add $s0, $s0, $s0 # s0 = 4 * j 
add $s0, $a0, $s0 # s0 is address of list[j] 
lw $t3, 0($s0)  # t3 is list[j] 

slt $t0, $t3, $t2 # if list[j] < list[min] t0 = 1 
beq $t0, $zero, secondIF # skip min = j & ++j and jump to secondIF 
add  $t9, $zero, $t1 # min = j 
j secondIF 

secondIF: beq $t9, $t5, incrementJ # if min != k swap, else goto incrementJ 

# BEGIN SWAP : 
add $s0, $t9, $t9 # s0 = 2 * min 
add $s0, $s0, $s0 # s0 = 4 * min 
add $s0, $s0, $a0 # s0 = address of list[min] 
lw $t4, 0($s0)  # t4 is temp = list[min] 


add $s1, $t5, $t5 # s1 = 2 * k 
add $s1, $s1, $s1 # s1 = 4 * k 
add $s1, $a0, $s1 # s1 = address of list[k] 
lw $s3, 0($s1)  # s3 = list[k] 


sw $s3, 0($s0)  # list[min] = list[k] 

sw $t4, 0($s1)  # list[k] = temp 
addi $t1, $t1, 1 # ++j 
add $t9, $zero, $t5 # t9 is min = k 
# END SWAP 

j innerLoop 

incrementJ: addi $t1, $t1, 1 # ++j 
j innerLoop 

breakInnerLoop: addi $t5, $t5, 1 # ++k 
j outerLoop 


breakOuterLoop:    


#Prints the result string 
li $v0, 4 
la $a0, result 
syscall 

#Prints the string entered by the user 
la $a0, buffer 
li $v0, 4 
syscall 

exitProgram: li $v0, 10 # system call to 
syscall   # terminate program 

回答

0

看你的代碼,你想對字符進行排序,但你似乎是使用被用於完整的單詞,而一個字符串的字符是單字節指令lwsw

lwsw如果提供的地址不是字對齊的(就像在查看字符串中的每個字符時會發生的那樣)將會失敗。

+0

應該使用lb和sb來代替還是應該使用別的東西? – user2837034

+0

如果你的意思是存儲和加載字節(一個字符),那麼是的; 'lb'和'sb'是相應的指令 –

+0

我修正了這個問題,但打印的結果只是空的。有什麼建議麼? – user2837034

相關問題