Здравствуйте. Нужно перевести 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 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 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 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
Буду признателен за помощь.
Перевод чисел в системы счисления
Модератор: Andy
Я так понимаю не правильно работает stosb, но не могу понять как его вылечить
Результат выполнения:
16-я - 184В
8-я - 14113
2-я - 14111
16-я - 184В
8-я - 14113
2-я - 14111
да есть над чем подумать
что-то Я сомневаюсь в вашем авторстве.
что-то Я сомневаюсь в вашем авторстве.
Код: Выделить всё
.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 писал(а):Я так понимаю не правильно работает stosb, но не могу понять как его вылечить
если насчет двоичной, то основная ошибка здесь
Код: Выделить всё
sub cl,1 ; Уменьшаем CL на 1 для следующей цифры
inc ch
jnc zapis ; Если знаковый CL >= 0, то повторяем
; И записываем ее в строку
jmp zapis
Код: Выделить всё
String db 5 dup (?),'$' ; Резервируем 5 байт для строки
Pegasik писал(а):простите, не совсем понял ваш ответ. Насчёт авторства, читал кучу статей по переводу чисел, вот что понял то и написал.
Такое ощущение что из разных программ в одну все собрано и код логически трудно понять
А Вы не подскажете можно использовать в программе 2 раза stosb, я пробовал его вставить при переводе в двоичнуй, но выдаёт ошибку и пришлось прыгать по всей программе
Можно сколько угодно раз, только за регистрами используемыми следите, но для начала лучше процедурно оформить программу, структурировать или отдельно для двоичной напишите.
Спасибо за ответы, буду исправлять.
Если не трудно, скажите, лучше использовать stosb или организовать через стэки?
Если не трудно, скажите, лучше использовать stosb или организовать через стэки?