用匯編語言實現氣泡排序——基於MIPS指令系統
阿新 • • 發佈:2019-01-29
這是計組第一個小實驗,實現從鍵盤輸入十個數字,並把它們按從大到小排序輸出。
氣泡排序流程圖
C語言實現氣泡排序
void swap(int a[], int k) {
int temp;
temp = a[k];
a[k] = a[k + 1];
a[k + 1] = temp;
}
void sort(int a[], int n) {
for (int i = 0; i < n; i++) {
for (int j = i - 1; j >= 0; j--) {
if (a[j] < a[j + 1 ])
swap(a, j);
}
}
}
組合語言實現氣泡排序
.data
sortarray:
.space 40
separate:
.asciiz " "
line:
.asciiz "\n"
.text
.globl main
main:
la $t0, sortarray #陣列起始地址
add $t1, $zero, $t0 #指向陣列起始地址
addi $t8, $t0, 40 #陣列終止地址
addi $t3, $zero, 0 #輸入計數器
inputData:
li $v0, 5 #輸入整型資料/read_int
syscall
sw $v0, 0($t1) #存入陣列
addi $t1, $t1, 4 #指向陣列下一個地址
addi $t3, $t3, 1 #輸入計數器加1
slti $s0, $t3, 10 #計數器小於10,繼續輸入
bnez $s0, inputData
addi $t3 , $zero, 0 #外層迴圈計數器i = 0
outLoop:
add $t1, $zero, $t0 #每次進入排序迴圈,讓$t1指向陣列起始地址
slti $s0, $t3, 10 #i < 10,進入內層迴圈
beqz $s0, print #i > 10, 退出迴圈,列印排序後的陣列
addi $t4, $t3, -1 #j = i - 1
inLoop:
slti $s0, $t4, 0 #j < 0,退出內層迴圈
bnez $s0, exitInLoop
sll $t5, $t4, 2 #$t5 = j * 4
add $t5, $t1, $t5 #$t5 = 陣列起始地址 + j * 4
lw $t6, 0($t5) #$t6 = a[j]
lw $t7, 4($t5) #$t7 = a[j + 1]
slt $s0, $t6, $t7 #a[j] < a[j + 1],交換
bnez $s0, swap
addi $t4, $t4, -1 #j--
j inLoop #繼續內層迴圈
swap:
sw $t6, 4($t5) #$t6 = a[j + 1]
sw $t7, 0($t5) #$t7 = a[j]
addi $t4, $t4, -1 #j--
j inLoop #繼續內層迴圈
exitInLoop:
addi $t3, $t3, 1 #i++
j outLoop #進入外層迴圈
print:
lw $a0, 0($t0) #要列印的資料存到$a0
li $v0, 1 #系統呼叫/print_int
syscall
la $a0, separate #列印空格
li $v0, 4 #系統呼叫/print_string
syscall
addi $t0, $t0, 4 #陣列的下一個地址
bne $t0, $t8, print #在陣列終止地址前繼續列印
la $a0, line #陣列列印完後換行
li $v0, 4 #系統呼叫/print_string
syscall
j exit #退出程式
exit:
li $v0, 10 #系統呼叫/退出程式
syscall
實驗結果
PCspim模擬器顯示