Консультация № 158853
26.01.2009, 21:33
0.00 руб.
0 4 1
Помогите пожалуйста начинающему программисту
Вводиться два числа в двоичной системе исчесления.Найти их разницу и вывести результат на экран
у десятичной системе исчесления.

Обсуждение

давно
Старший Модератор
31795
6196
26.01.2009, 21:43
общий
Разрядность двоичного числа какая?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
26.01.2009, 21:54
общий
не сказано, наверно любая
Неизвестный
26.01.2009, 23:11
общий
помогите плиз
давно
Посетитель
7438
7205
27.01.2009, 00:30
общий
это ответ
Здравствуйте, Gadzilla!
В приложении программа, в которой вводятся два числа как последовательность 0 и 1
и выводится разность в виде десятичного числа
Разрядность чисел - 16 бит
Будут вопросы - милости просим в мини-форум

Приложение:
.model tiny
.data
sFirst db 'Enter first binary number: $'
sSecond db 0dh, 0ah, 'Enter second binary number: $'
sSub db 0dh, 0ah, 'First - second = $'

.code
.startup
lea dx, sFirst
mov ah, 9
int 21h
call GetBinNumber ;вводим первое число - последовательность 0 и 1
mov di, ax ;сохраним

lea dx, sSecond
mov ah, 9
int 21h
call GetBinNumber ;вводим второе число - последовательность 0 и 1
mov si, ax ;сохраним

lea dx, sSub
mov ah, 9
int 21h
mov ax, di
sub ax, si ;ax = di - si

call PrintNumber ;выведем десятичное число

mov ah, 0
int 16h ;ждем любую клавишу, чтобы не ушло с экрана

mov ax, 4c00h
int 21h

GetBinNumber proc ;вводим последовательность 0 и 1
mov cx, 16 ;максимум 16 бит - слово
xor dx, dx ;результат
GLoop:
mov ah, 0
int 16h ;ждем символ
cmp al, 0dh
je GRet ;по Enter-у заканчиваем
cmp al, '0'
je binDigit
cmp al, '1'
jne GLoop ;ждем только 0 или 1
binDigit:
int 29h ;выведем а экран
shr al, 1 ;0 или 1 выдвинем в С
rcl dx, 1 ;сдвинем на 1 бит влево, С в младший бит
loop GLoop ;максимум 16 бит
GRet:
mov ax, dx ;результат
ret
GetBinNumber endp

PrintNumber proc ;вывод десятичного числа
test ax, ax ;проверим на знак
jns PrintNum ;положительное число просто выводим
neg ax ;для отрицательного поменяем знак на +
push ax ;сохраним
mov al, '-' ;выведем -
int 29h
pop ax
PrintNum:
mov bx, 10 ;будем делить на 10
xor cx, cx ;счетчик цифр
DLoop: ;цикл формирования цифр в обратном порядке
xor dx, dx ;будем делить dx:ax
div bx ;на 10
push dx ;сохраним остаток - очередную цифру в стеке
inc cx ;считаем цифры
test ax, ax ;если есть еще цифры
jnz DLoop ;то повторяем
PLoop: ;цикл вывода цифр на экран
pop ax ;восстановим из стека очередную цифру
add al, '0' ;0-9 -> '0'-'9'
int 29h ;выведем
loop PLoop ;по всем цифрам
ret
PrintNumber endp

end
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа