我是汇编编码的新手,我遇到了一个问题,即将以下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?
答案 0 :(得分:0)
我举一个例子。
假设我们将这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]时,必须考虑数组元素的 size 。假设int标准是32位(4字节),您将在编译期间获得以下代码:
int arr[3] = { 1, 3, 5 };
printf("%d\n", *(arr + (2 * sizeof(int)))); // print third element
在这种情况下,它将数组的基指针偏移一个整数值的字节乘以所访问的索引,然后引用它来获取指定的元素。
总结:
内存块以8位字节对齐,而不是32位字。