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,底部理解為...