MIPS組合語言實現選擇排序

2021-07-30 00:00:39 字數 3202 閱讀 1771

mips組合語言實現排序演算法,其實並不難。只要你掌握了基本的指令語句,並且熟悉c或c++相關演算法,即可輕鬆寫出來。對於mips組合語言還不太熟悉的夥伴,可以參考下面這篇部落格:

它的具體實現**如下:

``

````

****

****

****

****

****

**c++****

****

****

****

****

****

**#include

using namespace std;

int main()

}num[index] = num[i];

num[i] = max;

}for(i = 0; i < 10; i++)

cout<" ";

} **

****

****

****

****

****mips彙編****

****

****

****

****

****

**.text # **段 宣告

.globl main # globl指明程式的入口位址main

main: # 程式入口位址

la $a0,input_num_msg # 取字串首位址

li $v0,4

#4號功能呼叫,輸出字串

syscall

#系統呼叫,輸出字串

la $t6,array # $t6 是陣列首位址

move $t7,$zero

# $t7 是迴圈變數i

addi $t8,$zero,10

# $t8 是陣列長度

move $t9,$zero

# $t9 是迴圈變數j

input: # input**塊用於完成陣列元素的輸入

la $a0,input_int_msg # 取字串首位址

#列印字串,提示使用者輸入陣列的元素

li $v0,4

syscall

li $v0,5

syscall

move $t0,$t7

# 此處類似於c/c++中指標訪問陣列元素的方法

mul $t0,$t0,4

# 陣列元素所佔位元組數*迴圈變數+陣列的起始位址=陣列[迴圈變數]

addu $t1,$t0,$t6

# '無符號數字相加

sw $v0,0($t1) # ''把$v0的資料存入到$t1中,位址偏移量為0

addi $t7,$t7,1

# $t7 = $t7 +1 迴圈變數i+1

blt $t7,$t8,input # branch to input if $t7 < $t8

move $t7,$zero

# 完成輸入後將迴圈變數置為0,可作為下乙個迴圈的迴圈變數,以節省暫存器; $t7作為 i

loop1:

addu $t9,$t7,1

# 每次執行外層迴圈都將內層迴圈的迴圈變數置為i+1

mul $t0,$t7,4

#獲取a[i],作為max,即$t2 為max

addu $t1,$t0,$t6

lw $t2,0($t1) #偏移量,定址

move $t5,$t1

#初始化最後一次和max交換的j的值

loop2:

move $t0,$t9

#獲取a[j]

mul $t0,$t0,4

addu $t4,$t0,$t6

lw $t3,0($t4)

bge $t2,$t3,skip # 如果a[i] > a[j],跳轉到skip**塊

lw $t2,0($t4) # 否則就執行下面這兩句,賦值

move $t5,$t4

#記錄下j的值

skip:

addi $t9,$t9,1

# 內層迴圈變數自增

blt $t9,$t8,loop2 # 且判斷是否還滿足迴圈條件,如果滿足,則跳轉到loop2

lw $t4,0($t1) # 如果不滿足,先進行賦值

sw $t4,0($t5)

sw $t2,0($t1) #'賦值

addi $t7,$t7,1

# 再將外層迴圈的迴圈變數自增

addi $t4,$t7,1

#且判斷是否還滿足迴圈條件

blt $t4,$t8,loop1 # 如果滿足,則跳轉到loop1

# 如果不滿足,則不跳轉,繼續執行下面的**

output:

la $a0,output_int_msg # 列印字串,提示使用者即將輸出程式

li $v0,4

syscall

move $t7,$zero

# 將迴圈變數置為0,用於下一迴圈,節省暫存器

print: # 實現列印陣列元素

move $t0,$t7

mul $t0,$t0,4

addu $t1,$t0,$t6

lw $a0,0($t1)

li $v0,1

syscall

la $a0,seperate # 分隔陣列元素

li $v0,4

syscall

addi $t7,$t7,1

blt $t7,$t8,print

# 如果滿足迴圈條件,跳轉到print繼續執行迴圈

.data # 資料段宣告

array:.space 10

# 給array分配10個空間

input_num_msg:.asciiz "please enter 10 unsigned number:\n"

input_int_msg:.asciiz "please enter an unsigned integers to be sorted:\n"

output_int_msg:.asciiz "the sorted numbers are:\n"

seperate:.asciiz " "

當然,我的**裡的陣列長度已經固定為10。只要適當修改,就可以實現真正的選擇排序。——在源**中增加一段使用者輸入陣列長度的**語句即可。

用組合語言實現氣泡排序 基於MIPS指令系統

這是計組第乙個小實驗,實現從鍵盤輸入十個數字,並把它們按從大到小排序輸出。氣泡排序流程圖 c語言實現氣泡排序 void swap int a,int k void sort int a,int n data sortarray space 40 separate asciiz line asciiz...

組合語言實現氣泡排序

氣泡排序 author jrh 2011.7.10 assume ds data data segment a dw 1,4,2,5,7,9,6,3 data ends code segment start mov ax,data mov ds,ax mov cx,8 dec cx lop1 pus...

mips組合語言筆記

因為乙個課程涉及mips組合語言,自己做一些筆記。部落格還有乙個b站的,查mips能查到那個文章。注意 彙編使用的位址也是邏輯位址,有偏移量,通過硬體進行轉化。比如乙個 la操作就會進行對記憶體的好幾次訪問 具體暫存器操作貼乙個圖 1 往a0裡寫資料。3種方式。1 寫立即數 li a0 1 2 暫存...