Маскировка и смещение, как предлагается в комментариях и в вашем ответе , даст вам отдельные кусочки (полубайты), составляющие слово.Но чтобы напечатать число, используя 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