Это домашнее задание?
Биты - биты.Бит, Байт, слово, двойное слово, это аппаратные термины, на которые собирается ссылаться наборы команд / ассемблер.шестнадцатеричный, десятичный, восьмеричный, без знака, со знаком, строка, символ и т. д. являются проявлениями языков программирования.Точно так же .text, .bss, .data и т. Д. Также являются проявлениями программных инструментов: набор команд не заботится о том, чтобы один адрес был .data, а другой - .text, в любом случае это одна и та же инструкция.Существуют причины, по которым существуют все эти вещи на языке программирования, иногда это очень веские причины, но не пытайтесь запутаться, пытаясь решить эту проблему.
Чтобы преобразовать биты в читаемый человеком ascii, вам сначала нужно знать свой ascii.таблица, и побитовые операторы, и, или, логический сдвиг, арифметический сдвиг и т. д. Плюс загрузка и сохранение и другие вещи.
Математически подумайте, что нужно получить из некоторого числа в регистре / памяти в шестнадцатеричный ascii,Скажите 0x1234, который является 0b0001001000110100.Чтобы человек мог его прочитать, да, вам нужно поместить его в строку из-за отсутствия лучшего термина, но вам не обязательно хранить четыре символа плюс ноль в смежных областях памяти, чтобы что-то с ним сделать.Это зависит от вашей функции вывода.Обычно символьные выходные объекты сводятся к одному выходному параметру (), который вызывается много раз.
Вы можете конвертировать в строку, но это более трудоемко, поскольку для каждого вычисляемого вами символа ascii прямо сейчас вызывается какая-то односимвольная выходная функция.putchar () является примером функции вывода символьного байта.
Итак, для двоичного файла вы хотите исследовать один бит за раз и создать 0x30 или 0x31.Для восьмеричного, 3 бита за раз и создать от 0x30 до 0x37.Шестнадцатеричный код основан на 4 битах за раз.
Хекс имеет проблему в том, что 16 символов, которые мы хотим использовать, не найдены рядом друг с другом в таблице ascii.Таким образом, вы используете от 0x30 до 0x39 от 0 до 9, но от 0x41 до 0x46 или от 0x61 до 0x66 от A до F, в зависимости от ваших предпочтений или требований.Таким образом, для каждого nybble вы можете И с 0xF, сравнить с 9 и ADD 0x30 или 0x37 (10 + 0x37 = 0x41, 11 + 0x37 = 0x42 и т. Д.).
Преобразование из битов в регистре в представление asciiбинарный.Если бит в памяти был 1 показом, то 1 (0x31 ascii) бита был 0 показом 0 (0x30 в ascii).
void showbin ( unsigned char x )
{
unsigned char ra;
for(ra=0x80;ra;ra>>=1)
{
if(ra&x) output_char(0x31); else output_char(0x30);
}
}
Может показаться логичным использовать приведенный выше символ без знака, ноunsigned int, в зависимости от целевого процессора, может производить гораздо лучший (чище / быстрее) код.но это другая тема
Вышеприведенное может выглядеть примерно так в ассемблере (намеренно НЕ используя x86)
...
mov r4,r0
mov r5,#0x80
top:
tst r4,r5
moveq r0,#0x30
movne r0,#0x31
bl output_char
mov r5,r5, lsr #1
cmp r5,#0
bne top
...
Развернутый легче писать и будет немного быстрее,компромисс - больше используемой памяти
...
tst r4, #0x80
moveq r0, #0x30
movne r0, #0x31
bl output_char
tst r4, #0x40
moveq r0, #0x30
movne r0, #0x31
bl output_char
tst r4, #0x20
moveq r0, #0x30
movne r0, #0x31
bl output_char
...
Скажем, у вас есть 9-битные числа и вы хотите преобразовать их в восьмеричное.Возьмите три бита за раз (помните, что люди читают слева направо, поэтому начните с верхних битов) и добавьте 0x30, чтобы получить от 0x30 до 0x37.
...
mov r4,r0
mov r0,r4,lsr #6
and r0,r0,#0x7
add r0,r0,#0x30
bl output_char
mov r0,r4,lsr #3
and r0,r0,#0x7
add r0,r0,#0x30
bl output_char
and r0,r4,#0x7
add r0,r0,#0x30
bl output_char
...
Один (8 бит) байт в шестнадцатеричном виде может выглядеть следующим образом:
...
mov r4,r0
mov r0,r4,lsr #4
and r0,r0,#0xF
cmp r0,#9
addhi r0,r0,#0x37
addls r0,r0,#0x30
bl output_character
and r0,r4,#0xF
cmp r0,#9
addhi r0,r0,#0x37
addls r0,r0,#0x30
bl output_character
...
Создание цикла от 1 до N, сохранение этого значения в памяти и чтение его из памяти (.data), вывод в шестнадцатеричном виде:
...
mov r4,#1
str r4,my_variable
...
top:
ldr r4,my_variable
mov r0,r4,lsr #4
and r0,r0,#0xF
cmp r0,#9
addhi r0,r0,#0x37
addls r0,r0,#0x30
bl output_character
and r0,r4,#0xF
cmp r0,#9
addhi r0,r0,#0x37
addls r0,r0,#0x30
bl output_character
...
ldr r4,my_variable
add r4,r4,#1
str r4,my_variable
cmp r4,#7 ;say N is 7
bne top
...
my_variable .word 0
Сохранение в оперативную память являетсянемного траты, если у вас достаточно регистров.Хотя с x86 вы можете работать непосредственно с памятью, и вам не нужно проходить через регистры.
x86 - это не то же самое, что и вышеупомянутый (ARM) ассемблер, так что читателю оставлено в качестве упражнения для чтения подобного.Суть в том, что это смещение, добавление и добавление этого вещества разбивают его на элементарные шаги, и инструкции оттуда естественно выпадают.