#riscv #riscv32
Вопрос:
У меня есть следующие строки
la x14, L2
sw x13, 0(x14)
где находится адрес L2 0x2018
.
Когда я генерирую файл ELF и проверяю его с помощью objdump
, это то, что я вижу (только соответствующие части):
...
1018: auipc a4,0x1
101c: mv a4,a4
1020: sw a3,0(a4) # 2018 <L2>
...
Строка в 1018, т.е. mv a4 a4
переводится в addi a4, a4, 0
которую, является избыточной. Почему это генерируется? Разве это не будет работать без этой строки?
Есть ли у gcc требование всегда генерировать 2 инструкции для la
инструкции?
Ответ №1:
la
является псевдокомандой для RISC-V.
См., например, это описано в книге Программирование на языке сборки RISC-V, глава 4.10.2 «Псевдоинструкция la».
Комментарии:
1. Спасибо, да, но что нужно генерировать
mv a4, a4
? Это в основном то жеnop
самое, что и .2.
mv a4, a4
то жеaddi a4, a4, 0
самое, что и . В вашем случае на нее указывает перемещение, чтобы компоновщик мог заменить0
на подходящее значение. В случае, если значение остается равным нулю, инструкция удаляется. Этот процесс известен как расслабление компоновщика .