1. 程式人生 > >用匯編語言實現氣泡排序——基於MIPS指令系統

用匯編語言實現氣泡排序——基於MIPS指令系統

這是計組第一個小實驗,實現從鍵盤輸入十個數字,並把它們按從大到小排序輸出。

氣泡排序流程圖

這裡寫圖片描述

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模擬器顯示
這裡寫圖片描述