@delphikettle
Программирую в свободное от учёбы время

Почему ругается компилятор?

Компилятор выдаёт ошибку
invalid literal constant pool needs to be closer
при запуске следующего кода:
printregs
printregs
exit

Макрос printregs:
var ascii spaceSym " "
var ascii nSym "\n"

.macro printregs
    loadregs
    printnum var_r0
    writestr spaceSym 1
    printnum var_r1
    writestr spaceSym 1
    printnum var_r2
    writestr spaceSym 1
    printnum var_r3
    writestr spaceSym 1
    printnum var_r4
    writestr spaceSym 1
    printnum var_r5
    writestr spaceSym 1
    printnum var_r6
    writestr spaceSym 1
    printnum var_r7
    writestr spaceSym 1
    printnum var_r8
    writestr spaceSym 1
    printnum var_r9
    writestr spaceSym 1
    printnum var_r10
    writestr spaceSym 1
    printnum var_r11
    writestr spaceSym 1
    printnum var_r12
    writestr spaceSym 1
    printnum var_r13
    writestr spaceSym 1
    printnum var_r14
    writestr spaceSym 1
    printnum var_r15
    writestr spaceSym 1
    printnum var_a1
    writestr spaceSym 1
    printnum var_a2
    writestr spaceSym 1
    printnum var_a3
    writestr spaceSym 1
    printnum var_a4
    writestr nSym 1
.endm

Макрос writestr:
.macro writestr mes length
    mov r0, $stdout
    ldr r1, =\mes
    ldr r2, =\length
    write
.endm

Макрос printnum:
var int bufForPrint 0
.macro printnum num
    local loopForPrintNum1
    local loopForPrintNum2
    loadvar r1 \num
        mov r4, $0
        loopForPrintNum1:
            push {r4}
            mov r2, $10
            udiv r3, r1, r2
            mls r4, r2,r3,r1
            add r4, $48
            mov r1, r3
            cmp r1, $0
            bne loopForPrintNum1
        push {r4}
        loopForPrintNum2:
            pop {r4}
            storevar r4 bufForPrint
            writestr bufForPrint 1
            cmp r4, $0
            bne loopForPrintNum2
.endm

Макрос loadvar:
.macro loadvar r var
    ldr \r, =\var
    ldr \r, [\r]
.endm

Макрос loadregs:
var int var_r0 0
var int var_r1 0
var int var_r2 0
var int var_r3 0
var int var_r4 0
var int var_r5 0
var int var_r6 0
var int var_r7 0
var int var_r8 0
var int var_r9 0
var int var_r10 0
var int var_r11 0
var int var_r12 0
var int var_r13 0
var int var_r14 0
var int var_r15 0
var int var_a1 0
var int var_a2 0
var int var_a3 0
var int var_a4 0

.macro loadregs
    storevar r0 var_r0
    storevar r1 var_r1
    storevar r2 var_r2
    storevar r3 var_r3
    storevar r4 var_r4
    storevar r5 var_r5
    storevar r6 var_r6
    storevar r7 var_r7
    storevar r8 var_r8
    storevar r9 var_r9
    storevar r10 var_r10
    storevar r11 var_r11
    storevar r12 var_r12
    storevar r13 var_r13
    storevar r14 var_r14
    storevar r15 var_r15
    storevar a1 var_a1
    storevar a2 var_a2
    storevar a3 var_a3
    storevar a4 var_a4
.endm

Макрос storevar:
.macro storevar r var
    push {r0}
    ldr r0, =\var
    str \r, [r0]
    pop {r0}
.endm

Макрос var:
.altmacro
.macro var type name val
    .data
        \name\(): .\type \()\val
    .text
.endm

В чём могут быть причины ошибки и как их исправить?
  • Вопрос задан
  • 237 просмотров
Решения вопроса 1
Я бы предположил, что между местом расположения в памяти переменной с литералом и местом расположения в памяти команды, в которой она используется, оказалось слишком большое расстояние, которое не может адресовать используемый тип адресации.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы