【发布时间】:2018-06-28 16:02:29
【问题描述】:
我正在尝试使用标签作为基本偏移寻址模式中的偏移,
用于在类似 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?
到目前为止,挖掘文档并没有产生任何有用的东西。
提前致谢!
【问题讨论】:
-
您为什么要尝试通过运行时值(寄存器)来处理编译时/链接时常量?这没有任何意义。
-
这个值其实不是一个常数,我只是拿来举例!
-
把它想象成一个全局变量——我已经更新了这个问题来澄清这一点!
-
@EOF:这是与位置无关的代码,但 MIPS 没有 PC 相对寻址模式。 (只有 reg + disp16,我认为这是一个 signed 位移,所以实际上 OP 的答案适用于标签 0x7fff)。
-
@PeterCordes 现代 MIPS 版本有
[d]addiupc用于 PIC。