首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于阵列的MIPS指令sll

用于阵列的MIPS指令sll
EN

Stack Overflow用户
提问于 2019-09-12 07:06:52
回答 1查看 2.2K关注 0票数 1

通过查看一个t0 = A[j-1]详细信息示例,试图了解如何在MIP中执行t1=A[j]

代码语言:javascript
复制
1. j is $s2, initialized to 5  
2. i is $s1  
3. Array is $s0

我有一个例子t1=A[j]

MIPS

代码语言:javascript
复制
sll $t3, $s2, 2 //I don't really understand why we need to do a left shift of 2 
add $t5, $s0, $t3 
lw $1, 0($t5) 

我引用了另一篇堆栈溢出文章,其中说

因此,指令sll $t0,$s0,2是将$s0乘以4 (2^2),然后写回$t0。

但是我没有看到t0 = A[j]的乘法运算

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-12 11:39:06

MIPS机器中的内存可按字节寻址,即地址0处有一个字节(8位)内存,地址1处有一个字节(8位),等等。MIPS机器上的整个"word“由四个字节(32位)组成。因此,您可以将地址0到3的字节解释为单个单词。然后你也可以把地址1到4,2到5,.4到7的字节解释为单个单词,但是除了最后4 .. 7选项之外,所有的字节都与0..3字节部分重叠。

因此,要在内存中存储单词数组(32位整数),其中数组的每个元素都有独立的值,不受其他元素的影响,您至少需要4*N字节的内存。

您的A指向数组中第一个元素的第一个字节的地址。然后A+1、A+2和A+3地址仍然指向第一个元素的以下字节。A+4地址是第二个元素的第一个字节的地址。

C语言内置了“指针数学”,其中像*(A+2)这样的表达式与A[2]相同,因为C编译器将检查指针的类型,并将"2“乘以单个元素的大小。

但是在程序集中,您必须自己做这件事,即在字节数组中,A[j]的地址是简单的adr = A + j,但是对于每个元素占据4个字节的字数组,正确的地址计算是adr = A + j*4

由于整数二进制编码的工作方式,两位留下的移位与将数字乘以值4完全相同。

因此,sll $t3, $s2, 2实际上是t3 = j * 4,它后来被添加到A地址,最后的值被用作地址来加载单词。

类似地,要在MIPS程序集中访问A[j-1] (在C语法中),您必须将原始内存地址计算为adr = A + j*4 - 4 (或adr = A + (j-1)*4 ),以实现更简单的.实际上,通常在这类循环中,您不会每次计算指针,而是保留前一个指针值,只需对其执行+-4操作,以移动到内存中的下一个/前一个元素,而不需要乘法/移位)。

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

https://stackoverflow.com/questions/57901409

复制
相关文章

相似问题

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