簡體   English   中英

陣列的MIPS指令sll

[英]MIPS instruction sll for array

通過查看t1=A[j]的示例來嘗試了解如何在MIP中執行t0 = A[j-1]

1. j is $s2, initialized to 5  
2. i is $s1  
3. Array is $s0

我有個例子t1=A[j]

MIPS

sll $t3, $s2, 2 //I don't really understand why we need to do a left shift of 2 
add $t5, $s0, $t3 
lw $1, 0($t5) 

我引用了另一個stackoverflow帖子,其中指出

因此,指令sll $ t0,$ s0、2將$ s0乘以4(2 ^ 2),然后寫回$ t0。

但是我看不到t0 = A[j]任何乘法

MIPS機器中的內存可按字節尋址,即地址0處有一個字節(8位),地址1處有一個,依此類推。MIPS機器上的整個“字”由四個字節(32位)組成。 因此,您可以將地址0到3的字節解釋為單個字。 然后,您還可以將地址1到4、2到5,... 4到7的字節解釋為單個字,但是除最后一個4..7選項外的所有字節都與0..3字節部分重疊。

因此,要將單詞數組(32位整數)存儲在內存中,其中數組的每個元素具有獨立的值,不受其他元素的影響,則至少需要4 * N字節的內存。

您的A指向數組中第一個元素的第一個字節的地址。 那么A + 1,A + 2和A + 3地址仍然指向第一個元素的后續字節。 A + 4地址是第二個元素的第一個字節的地址。

C語言具有內置的“指針數學”,其中*(A+2)類的表達式與A[2]相同,因為C編譯器將檢查指針的類型,並將“ 2”乘以大小單個元素。

但是在匯編中,您必須自己執行此操作,即在字節數組中, A[j]的地址很簡單adr = A + j ,但是對於每個元素占用四個字節的字數組,正確的地址計算是adr = A + j*4

由於整數的二進制編碼工作方式的原因,左移兩位與將數字乘以值4相同。

因此, sll $t3, $s2, 2實際上是t3 = j * 4 ,之后將其添加到A地址中,並且最終值用作從中加載字的地址。

類似於在MIPS程序集中訪問A[j-1] (用C語法),您必須將原始內存地址計算為adr = A + j*4 - 4 adr = A + (j-1)*4 (或adr = A + (j-1)*4 ,實現起來更簡單...實際上, 通常在這種循環中,您不必每次都計算指針,而是保留前一個指針值,並對它執行+ -4即可移動到內存中的下一個/上一個元素,而無需乘法/換檔)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM