преобразование HEX to DEC
преобразование HEX to DEC
Вот например, есть такая табличка, ASCII зовется. И у 16-ричных чисел есть десятичное значение. Типа 000h - 0d, а 0FFh - 255d. Мне нужно нужно как-то преобразовать байт в это значение, и получить его в виде 3 BCD-чисел. Че-то подзавис, и в книжках что-то не особо. Топорно Таблично это не тоже не получается. Есть какие способы преобразования?

Трудное детство, стальные игрушки.
- Реклама
Re: преобразование HEX to DEC
Самый простой способ вычитанием. Из, допустим, слова $XXXX вычитаете 10'000 и складываете в регистр десятков тысяч, когда остаток становится меньше вычитаете 1'000 и складываете в регистр тысяч и т.д. Например
Естественно есть великое множество вариантов таких преобразований.
Преобразование полученных чисел в ASCII просто добавить 0x30
Спойлер
Код: Выделить всё
.equ END_VIDEO_RAM=10
.def temp5=r21
/************************************************************/
RCALL BIN24BCD8
RJMP PC-1
bin24BCD8:
LDI XL,LOW(END_VIDEO_RAM-5)
LDI XH,HIGH(END_VIDEO_RAM-5)
bin24BCD8A:
SER TEMP5
bin24BCD8_1:
INC TEMP5
SUBI R16,BYTE1(10000000)
SBCI R17,BYTE2(10000000)
SBCI R18,BYTE3(10000000)
BRSH bin24BCD8_1
SUBI R16,BYTE1(-10000000)
SBCI R17,BYTE2(-10000000)
SBCI R18,BYTE3(-10000000)
ST X+,TEMP5
SER TEMP5
bin24BCD8_2:
INC TEMP5
SUBI R16,BYTE1(1000000)
SBCI R17,BYTE2(1000000)
SBCI R18,BYTE3(1000000)
BRSH bin24BCD8_2
SUBI R16,BYTE1(-1000000)
SBCI R17,BYTE2(-1000000)
SBCI R18,BYTE3(-1000000)
ST X+,TEMP5
SER TEMP5
bin24BCD8_3:
INC TEMP5
SUBI R16,BYTE1(100000)
SBCI R17,BYTE2(100000)
SBCI R18,BYTE3(100000)
BRSH bin24BCD8_3
SUBI R16,BYTE1(-100000)
SBCI R17,BYTE2(-100000)
SBCI R18,BYTE3(-100000)
ST X+,TEMP5
SER TEMP5
bin24BCD8_4:
INC TEMP5
SUBI R16,BYTE1(10000)
SBCI R17,BYTE2(10000)
SBCI R18,BYTE3(10000)
BRSH bin24BCD8_4
SUBI R16,BYTE1(-10000)
SBCI R17,BYTE2(-10000)
SBCI R18,BYTE3(-10000)
ST X+,TEMP5
SER TEMP5
bin24BCD8_5:
INC TEMP5
SUBI R16,BYTE1(1000)
SBCI R17,BYTE2(1000)
BRSH bin24BCD8_5
SUBI R16,BYTE1(-1000)
SBCI R17,BYTE2(-1000)
ST X+,TEMP5
SER TEMP5
bin24BCD8_6:
INC TEMP5
SUBI R16,BYTE1(100)
SBCI R17,BYTE2(100)
BRSH bin24BCD8_6
SUBI R16,BYTE1(-100)
SBCI R17,BYTE2(-100)
ST X+,TEMP5
SER TEMP5
bin24BCD8_7:
INC TEMP5
SUBI R16,10
BRSH bin24BCD8_7
SUBI R16,-10
ST X+,TEMP5
bin24BCD8_8:
ST X,R16
RET
.exit
Преобразование полученных чисел в ASCII просто добавить 0x30
Re: преобразование HEX to DEC
Код: Выделить всё
short int t; // Переменная которую нужно конвертировать
char out[4]; // Здесь будет результат
short int tmp;
tmp=t;
out[2]=tmp%10+48; tmp=tmp/10;
out[1]=tmp%10+48;
out[0]=tmp/10+48;
out[3]=0; // Символ конца строки
-
petrenko
- Друг Кота
- Сообщения: 5326
- Зарегистрирован: Вт фев 21, 2012 13:51:55
- Откуда: Начинающий
- Контактная информация:
преоборзование HEX -> BCD
TS -балуется- занимается наукой с очередным м.к ,но при этом лениво даж "пояндексить" ...
Ну от конкретного м.к. конечно зависит.
Вот пример : ( "заяндексился" за 1.5минуты )
Ну от конкретного м.к. конечно зависит.
Вот пример : ( "заяндексился" за 1.5минуты )
Код: Выделить всё
; -----------------------------------------------------
bin2bcd2:
; -----------------------------------------------------
; Преобразование однобайтного числа в упакованный BCD
; -----------------------------------------------------
; Вход : R24 - число от 0 до 255
; Выход: R17:16 - BCD представление
; Изменяет: R18, R24, SREG
; -----------------------------------------------------
ldi R16, 0 ; инициализация результата
ldi R17, 0 ;
ldi R18, 8 ; счетчик циклов
loop:
cpi R16, 0x05 ; сравнение разряда 0
brhs L1 ; если <= 4, продолжаем
subi R16, 256-3 ; иначе увеличиваем разряд 0 на 3
L1:
cpi R16, 0x50 ; сравнение разряда 1
brcs L2 ; если <= 4,
subi R16, 256-(3*16); иначе увеличиваем разряд 1 на 3
L2:
cpi R17, 0x05 ; сравнение разряда 2
brhs L3 ; если <= 4, продолжаем
subi R17, -3 ; иначе, увеличиваем разряд 2 на 3
L3:
lsl R24 ; сдвиг
rol R16
rol R17
dec R18 ; цикл
brne loop
ret< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18629
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: преобразование HEX to DEC
Если на Си, то itoa 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
Re: преобразование HEX to DEC
А это что получается, обычное преобразование в BCD? Ну то легко, 8051 делить умеет.
Чего-то мне показалось что тут как-то по другому надо. Извините, затупил.
Чего-то мне показалось что тут как-то по другому надо. Извините, затупил.
Трудное детство, стальные игрушки.
-
petrenko
- Друг Кота
- Сообщения: 5326
- Зарегистрирован: Вт фев 21, 2012 13:51:55
- Откуда: Начинающий
- Контактная информация:
Re: преобразование HEX to DEC
[uquote="Голимый",url="/forum/viewtopic.php?p=3246405#p3246405"].. обычное преобразование в BCD? Ну то легко, 8051 ..[/uquote]А что ж Вы сразу не сказали, что всё ещё с "*51"-ым балуетесь ?
У него ж есть DAA !
, но поелику DAA корректно работает только с аргументами менее 19910==C7h ,то сначала проверяете аргумент в Acc и если он >(19910==C7h) , то вычитаете из Acc константу (10010==64h) и инкрементируете B( там должен быть заранее 00h ) ,после чего делаете DAA ,потом XCH B ,потом ADDC 00h . В итоге у Вас в B две младшие BCD-цифры , а в Acc старшая( или 0 или 1 или 2 ) . Сравните по байтам кода и по тактам/циклам выполнения , что лучше для Вашего варианта изполнения "*51"-ого м.к. - так или с делениями.
У него ж есть DAA !
, но поелику DAA корректно работает только с аргументами менее 19910==C7h ,то сначала проверяете аргумент в Acc и если он >(19910==C7h) , то вычитаете из Acc константу (10010==64h) и инкрементируете B( там должен быть заранее 00h ) ,после чего делаете DAA ,потом XCH B ,потом ADDC 00h . В итоге у Вас в B две младшие BCD-цифры , а в Acc старшая( или 0 или 1 или 2 ) . Сравните по байтам кода и по тактам/циклам выполнения , что лучше для Вашего варианта изполнения "*51"-ого м.к. - так или с делениями.
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Re: преобразование HEX to DEC
Ну да, я собственно, только им и занимаюсь.
Если берусь за какие-то другие, то это обычно, ненадолго.
Ваш способ сегодня попробую.
А мне лично делением проще
типа:
mov A, #X ; X - наш байт.
mov B, #00Ah ; - основание 10-ной системы
div AB ;поделили, остаток деления в B - младший разряд десятичного.
mov куда_ни_будь, B
mov B, #00Ah ; - результат предыдущего деления опять делится на 10
div AB ; опять поделили. В B - средний разряд, в A старший.
Если берусь за какие-то другие, то это обычно, ненадолго.
Ваш способ сегодня попробую.
А мне лично делением проще
типа:
mov A, #X ; X - наш байт.
mov B, #00Ah ; - основание 10-ной системы
div AB ;поделили, остаток деления в B - младший разряд десятичного.
mov куда_ни_будь, B
mov B, #00Ah ; - результат предыдущего деления опять делится на 10
div AB ; опять поделили. В B - средний разряд, в A старший.
Трудное детство, стальные игрушки.


