汇编入门者求助:C转汇编中数组索引为何按字长(4字节)缩放?
为啥数组索引要乘以4(2^2)来计算偏移量?
嘿,作为汇编初学者能揪出这个细节真的超赞!我来给你把这个问题讲得明明白白~
首先得搞清楚两个关键知识点:
- MIPS的内存编址规则:MIPS是按字节来给内存单元编号的,每个编号对应1字节的存储空间。
- 数组在内存中的存储方式:你这里的
save[]应该是C里的int数组吧?每个int元素在MIPS架构下占4字节(也就是1个"字",word),而且数组元素是连续挨着存在内存里的。
那我们要访问save[i]的时候,得先算出它在内存里的具体地址对吧?这个地址的公式是:元素地址 = 数组基址 + 索引 × 每个元素的字节数
这里数组基址就是存在$s6里的save[]起始地址,每个int元素占4字节,所以索引i(存在$s3里)就得乘以4,才能得到正确的偏移量。你看到的"乘以2^2"其实就是左移2位——因为在二进制里,左移n位等价于乘以2的n次方,左移2位正好就是乘以4,这比用乘法指令效率更高,所以汇编里经常这么干。
举个栗子更直观:
- 当i=0时,0×4=0,元素地址就是$s6,正好是
save[0]的起始地址; - 当i=1时,1×4=4,元素地址就是$s6+4,这就是
save[1]的起始地址(因为save[0]占了前4字节); - 当i=2时,2×4=8,元素地址就是$s6+8,对应
save[2],以此类推。
C语言里编译器会自动帮我们完成这个"索引缩放"的操作,所以我们写save[i]的时候根本不用管,但到了汇编层面,一切都得手动来——因为汇编是直接和内存地址打交道的,必须精确计算出每个元素的字节偏移,才能正确访问到想要的数组元素。
内容的提问来源于stack exchange,提问作者lbrobinho
相关产品推荐
相关产品推荐

