Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перевод из 10-ой в двоичную систему счисления. Как сделать лучше??  (Прочитано 18977 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ff
Гость
« : 21-01-2005 09:19 » 

Написать программу для перевода числа из 10й системы счисления в двоичную. Результат вывести на экран

.model tiny
.code
org 100h
start:
;-------------Очистка экpана----------
mov ax,0600h
mov bx,0700h
mov cx,0000h
mov dx,184fh
int 10h
;-------------Устанавка куpсоpа-------
mov ah,02h
mov bh,00h
mov dx,0000h
int 10h
;------------вывод сообщения----------
lea dx,t1
mov ah,09h
int 21h
call input
call output
ex:ret

;------------П/П вывода числа----------
output proc
   lea dx,buf
   inc dx
   inc dx
        call bin2str
   mov ah,09h
   int 21h

ret                ;возвpат из П/П
output endp

; процедура преобразования двоичного числа в строку символов
; вход - ax - число;
; выход - строка по адресу ds:bx
bin2str proc
        push dx
   push cx
   push bx
   push si
   push ax
   mov cx,10 ;макс. кол-во символов в двоичном виде.
fill_buff:
        mov byte ptr [bx+1],' '    ; заполнить строку пробелами
   inc bx
   loop fill_buff
   mov  si,2                 ; подготовиться к делению на 2
        or  ax,ax                  ; если в (ax) отрицательное число
        jns clr_div
        neg ax                     ; то изменить его знак
clr_div:
        sub dx,dx                  ; очистить старшую половину делимого
        div si                     ;(dx;ax)/2 -> (рез -> ax, ост->dx)
        add dx,'0'                 ; преобразовать остаток в симв. вид
        dec bx
        mov [bx+1],dl              ; запомнить очередн. цифру в строке
        or  ax,ax                  ; в регистре ax - 0?
        jnz clr_div                ; нет, повторить процедуру
        pop ax
   or ax,ax                   ; исх.число отрицательно ?
        jns no_more                ; нет, тогда все
        dec bx
        mov byte ptr [bx+1],'-'    ; поместить в строку знак '-'
no_more:   
        pop si
        pop bx
        mov byte ptr [bx],6                  ; поместить счетчик символов
        pop cx
        pop dx
        ret
bin2str endp

;------------П/П ввода числа----------
input proc
;------------ввод числа---------------
lea dx,buf
mov ah,0ah
int 21h
;------------пеpевод стpоки-----------
mov bx,dx
mov ah,02h
mov dl,0ah
int 21h
;-----------пpеобpазование числа------
inc bx
call str2bin

ret                ;возвpат из П/П
input endp
;-------------------------------------

; процедура преобразования строки символов в двоичное число.
; вход - ds:bx   - адрес строки
; выход - ax - число со знаком
;
str2bin  proc
   push bx
   push cx
   sub ax,ax        ; обнулить ax
   sub ch,ch        ; очистить ch
        mov cl,byte ptr [bx]  ; счетчик символов - в CX
blanks: cmp byte ptr[bx+1],' '   ;цикл пропуска пробелов
        jne chk_neg       ;если символ не пробел
   inc bx
        loop blanks
        jmp  good        ; не обнаружено чисел. результат - 0
;
; Следующие команды выполняются в случае знака  "-"
;
chk_neg: cmp byte ptr [bx+1],'-'
   jne chk_pos
   inc bx               ; продвинуть указатель
   dec cx               ; уменьшить счетчик
   call conv_ab         ; вызвать программу преобразования
        jc thru              ;
   cmp ax,32768         ; число < -32768
   ja  no_good          ; да, ошибка
        neg ax               ; изменить знак числа
        js  good             ; o'key , выходим
;
; Следующие команды выполняются в случае, если знак не минус
;
chk_pos: cmp byte ptr [bx+1],'+'   ; sign '+' ?
        jne go_conv           ; нет , идти на преобразование
        inc bx                ; сместить указатель в строке
        dec cx                ; уменьшить счетчик символов
go_conv: call conv_ab         ; преобразовать строку в число
        jc thru               ; в случае ошибки - на выход
        cmp ax,32767          ; число не слишком велико ?
        ja no_good            ; слишком велико, ошибка
good:   clc                   ; очистить флаг CY
        jnc thru             
no_good: stc                  ; set carry flag
thru:   pop cx                ; восстановить значения регистров
   pop bx
   jmp skipit
;
; Процедура собственно преобразования числа
;
conv_ab proc
   push bp
   push bx
   push si
   mov  bp,bx      ; поместить указатель на строку в bp
        sub  bx,bx      ; очистить bx
range:  cmp byte ptr ds:[bp+1],'0'  ; символ - цифра ?
        jb  non_dig                 ; нет не цифра
        cmp byte ptr ds:[bp+1],'9'  ; символ > '9'
        jbe digit                   ; символ - цифра
non_dig: stc                        ; установить флаг ошибки
        jc end_conv                 ; и выйти из процедуры
digit:  mov si,10
   push dx                     ; сохранить dx
        mul si                      ; (ax)*(si)->(dx;ax)
        pop dx                      ; восстановить dx
        mov bl,ds:[bp+1]            ; взять очередной символ из строки
        and bx,0fh                  ; преобразовать символ в двоичное
        add ax,bx                   ; добавить цифруу к старому результату
        jc  end_conv                ; если результат слишком велик,то выйти
        inc bp                      ; адрес след цифры в строке
        loop range                  ; замкнуть цикл по количеству символов
        clc                         ; сбросить флаг переноса(нет ошибки)
end_conv:pop si                    ; восстановить регистры и выйти
         pop bx
         pop bp
         ret
conv_ab  endp
skipit:  ret
str2bin  endp

;-------------------------------------
buf db 10,'            $'
t1  db ' Введите число : ','$'
t2  db ' Полученное двоичное число: '

end start

вот написала эту программу, но преподаватель говорит, что она слишком большая, да и алгоритм не идеален. в общем сказал переделать...
что посоветуете: может что то можно убрать, переработать (подскажите как!) или может у кого-нибудь есть готовая программа по переводу, которая более проста и меньше в объёме?
может кто даст ссылку на готовую программу или материал по этой теме?!
« Последнее редактирование: 15-12-2007 18:02 от Алексей1153++ » Записан
p0et
Гость
« Ответ #1 : 05-04-2005 19:37 » new

до какой длины десятичные числа ты хочешь переводить?
если тебя устроит длина до 9 цифр, то проще всего переводить сопроцессором, так как он сам умеет ето делать
если длина числа больше 9 цифр, тогда сложнее и программа получится большая.
давай рассмотрим первый  первый вариант
у тебя впринципе все нормально, но много написано. функция перевода bin_to_dec тебе не нужна(етого в задании нет) Улыбаюсь функция перевода из str^dec_to_bin [ загружаешь в рег. сопроцессора буфер со строкой, как десятичное число, а считываешь из рег. сопроцессора как целое число] ето 4 команды - и у тебя программа станет наамного меньше Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines