【问题标题】:MIPS: use label in base-offset addressingMIPS:在基偏移寻址中使用标签
【发布时间】: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。

标签: assembly mips


【解决方案1】:

我找到了解决方案。现在我将使用lw $s0, %lo(foobar)($s7),只要标签是&lt;= 0xffff,它就可以工作——而且你不能在一条具有更大偏移量的指令中执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多