[英]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.