Как я могу загрузить абсолютный адрес символа больше 0x7FFFFFFF в сборке RiscV64

Я пишу ядро, и мне нужно самостоятельно переместиться выше 0x7FFFFFFF. Для этого мне нужно сослаться, используя абсолютную адресацию, на начало и конец моего ядра и на символ, где выполнение продолжается после перемещения. Я не смог найти способ сделать это. Можно ли это сделать? Есть ли обходной путь?


person Topi Karvonen    schedule 21.12.2020    source источник
comment
Это все еще 32-битный адрес? Используйте lui и addi и %lo и %hi, если вы используете gnu binutils. См. руководство.   -  person Jester    schedule 21.12.2020
comment
@шут. Это так, но в riscv64 пара lui/addi может адресовать только до 0x7FFFFFFFF, потому что непосредственный lui расширен по знаку.   -  person Topi Karvonen    schedule 21.12.2020
comment
Это не имеет значения, %hi и %lo делают правильные вещи, чтобы получить правильный результат.   -  person Jester    schedule 21.12.2020
comment
@шут. В этом случае компоновщик выдает ошибку вне диапазона, как и должно быть. Например, если кто-то попытается преобразовать lui t0, 0xc0000 в riscv64, t0 будет содержать 0xFFFF_FFFF_C000_0000.   -  person Topi Karvonen    schedule 22.12.2020
comment
Похоже, это действительно работает, только если ассемблер может это разрешить. Если ему нужно создать запись о перемещении, компоновщик на самом деле жалуется.   -  person Jester    schedule 22.12.2020


Ответы (1)


Единственный способ, который я нашел, - это взять адрес загрузки и вычесть его из адреса назначения. Затем вы можете добавить это смещение к любому относительному адресу, чтобы получить абсолютный адрес.

person Topi Karvonen    schedule 21.12.2020