C到MIPS程序集混淆 [英] C to MIPS assembly confusion

查看:4
本文介绍了C到MIPS程序集混淆的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是汇编编码的新手,我遇到了一个问题,要求将以下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。


我认为这种误解来自于运算符[]是如何在数组中实现的,所以我将尝试详细说明这一点。考虑以下C代码:

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

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

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

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

结束语:

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

这篇关于C到MIPS程序集混淆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆