我需要在 MIPS assenbly 中撰寫此代碼:
int i, size, result = 0;
int * array;
...
//size gets a value from the user
//array is allocated according to this value
...
for ( i=0;i<size;i )
{
if (array[i] %2 ==0) // if array[i] is even
result = array[i]; // add it to the result
}
使用的暫存器為i的$s1,大小的$s2,陣列的起始地址的$s3,結果的$s4。
我寫:
ori $s1,$0,0 // int i
ori $s3,array // int array *
add $s4,$zero,$zero // int result = 0;
l1:
bge $s1,$s2,Done // for loop i<size
...
lw $5, 0($s3) // $5 = array[I]
addu $s4,$s4,$s5 // result = array[I]
j UPDATE
UPDATE:
addi $s1, $s1, 1 // i
addi $s4, $s4, 4 // move array pointer
j L1 // goto l1
DONE:
nop
我不知道如何寫兩件事:
- 如果(陣列[i] %2 ==0)
- size 從用戶那里得到一個值,請幫我處理這些事情。謝謝
所以我現在寫道:
ori $s1,$0,0 // int i
li $v0, 5 // scan int from user
la $s3,array // int array *
add $s4,$zero,$zero // int result = 0;
l1:
bge $s1,$s2,Done // for loop i<size
lw $s5, 0($s3) // $s5 = array[I]
add $s6,$zero,$s5 // $s6 = $s5
mov $s6, 31
and $s7,$s6,1
bne $s7, $zero, ADDING
j UPDATE
ADDING:
addu $s4,$s4,$s5 // result = array[I]
j UPDATE
UPDATE:
addi $s1, $s1, 1 // i
addi $s4, $s4, 4 // move array pointer
j L1 // goto l1
DONE:
nop
uj5u.com熱心網友回復:
建議您從一些作業示例開始:那里有很多 MIPS 示例。
但是,您有 C 代碼并且在 MIPS 中遵循該代碼,這是一種非常好的方法。
首先,建議您將陣列宣告為全域陣列,也許您已經這樣做了,但未顯示。
該指令ori $s3,array // int array *需要是一個la操作碼,代表“加載地址”(對于 MARS 或 QtSpim)。這些會將標簽的地址加載到暫存器中。
array[i]是通過i從索引縮放到位元組偏移量,然后將該位元組偏移量添加到 的位元組地址array,最后取消參考該指標來實作的。由于陣列的每個元素占用 4 個位元組,并且在位元組可尋址機器上,每個單獨的位元組都有自己的地址,因此下一個陣列元素是記憶體中更遠的 4 個地址。因此,索引 0 位于陣列地址,而索引 1 位于陣列 4。我們在 C 中看不到這種縮放,因為它知道型別(它知道元素大小為 4,所以 1 表示 4)并且確實如此自動縮放。
因此,我們按比例縮放(即乘以)i4,因為 4 是 2 的冪,所以通常通過向左移動 2 位來完成。移位就像乘以 10 但是以二進制而不是十進制的形式,所以實際上乘以 2。移位兩次會乘以二進制 100,因此乘以十進制的 4。當然,MIPS 可以在一條指令中移動 2 個位置。
要進行這種移位,您需要選擇一個未使用的暫存器來保存中間結果,即位元組偏移量。建議$t這些型別的短期臨時值的暫存器。
然后將該中間結果添加到陣列基址的位元組地址,在這里$s3(也許還將該結果發送到另一個未使用的暫存器)。
現在可以取消參考該新中間值,lw $5, 0($s3) // $5 = array[I]除了將索引計算作為基地址而不是$s3.
在回圈開始之前,您還需要$s2使用大小進行初始化。
以下構造無害但也無用:
j UPDATE
UPDATE:
如果它對您有幫助,您可以留下標簽,但不需要從緊接在前的指令中取出 j,因為處理器會自然而然地這樣做。
需要明確的是,標簽是用于匯編代碼的,但它們被匯編程式洗掉并且不會出現在機器代碼中。處理器僅在執行機器代碼指令時執行操作。每條指令都告訴處理器接下來要執行什么指令,因此addu $s4,$s4,$s5 // result = array[I]可以/將告訴處理器執行addi $s1, $s1, 1 // i 而無需j.
請注意以下拼寫錯誤:
lw $5, 0($s3) // $5 = array[I]
addu $s4,$s4,$s5 // result = array[I]
第一行應該指定$s5not $5,這是允許的,但是不同的暫存器 ( $a1)。(我會$t為該中間結果使用暫存器而不是$s暫存器,但沒關系。)
您可以通過除法或通過檢查低位來更簡單地完成 %2。C 運算式將& 1與array[i] & 1. 由于在二進制中,低位位置代表 2 0,因此這是檢查偶數/奇數的方法(0 位位置是 2 的唯一奇次冪)。MIPS 可以在一條指令中完成屏蔽。該1作為掩模說只保留從另一個運算元的低位(array[i])。
== 0,因為它是條件操作的一部分,將類似于bge您對 for 回圈退出條件所做的操作。
要從 MARS 中的用戶那里獲取數字,請使用系統呼叫 #5。按照此處或其他地方的幫助或在線示例中的說明進行操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/383209.html
