我对32位MIPS汇编中的存储字指令有疑问。假设我在数据部分中有这个:
.data
vector: .word 2,3,4,5,6......
并且内存中的向量从地址10开始(十进制基本示例)。当我这样做时:
.text
sw $t0,vector($t1)
标签vector
是否替换为10?
编辑:
li $v0, 1
la $a0,vector
syscall
我这样做了,我看到了起始地址,但是我不明白一件事:如果立即字段是16位且标签被替换为vector
的起始地址,那么16位怎么做我解决了所有记忆?
答案 0 :(得分:1)
您需要手动计算地址。 MIPS没有像x86
那样的加载有效地址指令(LEA)la $t1, vector
sw $t0, 0($t1)
如果绝对地址值适合16位,则可以使用绝对寻址
sw $t0, vector($zero)
如果$ t1包含数据段的地址,请使用此
sw $t0, vector($t1)
我不知道汇编程序的语法,因此您可能需要指定一些内容来获取绝对地址的偏移量
答案 1 :(得分:0)
汇编程序正在帮助你完成幕后工作。寄存器编号1,又名。 $at
保留为汇编程序临时(因此名称)。如果地址不适合可用位,汇编器将生成额外的指令,使用$at
计算完整地址。您可以看到,如果您反汇编生成的目标文件:
0: 3c010000 lui at,0x0
0: R_MIPS_HI16 .data
4: 00290821 addu at,at,t1
8: ac280000 sw t0,0(at)
8: R_MIPS_LO16 .data
链接后,上面的代码段可能如下所示:
400000: 3c010040 lui at,0x40
400004: 00290821 addu at,at,t1
400008: ac28100c sw t0,4108(at)
vector
的地址已分为低位和高位16位,并有不同的重定位。首先,lui
会将高16位加载到$at
。然后添加$t1
的值。最后,vector
的低16位在sw
指令本身中编码。