Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Преобразование из 16-ричной в 10-ичную

1.8K
27 марта 2008 года
Kama
153 / / 04.05.2006
столкнулся с такой проблеммой:
читаю данные с памяти (к примеру 022х) хочу перевести в десятичные и никак. С разу скажу что как это на бумаге решается я знаю (2*16^0 + 2*16^1=34д). Код такой кстати написал, компьютер также и опять считает (2 + 2*10=22х).Хотел сам разобраться формулу найти чтоли да никак, знаю что какой-то способ есть. Кто непонял и хотел бы помочь напишите что нибудь подобное и просмотрите в отладчике.Знающих же я призываю подсказать, спасибо заранее.
1.8K
27 марта 2008 года
Evgeni
188 / / 14.06.2006
Непонятно что ты хочешь сделать, то ли перевести 22h в десятичную системы исчесления и вывести на экран, то ли ввести с клавиатуры 33 и перевести в число.
Уточни пожалуйстя
5.1K
27 марта 2008 года
12345678
93 / / 16.12.2006
смотри тему FAQ, алгоритмы, макросы.... там были функции для перевода чисел в различные системы исчисления. Если тебе надо перевести число которое записано в виде ASCII строки типа

db 0x32,0x32 (символы '22')

то сначала надо его перевести в двоичный код (где-то в выше упомянутой теме были функции для перевода строки в число) и тогда уже в любую другую систему исчисления.
1.8K
27 марта 2008 года
Evgeni
188 / / 14.06.2006
нет ни какой необходимости переводить число в двоичный код, это просто глупо.
261
27 марта 2008 года
ahilles
1.5K / / 03.11.2005
Цитата: 12345678
смотри тему FAQ, алгоритмы, макросы.... там были функции для перевода чисел в различные системы исчисления.


там всё есть

285
27 марта 2008 года
Romik
479 / / 24.11.2002
есть мнение, что нужно вывести на экран содержимое в десятичной СС. Впрочем можно конечно пойти и по пути преобразования числа в строку, но это как-то неправильно. Уверен, в вашем отладчике можно сменить режим отображения ;)
1.8K
14 апреля 2008 года
Kama
153 / / 04.05.2006
помоему мы не допонимаем друг друга...
В ФАQ заглядывал, ничего не нашел.
Приведу еще раз пример...
Итак: В памяти находится число 085h (133d) это частота процессора которую я считываю и хочу вывести пользователю. На бумаге это легко , а вот на компьютере не так уж. Как он считает привожу пример.

асм :
 
Код:
lodsb                      ;al=85
    mov [es:temp],al
    and al,00Fh                    ;al=5
    mov [es:hex_buffer],al
   
    mov al,[es:temp]                 ;al=85
    and al,0F0h                   ;al=80
    shr al,4                               ;al=8   
    mul al,16                              ;al=8*010h=80 (самое главное, заметьте)
    add [es:hex_buffer],al          ;al=85 ;итог опять такой

отсюда вопрос , ведь должна быть какая-то формула которая переводит. Можно написать самому, я пробовал, но функция получается не универсальной, а потом если есть (а я знаю что точно есть ) формула зачем мучится...
P.S надесь вы поняли.
349
14 апреля 2008 года
Phantom-84
656 / / 27.10.2005
Kama, там есть функция dword_to_STR. Она более чем универсальна. Заносишь в ebx основание системы счисления, т.е. 10, в esi адрес буфера, где будет сохранена строка, а в eax само число. Общий алгоритм этой процедуры очень прост. С помощью последовательного деления в цикле на основание системы счисления ты выделяешь отдельные цифры числа. Могу набросать тебе примерный код именно для десятичной системы счисления.
Код:
str:
mov ebx,10
xor ecx,ecx
@@:
xor edx,edx
div ebx
inc ecx
push edx
and eax,eax
jnz @b
@@:
pop eax
add al,"0"
mov [esi],al
inc esi
loop @b
mov [esi],ah ; терминатор строки
ret
15K
14 апреля 2008 года
hel
78 / / 10.11.2007
Вот именно.
На уровне вычислений - все числа имеют шестнадцатеричное представление, просто выводятся они пользователю, как десятичные, сконвертированные в строку.
4.3K
15 апреля 2008 года
flat
142 / / 27.12.2005
Цитата: hel
На уровне вычислений - все числа имеют шестнадцатеричное представление


Наверно, все же двоичное..

261
15 апреля 2008 года
ahilles
1.5K / / 03.11.2005
Цитата: hel
Вот именно.
На уровне вычислений - все числа имеют шестнадцатеричное представление, просто выводятся они пользователю, как десятичные, сконвертированные в строку.


а тебе что надо?

1.8K
18 апреля 2008 года
Kama
153 / / 04.05.2006
нет, код который написал Phantom84 я знаю (пробижался глазами по ниму), также он деыствительно оригинальный (я про команду див), но у меня вообще другой вопрос который как я думаю вы не поняли ... который я нашел и хочу поделится на будуещее, а вдруг кому-то понадобится.
итак возмем к примеру например 85(16)=133(10), нам надо чтоб получилось 133(16) ,затем 31 33 33 что и будет выведено на экран (133).
надо число уменьшить на 100(10)=64(16) и уменьшать до тех пор пока число не будет мен;ше уменьшаемого,
85(16)-64(16)=21(16), операция произвелась 1 раз
дальше, так как 21(16) меньше 64(16) отнимаем 10(10) то есть 0Аh(16), тоже до тех пор пока резултать будет меньше 10(10) и так далее,
операция произойдет 3 раза, остаток 3.
Код функции приведен ниже:
Код:
hex_to_hex proc
    push bx
    push bp
    xor bx,bx
    xor bp,bp
lod_w: 
    cmp [es:hex_def],00h
    je lod_b
    lodsw
    cmp ax,00h
    je hex_0
    cmp ah,00h
    je hex_100
hex_1000:
    cmp ax,03E8h
    jb hex_100_b
    sub ax,03E8h
    inc bl
    jmp hex_1000
hex_100_b:
    or bl,030h
    mov [es:hex_buffer+bp],bl
lod_b:
    lodsb
    cmp al,00h
    je hex_0
    inc bp
hex_100:
    cmp al,064h
    jb hex_10_b
    sub al,064h
    inc bl
    jmp hex_100
hex_10_b:
    or bl,030h
    mov [es:hex_buffer+bp],bl
    xor bx,bx
    inc bp
hex_10:
    cmp al,00Ah
    jb hex_remainder_b
    sub al,00Ah
    inc bl
    jmp hex_10
    inc bp
hex_remainder_b:
    or bl,030h
    mov [es:hex_buffer+bp],bl
    or al,030h
    inc bp
    mov [es:hex_buffer+bp],al
    jmp hex_exit
hex_0:
    mov [es:hex_buffer],0  
hex_exit:
    pop bx
    pop bp
    ret
hex_to_hex endp
349
18 апреля 2008 года
Phantom-84
656 / / 27.10.2005
Kama, 133(16) называется упакованным двоично-десятичным числом, 010303(16) - неупакованным двоично-десятичным числом. 313333(16) из последнего получается элементарно, да и сами преобразования из/в двоично-десятичный формат выполняются просто - у процессора для этого есть спец. инструкции.
1.8K
19 апреля 2008 года
Kama
153 / / 04.05.2006
ну да это понятно, да и BCD мне тоже знакомо но суть состояла та в другом (преобразование 85(16)=133(10) а как вывести это на экран? вот и функция которая превращает в 133(16) ну а там уже легко...)
26K
28 апреля 2008 года
metal_anton
27 / / 20.04.2008
Цитата: Kama
ну да это понятно, да и BCD мне тоже знакомо но суть состояла та в другом (преобразование 85(16)=133(10) а как вывести это на экран? вот и функция которая превращает в 133(16) ну а там уже легко...)


могу предложить вот такой вариант перевода числа и вывода на экран в формате байта и слова

Код:
; ввод числа с клавы
ReadINT proc Near;
push ds si bx cx dx cs
pop ds
mov dx,offset max
mov ah,0Ah
int 21h
mov cl,byte ptr cs:len
mov ch,0
mov bh,ch
xor si,si
mov ax,si
@m_: mov bl,byte ptr cs:st_[si]
sub bl,'0'
mov dx,10
mul dx
add ax,bx
inc si
loop @m_
push ax
mov ah,2
mov dl,10
int 21h
pop ax
pop dx cx bx si ds
ret
max db 6
len db ?
St_ db 6 dup(?)
ReadINT EndP
;процедура вывода числа на экран
WriteInt Proc Near ;AX выходное число
push dx cx bx
xor cx,cx
mov bx,10
@x_:
xor dx,dx
div bx
add dl,'0'
push dx
inc cx
cmp ax,0
jne @x_
@x_2:
pop dx
mov ah,2
int 21h
loop @x_2
pop bx cx dx
ret
WriteInt EndP

рабочяя сто пудов сдал уже лабу в которой использовал данные функции
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог