繁体   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