Сообщения ассемблера: ошибка: попытка переместить .org назад
Я использую для компиляции инструментальную цепочку xtensa-esp32-elf-8.2.0 (основанную на gcc 8). Я также пробовал с набором инструментов xtensa-esp32-elf-5.2.0 (который основан на gcc 5). Оба генерируют одно и то же сообщение об ошибке.
Я написал jumptable, в котором 10 раз выполняются следующие инструкции, которые в основном используются для перехода по определенному адресу и выполнения определенной инструкции. Но при компиляции появляется сообщение об ошибке.
Сообщения ассемблера: ошибка: попытка переместить.org назад
.org .LSAC_jumptable_base + (16 * 6)
mov a6, a4
l32i a2, sp, 0x08
l32i a4, sp, 0x10
mov a1, a0
rsr a0, excsave1
rfe
Я искал то же самое в Интернете, но либо большинство страниц не дают жизнеспособного ответа, либо они говорят, что это проблема версии компилятора (что я не думаю, что это правильное решение, поскольку я использую последнюю версию инструментария)
Может кто-нибудь помочь
пример использования моего jumptable:
movi a3, .LSAC_jumptable_base
l32i a0, sp, 0
addx8 a2, a2, a3 // a2 is now the address to jump to
l32i a3, sp, 0x0c
jx a2
.org .LSAC_jumptable_base + (16 * 5)
mov a5, a4 //Here, a4 is the correctly read value
l32i a2, sp, 0x08
l32i a4, sp, 0x10
mov a1, a0
rsr a0, excsave1
rfe
.org .LSAC_jumptable_base + (16 * 6)
mov a6, a4
l32i a2, sp, 0x08
l32i a4, sp, 0x10
mov a1, a0
rsr a0, excsave1
rfe
1 ответ
.org .LSAC_jumptable_base + (16 * 5)
mov a5, a4 //Here, a4 is the correctly read value
l32i a2, sp, 0x08
l32i a4, sp, 0x10
mov a1, a0
rsr a0, excsave1
rfe
.org .LSAC_jumptable_base + (16 * 6)
Код между.orgs должен умещаться в 16 байтах, но он не уместится, если ассемблер не ослабит некоторые инструкции в нем: все используемые инструкции по умолчанию имеют длину 3 байта, а их шесть. Но есть 2-байтовые варианты инструкций mov и l32i, поэтому вы можете переписать их следующим образом:
.org .LSAC_jumptable_base + (16 * 5)
_mov.n a5, a4 //Here, a4 is the correctly read value
_l32i.n a2, sp, 0x08
_l32i.n a4, sp, 0x10
_mov.n a1, a0
rsr a0, excsave1
rfe
.org .LSAC_jumptable_base + (16 * 6)
OTOH вместо таблицы, состоящей из фрагментов кода фиксированного размера, может быть проще иметь таблицу адресов точек входа. Итак, ваш пример можно переписать следующим образом:
.section ".rodata", "a"
.align 4
.LSAC_jumptable_base:
.word .L0, .L1
.previous
movi a3, .LSAC_jumptable_base
l32i a0, sp, 0
addx4 a2, a2, a3 // a2 is now the address in the table
l32i a2, a2, 0 // a2 is now the address to jump to
l32i a3, sp, 0x0c
jx a2
.L0:
mov a5, a4 //Here, a4 is the correctly read value
l32i a2, sp, 0x08
l32i a4, sp, 0x10
mov a1, a0
rsr a0, excsave1
rfe
.L1:
mov a6, a4
l32i a2, sp, 0x08
l32i a4, sp, 0x10
mov a1, a0
rsr a0, excsave1
rfe