在32位MIPS汇编中存储字

时间:2014-04-21 14:42:41

标签: assembly mips bit addressing

我对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位怎么做我解决了所有记忆?

2 个答案:

答案 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指令本身中编码。