Сообщения ассемблера: Ошибка: попытка переместить .org назад - PullRequest
0 голосов
/ 24 октября 2019

Я использую xtensa-esp32-elf-8.2.0 toolchain для компиляции (которая основана на gcc 8). Я также пытался с xtensa-esp32-elf-5.2.0 toolchain (который основан на gcc 5). Оба генерируют одно и то же сообщение об ошибке.

Я написал таблицу переходов, в которой 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

Я просматривал веб-страницу для того жено либо большинство страниц не дают жизнеспособного ответа, либо говорят, что это проблема версии компилятора (которую я не считаю правильным решением, поскольку я использую последний набор инструментов)

Может кто-нибудь помочь, пожалуйста

пример использования моей перемычки:

    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 Ответ

1 голос
/ 26 октября 2019
.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 байта и их 6,Но есть 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
...