Преобразование целого числа в шестнадцатеричную строку в сборке ARM - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь выяснить, как преобразовать 32-разрядное целое число в его шестнадцатеричное представление.Я знаю, что мне нужно отделить последние 4 бита, использовать регистр переключателя, чтобы определить, какому шестнадцатеричному символу он соответствует.И тогда мне нужно повторить это для каждого из 4 битов.Я изо всех сил пытаюсь выяснить, как получить каждый из 4 битов от LSB до MSB.Кто-нибудь может помочь?Спасибо!

1 Ответ

0 голосов
/ 21 ноября 2018

Маскировка и смещение, как предлагается в комментариях и в вашем ответе , даст вам отдельные кусочки (полубайты), составляющие слово.Но чтобы напечатать число, используя putchar или эквивалентный, вам нужно преобразовать эти полубайты в символы ASCII.Для этого вам не нужен «switch-case» (точнее, его эквивалент на ассемблере, «таблица переходов»).Вы можете использовать справочную таблицу, учитывая, что будет только 16 записей, или вы можете условно добавить к клеву, чтобы сформировать символ.

Цифры ASCII 0-9 имеют коды символов 48-57.Заглавные буквы имеют коды символов, начинающиеся с 65 для A (строчные буквы начинаются с 97), и, конечно, 0xA представляет десятичное значение 10. Таким образом, вы можете превратить полубайт в шестнадцатеричную строку, добавив к ней 55, если его значение равно 10 илибольше и 48 иначе.(Эквивалентно, добавьте 48 безоговорочно и добавьте еще 7 к нему, если полученное значение будет 58 или больше.)

Обратите внимание также, что сдвиг вправо, как вы предлагаете в своем ответе, будет извлекать цифры, начинающиеся с наименьшегозначительный клев, который не то, что вы хотите.

Следующее не проверено и записано на моей голове, так что никаких гарантий, но это может поставить вас на правильный путь:

    ; Assume number to be converted is in r4.  Note r4 is clobbered

    ; Initialise loop counter
    MOV   r5, #8
.loop
    ; Take most significant nibble from r4 into r0
    MOV   r0, r4, LSR #28

    ; Shift r4 for next time
    MOV   r4, r4, LSL #4

    ; For each nibble (now in r0) convert to ASCII and print
    ADD   r0, r0, #48
    CMP   r0, #58              ; did that exceed ASCII '9'?
    ADDHS r0, r0, #7           ; add 'A' - ('0'+10) if needed
    BL    putchar

    ; Decrement loop counter, loop if not zero
    SUBS  r5, r5, #1
    BNZ   .loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...