Какой правильный SWI-оператор для печати целых чисел в сборке? - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь сделать некоторое время l oop в сборке, но мой SWI-оператор, чтобы получить числа для «печати», дает мне ошибку.

.text
    mov r1, #10
    mov r2, #1
    b L2

L3:
    SWI 0x6b

    sub r1,r1,#-1

L2:
    cmp r1, r2
    bgt L3

Ошибка возникает, когда я добираюсь до SWI 0x6b и точное сообщение об ошибке «Не реализованный SWI-код.

1 Ответ

1 голос
/ 19 февраля 2020

Вы можете столкнуться с несколькими проблемами здесь:

  1. Предполагается, что ARMSim v2.1 поддерживает подмножество интерфейса Angel / Semihosting . Это означает, что r0 должен содержать номер функции, r1 - указатель на блок параметров, и что используемый SWI-номер должен быть 0x123456, как в swi 0x123456, и ваша программа явно не совместима.
  2. Если вы хотите отобразить ди git, вам нужно конвертировать этот ди git в представление этого ди git, которое можно отобразить. Например, если регистр r1 содержит # 10, значение должно быть обработано так, чтобы отображалось значение # 'A'. Если r1 содержит значение в диапазоне 0..9, оно должно быть обработано так, чтобы отображалось значение в # '0' .. # '9'.
  3. ARMSim v2.1 I на моей системе Lubuntu 19.10 не удалось выполнить swi 0x123456, и я получил то же самое печально известное сообщение об ошибке "Unimplemented SWI code.", которое вы получили. Более того, программа Angel_print_int.s, содержащаяся в файле архива примеров ARMSim , также не удалось выполнить.

На этом этапе я предполагаю, что ARMSim v2.1 не работает должным образом, и я переключился на онлайн-симулятор с поддержкой Terasi c DE1-So C Board . Эмуляция поддерживает устройство JTAG-UART , подходящее для отображения символов.

Программа была изменена таким образом, чтобы она могла отображать шестнадцатеричные представления значений в диапазоне 1..10 с помощью эмулированное устройство JTAG-UART;

.global _start
.text
_start:
    mov r1, #10
    mov r2, #1
    // http://www-ug.eecg.toronto.edu/msl/nios_devices/dev_jtaguart.html
    ldr r3, =0xFF201000
    b L2

L3:
    mov r0, r1
    // convert value contained in r1 into a displayable hexadecimal digit
    cmp r0,#9
    bgt hex
dec:
    add r0,#'0'
    b continue
hex:
    add r0,#'A' - 10
continue:
    strb r0, [r3]

    sub r1,r1,#1

L2:
    cmp r1, r2
    bge L3
    mov r0, #'0'
done:
    b done

Компиляция / загрузка / выполнение программы привели к отображению следующих символов в JTAG UART Windows справа:

A987654321

An альтернативой использованию этого эмулятора будет использование QEMU для Windows и arm-none-eabi-gdb.exe . Я мог бы предоставить рабочую процедуру / пример на случай, если вас это заинтересует.

Надеюсь, это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...