Перевод чисел в системы счисления

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Pegasik
Сообщения: 11
Зарегистрирован: 08 апр 2008, 09:52

08 апр 2008, 10:00

Здравствуйте. Нужно перевести 3 числа в 8-ю, 2-ю, 16-ю с.с.
Числа: 6219, 0.479, 986,207 (десятичные)
Сейчас работаю над числом 6219 (до дробных пока не добрался), перевёл его в 8-ю и 16-ю, а вот с 2-й возникла проблема, не правильно записывается в массив.
Исходник:
.MODEL tiny
.STACK 100h
.DATA
String db 5 dup (?),'$' ; Резервируем 5 байт для строки
StringEnd = $-1 ; Указывает на символ '$'
Number = 6219
Mes_1 db 0dh, 0ah, "Chislo 6219 v 16-y sisiteme schisleniya - ", "$"
Mes_2 db 0dh, 0ah, "Chislo 6219 v 8-y sisiteme schisleniya - ", "$"
Mes_3 db 0dh, 0ah, "Chislo 6219 v 2-y sisiteme schisleniya - ", "$"

Flag db 01h
.CODE
ORG 100h


Start:
push ax
push bx
push cx
push dx

mov ax,@data
mov ds,ax
mov es,ax

lea dx,Mes_1
mov ah,09h
int 21h

mov bl,Flag

;------------------Перевод числа в 16-ю с.с.-----------------------------

std ; Устанавливаем ОБРАТНЫЙ порядок записи
lea di,StringEnd-1 ; ES :D I = последний символ строки String
mov ax,Number ; Заносим в AX число для перевода
mov cx,16 ; Задаемся делителем CX = 16
_16_System:
xor dx,dx ; Обнуляем DX (для деления)
div cx ; Делим DX:AX на CX (16),
; Получаем в AX частное, в DX остаток
xchg ax,dx ; Меняем их местами (нас интересует остаток)
add al,'0' ; Получаем в AL символ цифры
cmp al,'9' ; Проверяем если цифра
jbe zapis ; Переходим на запись

add al,'A'-('9'+1) ; Если символ, корректируем
jmp zapis

zapis:
stosb ; И записываем ее в строку

cmp bl,04h
jge zap_2
jmp zap_16_8
zap_2:
inc di
; dec ch
cmp ch,0Fh
jne Met
jmp vivod

zap_16_8: xchg ax,dx ; Восстанавливаем AX (частное)
or ax,ax ; Сравниваем AX с 0
jne _16_System ; Если не ноль, то повторяем
jmp vivod

;------------------Перевод числа в 8-ю с.с.-----------------------------

_8_System:
lea dx,Mes_2
mov ah,09h
int 21h

std ; Устанавливаем ОБРАТНЫЙ порядок записи
lea di,StringEnd-1 ; ES :D I = последний символ строки String
mov ax,Number ; Заносим в AX число для перевода
mov cx,8 ; Задаемся делителем CX = 8
jmp _16_System

;-----------------Перевод числа в 2-ю с.с.-------------------------------

_2_System:
lea dx,Mes_3
mov ah,09h
int 21h
std ; Устанавливаем ОБРАТНЫЙ порядок записи
lea di,StringEnd-1 ; ES :D I = последний символ строки String
mov ax,Number ; Заносим в AX число для перевода
mov cl,16-1 ; 16-битный регистр, будем выводить по 4 бита (0..F)
xchg dx,ax ; Сохраняем число в DX

mov ch,0


Met:
mov ax,dx ; Восстанавливаем число в AX
shr ax,cl ; Сдвигаем на CL бит вправо
and al,1 ; Получаем в AL цифру 0..15
add al,'0' ; Получаем в AL символ цифры
sub cl,1 ; Уменьшаем CL на 1 для следующей цифры
inc ch
jnc zapis ; Если знаковый CL >= 0, то повторяем
; И записываем ее в строку
jmp zapis

;z1:
; inc di
; dec ch
; cmp ch,0
; jne z1
; jmp vivod

;-----------------Вывод строки на экран----------------------------------
vivod:
mov ah,09h
; lea dx,[di+1] ; Заносим в DX адрес начала строки
lea dx,String ; Заносим в DX адрес начала строки
int 21h ; Выводим ее на экран
add bl,01h
cmp bl,02h
je _8_System

add bl,01h
cmp bl,04h
je _2_System

mov ax,4c00h
int 21h ; Выходим из программы

push ax
push bx
push cx
push dx

END Start

Буду признателен за помощь.
Pegasik
Сообщения: 11
Зарегистрирован: 08 апр 2008, 09:52

08 апр 2008, 10:02

Я так понимаю не правильно работает stosb, но не могу понять как его вылечить
Pegasik
Сообщения: 11
Зарегистрирован: 08 апр 2008, 09:52

08 апр 2008, 10:03

Результат выполнения:
16-я - 184В
8-я - 14113
2-я - 14111
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

08 апр 2008, 10:46

да есть над чем подумать :)
что-то Я сомневаюсь в вашем авторстве.

Код: Выделить всё

.MODEL tiny !!!
.STACK 100h ???
.DATA ???
...
.CODE
ORG 100h


Start:
push ax ?
push bx ?
push cx ?
push dx ?

mov ax,@data ?
mov ds,ax ?
mov es,ax ?

...

lea di,StringEnd-1 ; ESI = последний символ строки String ???

...
sub cl,1 ; Уменьшаем CL на 1 для следующей цифры
inc ch
jnc zapis ; Если знаковый CL >= 0, то повторяем ???
; И записываем ее в строку 
jmp zapis
...

mov ax,4c00h
int 21h ; Выходим из программы

push ax ?
push bx ?
push cx ?
push dx ?

END Start
Pegasik
Сообщения: 11
Зарегистрирован: 08 апр 2008, 09:52

08 апр 2008, 10:55

простите, не совсем понял ваш ответ. Насчёт авторства, читал кучу статей по переводу чисел, вот что понял то и написал.
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

08 апр 2008, 11:04

Pegasik писал(а):Я так понимаю не правильно работает stosb, но не могу понять как его вылечить


если насчет двоичной, то основная ошибка здесь

Код: Выделить всё

sub cl,1 ; Уменьшаем CL на 1 для следующей цифры
inc ch
jnc zapis ; Если знаковый CL >= 0, то повторяем
; И записываем ее в строку
jmp zapis
и и 5 байт для двоичного представления не хватит

Код: Выделить всё

String db 5 dup (?),'$' ; Резервируем 5 байт для строки
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

08 апр 2008, 11:06

Pegasik писал(а):простите, не совсем понял ваш ответ. Насчёт авторства, читал кучу статей по переводу чисел, вот что понял то и написал.

Такое ощущение что из разных программ в одну все собрано и код логически трудно понять
Pegasik
Сообщения: 11
Зарегистрирован: 08 апр 2008, 09:52

08 апр 2008, 11:17

А Вы не подскажете можно использовать в программе 2 раза stosb, я пробовал его вставить при переводе в двоичнуй, но выдаёт ошибку и пришлось прыгать по всей программе
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

08 апр 2008, 11:28

Можно сколько угодно раз, только за регистрами используемыми следите, но для начала лучше процедурно оформить программу, структурировать или отдельно для двоичной напишите.
Pegasik
Сообщения: 11
Зарегистрирован: 08 апр 2008, 09:52

08 апр 2008, 11:38

Спасибо за ответы, буду исправлять.
Если не трудно, скажите, лучше использовать stosb или организовать через стэки?
Ответить