簡體   English   中英

C到MIPS的組裝混亂

[英]C to MIPS assembly confusion

我是匯編編碼的新手,遇到一個問題,該問題說將以下C代碼轉移到MIPS匯編中。

b[8] = b[i-j] + x ;

變量i,j,x位於寄存器7,4和15中,而數組b的基址則位於十進制2,870,220中。

我想出了以下解決方案

 lui $2, 0x002B
 ori $2, $2, 0xCBCC
 sub $3, $7, $4
 add $3, $2, $3
 lw $12, 0($3)
 addu $12, $12, $15
 sw $12, 32($2) 

但是當我檢查答案時,又有一行

sll $3, $3, 2 

在減法指令之后。

有人可以解釋一下為什么我們需要將寄存器$ 3的內容乘以4嗎?

我會舉例說明。

假設我們將這5個字節存儲在內存位置0x00000000至0x00000004中(例如,我不考慮內存映射):

| 0x27 | 0x82 | 0x97 | 0x42 | 0x11 |

在存儲器地址0x00000000加載一個字時,它將為您提供32位字0x27829742,因為它會連接基地址中的下一個4個字節。

但是,在內存地址0x00000001處,您將獲得0x82974211。


我認為這種誤解來自於如何在數組中實現operator [],因此我將嘗試對此進行擴展。 考慮以下C代碼:

int arr[3] = { 1, 3, 5 };
printf("%d\n", arr[2]); // print third element

訪問arr [2]時,必須考慮數組元素的大小 假設int標准為32位(4字節),則在編譯時將獲得以下代碼:

int arr[3] = { 1, 3, 5 };
printf("%d\n", *(arr + (2 * sizeof(int)))); // print third element

在這種情況下,它將數組的基本指針偏移一個整數字節的值再乘以要訪問的索引,然后進行引用以獲取指定的元素。

結論:

內存塊以8位字節而不是32位字對齊。

暫無
暫無

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

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