1

我对 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 位,并且标签被替换为vector16 位的起始地址,我如何寻址所有内存?

4

2 回答 2

1

您需要手动计算地址。MIPS 没有像 x86 这样的加载有效地址指令 (LEA)

la $t1, vector
sw $t0, 0($t1)

如果绝对地址值在 16 位以内,则可以使用绝对地址

sw $t0, vector($zero)

如果 $t1 包含数据段的地址,那么使用这个

sw $t0, vector($t1)

我不知道汇编器的语法,所以你可能需要指定一些东西来获取绝对地址的偏移量

于 2014-04-21T16:37:22.723 回答
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 位和高 16 位。首先,lui将高 16 位加载到$at. 然后加上 的值$t1。最后,低 16 位vector被编码在sw指令本身中。

于 2014-04-21T22:43:39.067 回答