通过查看一个t0 = A[j-1]详细信息示例,试图了解如何在MIP中执行t1=A[j]
1. j is $s2, initialized to 5
2. i is $s1
3. Array is $s0我有一个例子t1=A[j]
MIPS
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]的乘法运算
发布于 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操作,以移动到内存中的下一个/前一个元素,而不需要乘法/移位)。
https://stackoverflow.com/questions/57901409
复制相似问题