MIPS: использовать метку в базовой адресации - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь использовать метку в качестве смещения в режиме адресации базового смещения, для доступа к глобальной переменной в среде, подобной шеллкоду. Базовый адрес кода и данных хранится в $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 голосов
/ 28 июня 2018

Я нашел решение. На данный момент я буду использовать lw $s0, %lo(foobar)($s7), который работает, пока метки <= 0xffff - плюс вы не можете сделать это в одной инструкции с большим смещением в любом случае.

...