在MIPS架构中使用srlv指令处理8字节交替位数组的效果及字节内位提取方法问询
嘿,我来帮你梳理清楚这个问题,先直接给你结论:你执行这些指令后,数组完全不会发生任何变化,更不会变成[1, 0, 1]。下面给你详细拆解原因,以及正确提取字节内位的方法:
为什么你的当前指令无效?
你混淆了「内存地址」和「数组元素值」的操作逻辑:
la $t0, Array:这条指令是把数组Array的起始内存地址加载到寄存器$t0里,不是把数组里的0、1交替数据加载进去。打个比方,$t0存的是你家的门牌号,不是你家里的物品。srlv $t2, $t0, $t1:这条是对$t0里的「门牌号(地址)」做逻辑右移1位,结果存在$t2里——这操作的是地址本身,和数组里的内容完全无关,数组的原始数据不会有任何改动。
MIPS中提取字节内位的正确姿势
如果你想提取数组中某个字节的特定位,得先把目标字节加载到寄存器,再对位进行操作,步骤如下:
加载目标字节到寄存器
用lb(加载字节)指令读取数组中的单个字节,比如你要访问数组第n个字节(从0开始计数):li $t3, n # 数组索引n lb $t0, Array($t3) # 把Array[n]的字节加载到$t0现在
$t0里就存了你要处理的那个8位交替0、1的字节数据。提取单个位
比如要提取该字节的第3位(从0开始数,最低位是第0位):li $t1, 3 # 要提取的位的位置 srlv $t2, $t0, $t1 # 把目标位移到最低位 andi $t2, $t2, 1 # 只保留最低位,得到该位的值(0或1)提取连续的多位
比如要提取第2到第4位(共3位):li $t1, 2 # 把目标位段移到最低位需要右移的位数 srlv $t2, $t0, $t1 # 右移后,目标位段处于低3位 andi $t2, $t2, 0x7 # 用掩码0b111保留低3位,得到位段的值
额外小贴士
- 如果要处理整个数组的每个字节,需要用循环遍历数组的每个索引,重复上述加载和位提取操作。
- 注意MIPS的端序(大端/小端),不过按字节访问数组时,只要索引对应正确,端序不会影响单字节内的位操作。
内容的提问来源于stack exchange,提问作者Weket Lava
相关产品推荐
相关产品推荐

