1. 程式人生 > >MIPS求陣列交集

MIPS求陣列交集

題目:

       編寫一程式,實現將既包含在陣列A中又包含在陣列B中的無符號字數取出並存於記憶體中,其中陣列A包含20個數,陣列B包含30個數。如找不到相同的數則顯示“No same!”。

思路:

       這個題目,用高階語言來做其實蠻簡單的,這裡,就不再用高階語言來展示了。思路也很簡單,就先輸入陣列A的20個數。然後,再迴圈輸入陣列B的30個數,每輸入一個數,將這個數和陣列A中的數逐個進行比較,若相同,則放進另一個數組S,並開始輸入下一個數,若比較完了20個數還沒有相同,則證明此數不在陣列A中。最後,當30個數都輸入完畢了,檢視陣列S中有沒有元素,若有,就列印,反之,輸出“No same!”。

流程圖:

這裡寫圖片描述

程式碼:

#編寫一程式,實現將既包含在陣列A中又包含在陣列B中的無符號字數取出並存於記憶體中,
#其中陣列A包含20個數,陣列B包含30個數。如找不到相同的數則顯示“No same!”。

.data 
    array:
        .align 2        #之前不知道,debug一個小時
        .space 80      # 開闢陣列A空間 
    input_msg_A:
        .asciiz "Input 20 numbers of Arrar_A:\n" # 輸入數字提示符
    space_str:
        .asciiz " "
# 輸出空格資訊 input_msg_B: .asciiz "Input 30 numbers of Array_B:\n" sameNum: .align 2 #兩位元組對齊 .space 80 #交集的空間 notFound: .asciiz "No same!\n" Found: .asciiz "The last number sequence is:\n" .text .globl main main: la $t5, sameNum #將交集的地址放在t5中
la $t6, array # 將陣列地址放到 t6位置上 move $t7, $zero # 用於計數 控制輸入 addi $t8, $zero, 20 move $t3, $zero #用t3來統計交集中元素的個數 la $a0, input_msg_A #輸出提示資訊 li $v0, 4 syscall move $t0, $t6 input_A: li $v0, 5 # 呼叫了輸入命令 5 裝載到$v0上 syscall # 系統呼叫 輸入的數被放到了v0上 sw $v0, 0($t0) addiu $t0, $t0, 4 #t0的值指向下一個陣列元素地址 addi $t7, $t7, 1 # 對計數的$t7進行加一操作 bne $t7, $t8, input_A # 如果不相等,就迴圈該程序 la $a0, input_msg_B #輸出提示資訊 li $v0, 4 syscall move $t0, $zero #統計輸入的個數 addi $t9, $zero, 30 input_B: beq $t0, $t9, output #判斷是否輸入完成 li $v0, 5 syscall move $s4, $v0 #將輸入的數儲存在s4 addi $t0, $t0, 1 #計數+1 j Loop_1 #將輸入的數和陣列A裡的數作對比 Loop_1: move $t7, $zero #開始計數 addi $t8, $zero, 20 move $t1, $t6 #獲取陣列A首地址 Loop_2: lw $t2, 0($t1) #將陣列A的元素放入t2 beq $t2, $s4, AddNum #如果相同,加入sameNum陣列 addiu $t1, $t1, 4 #指標+1 addi $t7, $t7, 1 #計數+1 bne $t7, $t8, Loop_2 #還未遍歷玩,繼續遍歷 j input_B AddNum: sw $s4, 0($t5) #將輸入的數儲存進記憶體 addiu $t5, $t5, 4 #地址偏移一位 addiu $t3, $t3, 1 #陣列中元素數量+1 j input_B #輸入下一個數 NoSame: #交集為空時,輸出 la $a0, notFound li $v0, 4 syscall j Exit output: beq $t3, $zero, NoSame la $a0, Found li $v0, 4 syscall move $t7, $zero # 用於計數 控制輸入 la $t0, sameNum print_all: lw $a0, 0($t0) # 所得到的地址的數 load到 a0上 li $v0, 1 #輸出 syscall la $a0, space_str li $v0, 4 syscall addiu $t0, $t0, 4 addi $t7,$t7,1 bne $t7,$t3,print_all Exit: li $v0 10 # 退出 syscall

計組實驗開始了,實訓也開始了,好希望老師能手下留情,讓我們能夠平平安安地度過這一個月啊。還好這次MIPS的作業不難。。