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
вот написала эту программу, но преподаватель говорит, что она слишком большая, да и алгоритм не идеален. в общем сказал переделать... что посоветуете: может что то можно убрать, переработать (подскажите как!) или может у кого-нибудь есть готовая программа по переводу, которая более проста и меньше в объёме? может кто даст ссылку на готовую программу или материал по этой теме?!
|