首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C到MIPS程序集混淆

C到MIPS程序集混淆
EN

Stack Overflow用户
提问于 2016-07-20 12:08:31
回答 1查看 372关注 0票数 0

我是汇编编码的新手,我遇到了一个问题,那就是把下面的C代码转移到MIPS汇编。

代码语言:javascript
代码运行次数:0
运行
复制
b[8] = b[i-j] + x ;

并且变量i、j、x在寄存器7、4和15中,并且阵列B的基地址在2,870,220十进制中。

我想出了以下解决方案

代码语言:javascript
代码运行次数:0
运行
复制
 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) 

但当我检查答案时,又多了一行

代码语言:javascript
代码运行次数:0
运行
复制
sll $3, $3, 2 

在减法指令之后。

有人能解释一下为什么我们需要将寄存器$3的内容乘以4吗?

EN

回答 1

Stack Overflow用户

发布于 2016-07-23 13:18:05

我将给出一个例子。

假设我们将这5个字节存储在内存位置0x00000000到0x00000004中(例如,我忽略了内存映射):

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

当在存储器地址0x00000000加载一个字时,它会给出32位字0x27829742,因为它连接了从基地址开始的下4个字节。

但是,在内存地址0x00000001处,您会得到0x82974211。

我认为这种误解来自于operator[]是如何在数组中实现的,所以我将尝试扩展这一点。考虑下面的C代码:

代码语言:javascript
代码运行次数:0
运行
复制
int arr[3] = { 1, 3, 5 };
printf("%d\n", arr[2]); // print third element

当访问arr2时,它必须考虑数组元素的大小。假设int标准是32位(4字节),您将在编译时获得以下代码:

代码语言:javascript
代码运行次数:0
运行
复制
int arr[3] = { 1, 3, 5 };
printf("%d\n", *(arr + (2 * sizeof(int)))); // print third element

在这种情况下,它将数组的基指针偏移一个整数字节值乘以被访问的索引,然后进行引用以获取指定的元素。

总结:

内存块是以8位字节对齐的,而不是32位字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38472150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档