這里是高級函式。J[6] = K[d-e]
d = $t0, e = $t1, J = $s1, K = $s2, 最終結果在$s4
到目前為止,我有:
lw $t2, 24($s1) #將J[6]載入$t2中
sub $t3, $t0, $t1 #從d減去e到$t3
我知道我不能做的是lw $t4, $t3($s2)但我不確定如何翻譯K[$t0 - $t1]。
uj5u.com熱心網友回復:
首先:要把這個陳述句翻譯成匯編,
J[6] = K[d-e]。
x1 = d-e # 存盤 subt
x2 = x1 * 4 # 按元素大小進行縮放
x3 = K x2 # 位元組地址指標算術
x4 = *x3 # 解除參考以獲取K[d-e]。
x5 = J 24 # 計算J[6]的位元組地址
*x5 = x4 # 將K[d-e]的值存入J[6]中
(注意,三個地址的代碼從不重復使用臨時變數,盡管在MIPS的等價物中,這將是常見的重復使用/重新利用暫存器的臨時結果(當舊的臨時值不再需要時))。
另外,MIPS可以做J[6]=而不需要單獨計算J 24,所以x5不需要被計算。
*操作,即C運算子,被稱為析構,當它出現在=賦值的右手邊時,它是作為一個加載指令從記憶體中獲取資料。 當它出現在=賦值的左手邊時,那是作為一個存盤指令將資料存入記憶體。
接下來,讓我們看看地址計算以及MIPS能做什么和不能做什么。
你對$t3($s2)的想法是正確的,但MIPS不能這樣做。 它只能做常數索引。
那么,$t3($s2)代表什么呢? 它是一個動態索引和一個基礎地址的組合,從而產生一個元素地址。
在這種(不支持的形式)$t3($s2)中,這兩個值$t3和$t2將如何結合? 通過添加:我們可以將一個索引添加到一個指標上,得到一個新的指標。
然而,由于MIPS是一個可位元組尋址的機器,MIPS中的地址& 指標是指單個位元組。 一個位元組是一個8位資料。 因此,當我們在這樣的機器上使用指標和地址時,這些地址和指標的型別是位元組地址。
當我們使用32位字時,這些字占據了多個位元組,事實上,一個32位字有4個8位位元組。 當一個32位是一個陣列的元素時,該字占據了4個位元組,每個位元組都有自己的位元組地址,所以它也占據了4個位元組地址。
類似于整個陣列有時被稱為其開始的地址(其索引0),整個元素(4個位元組)被稱為其最低位元組的地址。 從一個元素移動到下一個,意味著移動4個位元組的地址。
因此,給定一個索引,我們必須將該索引轉換為一個位元組的偏移量,在這種情況下,這被稱為縮放。 縮放系數與陣列中元素的大小相同,這里是一個整數陣列,所以每個元素有4個位元組。 因此縮放系數為4。
因此,我們想要的更像是$t3*4($s2),但當然MIPS也不能這樣做。 但使用單獨的指令,MIPS可以乘以4,MIPS也可以將動態值加在一起。 一旦這些完成,我們可以使用MIPS確實提供的常數系數解除參考的形式--與加法相同,因為我們已經計算了完整的地址。
有兩種方法可以做到。
K[i 1]:
將
i和1相加,然后將這個結果乘以4,再加上K,并在加載或存盤指令中使用0作為偏移。將
i乘以4,然后加上K,在存盤指令中使用4作為偏移量。
表格2使用非零的偏移值4,也就是 1的比例為*4. 這剛好比方案1短了1條指令。
如何乘以一個小常數如4,假設要乘的數字在
$t0,而結果希望在$t1:
- 數字與自身相加4倍,使用目標來累積結果:
添加$t1, $t0, $t0 # t1 = t0 t0 = t0 * 2
add $t1, $t1, $t0 # t1 = t1 t0 = t0 * 3
添加 $t1, $t1, $t0 # t1 = t1 t0 = t0 * 4
- 將數字加到自己身上一次,然后將該數字加到自己身上一次 。
添加$t1, $t0, $t0 # t1 = t0 t0 = t0 * 2
add $t1, $t1, $t1 # t1 = t1 t1 = t0 * 2 t0 * 2 = t0 * 4
- 將數字左移2位(二進制) 。
sll $t1, $t0, 2 # t1 = t0 << 2 = t0 * 4
uj5u.com熱心網友回復:
這只是我在評論者建議的幫助下解決自己的家庭作業問題。 這個答案的早期修訂包括一個錯誤的版本,即從J[6]加載而不是存盤和過度使用temps。
這就是偽代碼:
x1 = d-e # 存盤減法
x2 = x1 * 4 # 按元素大小進行縮放
x3 = K x2 # 位元組地址指標算術
x4 = *x3 # 解除參考以獲取K[d-e]。
x5 = J 24 # 計算J[6]的位元組地址
*x5 = x4 # 將K[d-e]的值存入J[6]中
這是嘗試性的實作,唯一的問題是最后兩步,在問題中,它指定$s4來保存最終的答案,但是J[6]仍然需要被覆寫,因為那是賦值陳述句:
sub $t3, $t0, $t1 #將d-e減去$t3,下一步是乘以4的比例。
加$t5, $t3, $t3 # t5 = t3 t3 = t3 * 2
添加 $t5, $t5, $t5 # t5 = t5 t5 = t3 * 4 = (d-e)*4 作為位元組偏移量
添加$t3, $s2, $t5 #添加d-e索引加上K的第0個索引,得到最終的索引到$t3的臨時檔案中
lw $t3, 0($t3) #根據索引將K的指標加載到K的值內
sw $s1, 0($t3) #將K的值存入J[6]中
sw $s4, 24($s1) #將J[6]存盤到$s4中,它是24,因為索引6 x 4位元組陣列元素大小
后兩者的另一種可能性是這樣的,我不完全確定:
lw $s4
lw $s1, 24($s1) # 計算J[6]的位元組地址,其舊值并不重要
sw $s1, 0($t3) #將K的值存入J[6]中
sw $s4, 24($s1) #將J[6]存盤到$s4中,它是24,因為索引6 x 4位元組陣列元素大小
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/331324.html
標籤:
下一篇:試圖在wpf桌面應用程式中使用application/x-www-form-urlencoded進行APIPOST操作。
