我正在尝试使用标签作为基本偏移地址模式下的偏移量,
用于在类似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
?
到目前为止,浏览文档并没有产生任何有用的结果。
谢谢!
答案 0 :(得分:1)
我找到了解决方案。现在,我将使用lw $s0, %lo(foobar)($s7)
,只要标签为<= 0xffff
,它就可以使用-而且您无法在具有较大偏移量的单个指令中执行此操作。