@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

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

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

Войти через центр авторизации
Похожие вопросы