MIPS:在基本偏移地址中使用标签

时间:2018-06-28 16:02:29

标签: assembly mips

我正在尝试使用标签作为基本偏移地址模式下的偏移量, 用于在类似Shellcode的环境中访问全局变量。代码和数据的基地址存储在$s7中,我正在尝试这样做:

# global variable @ offset 20 in code, 
foobar: .word <non-constant value>

# ...

lw $s0, foobar($s7)

然后使汇编程序将其翻译为lw $t0, 20($s7)。相反,当不使用特殊选项进行编译时,它会通过$gp绕道而行。同样,在使用-mno-abicalls-mno-shared时,lw会转换为:

lui     $s0, 0x0
addu    $s0, $s0, $s7
lw      $s0, 20($s0)

是否有任何方法可以将foobar解释为立即值,就像进行addiu $t0, $t1, foobar时一样,它可以按预期转换为addiu $t0, $t1, 20

到目前为止,浏览文档并没有产生任何有用的结果。

谢谢!

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。现在,我将使用lw $s0, %lo(foobar)($s7),只要标签为<= 0xffff,它就可以使用-而且您无法在具有较大偏移量的单个指令中执行此操作。