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

Как в ARM ассемблере вывести значение числа?

Имеется код, который выводит на консоль "Hello, world."
.syntax unified
.data
message:
        .asciz "Hello, world."
len = . - message
.text
        .global _start
_start:
        mov     r0, $1
        ldr     r1, =message
        ldr     r2, =len
        mov     r7, $4
        swi     $0

        mov     r0, $0
        mov     r7, $1
        swi     $0

Как вывести значения числа на консоль? Например, значение регистра. Желательно в десятичной СС, но можно и в двоичной
  • Вопрос задан
  • 636 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Karpion
Регистр у нас 32-битный, может принимать значения до 4'294'967'296, это всего десять цифр. Значит, резервируем массив из 11 байтов, последний забиваем нулём (т.е. '\0' - тут бэкслеш); по некоторым соображениям, имеет смысл взять 12 байт, тогда перед цифрами заведомо будет пробел, разделяющий числа.
Или не надо забивать последний байт нулём, если там передаётся размер строки.

Затем берём регистр, делим его на десять.
Остаток отделения - это последняя цифра. Прибавляем к этому остатку от деления '0' (код цифры "ноль" - без бэкслеша) - получаем символ последней "буквы" нашей строки.
Целую часть от деления помещаем в тот же регистр, и в цикле повторяем операцию - получаем предпоследнюю цифру и так далее.
Когда целая часть от деления стала нулём - то всё до начала строки забиваем пробелами.

С шестнадцатеричными цифрами и проще, и сложнее.
Проще - делить. Остаток от деления получается операцией "AND 0x0F", целая часть деления получается сдвигом "<< 4".
Сложнее - получать цифры. От "0" до "9" - получаются прибавлением того же '0', а вот от "A" до "F" надо прибавлять "'A'-0xA".

А распечатать строку - мы умеем.

PS: Старею, потихоньку забываю тонкости... А когда-то я активно любил это дело...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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