MIPS下的氣泡排序

2021-08-10 13:38:15 字數 3518 閱讀 5485

mips組合語言的特點在於整齊劃一。

本文主要實現氣泡排序演算法。話不多說,先給出其中兩個函式的c語言**

void swap(int v,int k)

void sort(int v,int n)

}

下面給出mips**:

(備註:程式是基於winmips64模擬器下執行)

;

;實現氣泡排序

;.data ;資料區

before: .asciiz "before sort the array is:\n"

after: .asciiz "after sort the array is:\n"

array: .word 5,2,4,8,0,1,3,9,7,6 ;初始的矩陣

control: .word32 0x10000

data: .word32 0x10008

.text ;**區

main:

lwu $t8,data($zero) ;將control和data位址讀取到暫存器

lwu $t9,control($zero)

;輸出提示資訊,提示下面輸出內容為排序前的陣列

daddi $t6,$zero,4 ;4表示輸出型別為ascii的字串

daddi $t7,$zero,before ;把字串的首位址載入到t7

sd $t7,0($t8) ;把字串的位址寫到資料字的對映記憶體中

sd $t6,0($t9) ;把型別4寫入到控制字的對映記憶體中

jal output ;輸出排序前的陣列

daddi $a0,$zero,array ;準備引數1,陣列的首位址

daddi $a1,$zero,10 ;準備引數2,陣列的大小

jal bubblesort ;呼叫排序函式

;輸出提示資訊,提示下面輸出內容為排序後的陣列

daddi $t6,$zero,4 ;4表示輸出型別為ascii的字串

daddi $t7,$zero,after ;把字串的首位址載入到t7

sd $t7,0($t8) ;把字串的位址寫到資料字的對映記憶體中

sd $t6,0($t9) ;把型別4寫入到控制字的對映記憶體中

jal output ;輸出排序後的陣列

j final

;用於輸出陣列的內容

output:

daddi $t0,$zero,10 ;$t0=len=10

daddi $t1,$zero,0 ;$t1=i=0

daddi $t6,$zero,1 ; 1表示輸出型別為整形數

for:

slt $t2,$t1,$t0 ;判斷i0

beqz $t2,out ;判斷t2的值是否為0,若為0則跳轉到out

dsll $t3,$t1,3 ;t3=i*8 左移3位相當於乘上8,得到第i個數字的偏移位址

ld $t7,array($t3);計算出第i個數字的實際位址

sd $t7,0($t8) ;把第i個數字的位址寫入到資料字的對映記憶體中

sd $t6,0($t9) ;把型別1寫入到控制字的對映記憶體中

daddi $t1,$t1,1 ;i=i+1

j for

out: jr $ra

;排序函式

bubblesort:

dadd $s7,$zero,$ra ;儲存返回位址,因為巢狀呼叫swap會改變ra的值

dadd $s2,$zero,$a0 ;儲存傳進來的第乙個引數,第乙個引數為陣列的首位址

dadd $s3,$zero,$a1 ;儲存傳進來的第二個引數,第二個引數為陣列的大小

daddi $s0,$zero,0 ;外層迴圈,i初始化為0,i=0

forout: slt $t0,$s0,$s3 ;若i不滿足小於陣列長度n,則跳出迴圈

beqz $t0,exitout

daddi $s1,$s0,-1 ;內層迴圈j=i-1

forin: slti $t0,$s1,0 ;如果j小於0,則退出迴圈

bne $t0,$zero,exitin

dsll $t1,$s1,3 ;t1=j*8 ,計算出第j個數字的偏移位址

dadd $t2,$t1,$s2 ; 計算第j個數字的實際位址

lw $t3,0($t2) ;取出第j個數字的值

lw $t4,8($t2) ;取出第j+1個數字的值

slt $t0,$t4,$t3 ;如果第j+1個數大於第j個數,則跳出內部迴圈

beqz $t0,exitin

dadd $a0,$zero,$s2 ;準備第乙個引數,也就是陣列的首位址

dadd $a1,$zero,$s1 ;準備第二個引數,也就是j的值,之後呼叫的sawp函式將交換第j和j+1個數

jal swap ;跳轉到子程式

daddi $s1,$s1,-1 ;j=j-1

j forin

exitin:

daddi $s0,$s0,1

j forout

exitout:

dadd $ra,$zero,$s7 ;把之前儲存的返回主程式的位址返回ra

jr $ra

;交換函式

swap:

dsll $t1,$a1,3 ;$a1中存放著j值,現在計算實際偏移量

dadd $t1,$a0,$t1 ;獲取第j個值的實際位址,$a0中存放著陣列的首位址

lw $t0,0($t1) ;獲得第j個數的值

lw $t2,8($t1) ;獲得第j+1個數的值

sw $t2,0($t1) ;交換兩個數

sw $t0,8($t1)

jr $ra

final: halt

部分知識點總結:

• $a0~$a3 暫存器用於傳遞引數

• j imm 跳轉到乙個位址

jr reg 跳轉到暫存器中的位址

jal imm 跳轉到乙個子程式

• 單層呼叫可以不用儲存$ra暫存器中的返回位址,但如果被呼叫程式使用到了呼叫程式中使用的儲存暫存器$s0~$s7,則也需要在堆疊中儲存相應的暫存器的值。注意:堆疊使用前必須先初始化棧指標的值。

• 巢狀呼叫的過程中,例如程式中的main呼叫了bubblesort,而bubblesort呼叫了swap,這樣就屬於巢狀呼叫,所以必須儲存bubblesort返回main函式的位址。而呼叫swap的過程稱為葉過程,因此可以不用儲存返回位址。另外,必要時,其他儲存暫存器中的值也需要儲存。

• 可通過add $ t0, $zero,$t1 實行將 $t1中的值copy到$t0暫存器中

• 雙字型別的,一般在前面加d。例如雙字的加為dadd,而單字的加為add 。

mips 選擇排序

10個數字的輸入與排序 text 段 globl main 程式從此開始 main la t6,array t6為陣列首位址 move t7,zero 初始化t7,用於迴圈計數 input li v0,5 syscall 系統呼叫 輸入數字 move t0,t7 mul t0,t0,4 addu t...

計算機組成原理之MIPS彙編 氣泡排序

認識和掌握mips組合語言程式設計的基本方法 熟悉pcspim模擬器的使用。從鍵盤輸入10個無符號字數並從大到小進行排序,排序結果在螢幕上顯示出來。電腦一台 pcspim模擬器軟體一套。globl main將main宣告為全域性main函式 data 資料段 資料宣告 text 文字段,也稱 段 顧...

氣泡排序 排序 氣泡排序

既然寫了計組思來想去便打算把資料結構也寫下來,寫的時候總是發現看的時候無法發現的問題,受益良多。交換排序的基本思想 exchange until sorted 順序,分支,迴圈 注意偽 的熟悉 下面介紹兩種交換演算法 首先進行聯想,用乙個圖進行輔助聯想 水冒泡過程 頂部是陣列的begin,底部理解為...