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 ;итог опять такой
Преобразование из 16-ричной в 10-ичную
читаю данные с памяти (к примеру 022х) хочу перевести в десятичные и никак. С разу скажу что как это на бумаге решается я знаю (2*16^0 + 2*16^1=34д). Код такой кстати написал, компьютер также и опять считает (2 + 2*10=22х).Хотел сам разобраться формулу найти чтоли да никак, знаю что какой-то способ есть. Кто непонял и хотел бы помочь напишите что нибудь подобное и просмотрите в отладчике.Знающих же я призываю подсказать, спасибо заранее.
Уточни пожалуйстя
db 0x32,0x32 (символы '22')
то сначала надо его перевести в двоичный код (где-то в выше упомянутой теме были функции для перевода строки в число) и тогда уже в любую другую систему исчисления.
нет ни какой необходимости переводить число в двоичный код, это просто глупо.
Цитата: 12345678
смотри тему FAQ, алгоритмы, макросы.... там были функции для перевода чисел в различные системы исчисления.
там всё есть
есть мнение, что нужно вывести на экран содержимое в десятичной СС. Впрочем можно конечно пойти и по пути преобразования числа в строку, но это как-то неправильно. Уверен, в вашем отладчике можно сменить режим отображения ;)
В ФАQ заглядывал, ничего не нашел.
Приведу еще раз пример...
Итак: В памяти находится число 085h (133d) это частота процессора которую я считываю и хочу вывести пользователю. На бумаге это легко , а вот на компьютере не так уж. Как он считает привожу пример.
асм :
Код:
отсюда вопрос , ведь должна быть какая-то формула которая переводит. Можно написать самому, я пробовал, но функция получается не универсальной, а потом если есть (а я знаю что точно есть ) формула зачем мучится...
P.S надесь вы поняли.
Код:
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
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
На уровне вычислений - все числа имеют шестнадцатеричное представление, просто выводятся они пользователю, как десятичные, сконвертированные в строку.
Цитата: hel
На уровне вычислений - все числа имеют шестнадцатеричное представление
Наверно, все же двоичное..
Цитата: hel
Вот именно.
На уровне вычислений - все числа имеют шестнадцатеричное представление, просто выводятся они пользователю, как десятичные, сконвертированные в строку.
На уровне вычислений - все числа имеют шестнадцатеричное представление, просто выводятся они пользователю, как десятичные, сконвертированные в строку.
а тебе что надо?
итак возмем к примеру например 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
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
Kama, 133(16) называется упакованным двоично-десятичным числом, 010303(16) - неупакованным двоично-десятичным числом. 313333(16) из последнего получается элементарно, да и сами преобразования из/в двоично-десятичный формат выполняются просто - у процессора для этого есть спец. инструкции.
ну да это понятно, да и BCD мне тоже знакомо но суть состояла та в другом (преобразование 85(16)=133(10) а как вывести это на экран? вот и функция которая превращает в 133(16) ну а там уже легко...)
Цитата: 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
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
рабочяя сто пудов сдал уже лабу в которой использовал данные функции