Другие языки программирования и технологии

Информатика, ассемблер, перевод двоичной в восьмую степень

В ассемблере написать программу которая из двоичной переводит в восьмую степень
"перевести" в восьмую степень это как? Покажи на примере
АЛ
Артем Лебедь
98 263
Лучший ответ
Сдвигами вправо.
Fuad Telmanov
Fuad Telmanov
84 547
; ввести двоичное число и преобразовать его в 8-ричное

.model tiny
.286
.code
org 100h

Start:

;-- ввод данных ------------------------
mov dx,offset BinMsg
mov ah,9
int 21h ; вывод приветствия

mov ah,0Ah
mov dx,offset BinBuf
int 21h ; ввод данных с клавиатуры

mov ah,9
mov dx,offset CRLF
int 21h ; переходим на новую строку

mov cl,[BinBuf+1]
xor ch,ch ; cx = длина строки
jcxz @@wrongnumber ; пустая строка
mov si,offset Bin
xor dx,dx ; получаемое число
cld ; прямой порядок чтения данных
; начинаем преобразование
@@nextbin:
lodsb
cmp al,'0'
jb @@wrongnumber ; введённый символ меньше '0'
cmp al,'1'
ja @@wrongnumber ; введённый символ больше '1'
add al,255-'0' ; если это символ '0', то al=255 и CF=0; если '1', то al=0 и CF=1 (произошёл перенос через границу байта)
rcl dx,1 ; сдвигаем dx на 1 бит влево, записывая в младший бит значение флага CF, т. е. фактически введённый бит (0 или 1)
loop @@nextbin
; теперь у нас в dx число, которое нужно преобразовать в 8-ричное
xor cx,cx ; счётчик символов
@@nextoct:
mov al,dl
and al,7 ; получаем 3 младших бита
add al,'0' ; преобразуем их в цифру '0'..'7'
push ax ; сохраняем в стеке
inc cx ; увеличиваем счётчик символов
shr dx,3 ; сдвигаем dx на 3 бит вправо
jnz @@nextoct ; повторяем, если есть ещё цифры
; теперь у нас в стеке cx символов (цифр), которые нужно вывести на экран
mov ah,9
mov dx,offset OctMsg
int 21h ; вывод сообщения
@@output:
pop dx ; читаем записанные в стек цифры в обратном порядке
mov ah,2
int 21h ; выводим цифру на экран
loop @@output

@@exit:
int 20h ; выход из программы

@@wrongnumber:
mov ah,9
mov dx,offset WrongMsg
int 21h ; сообщение об ошибке ввода
jmp @@exit

.data
BinMsg db 'Bin = $'
OctMsg db 'Oct = $'
CRLF db 13,10,'$'
WrongMsg db 'Введённое число не является двоичным! $'
BinBuf db 17,? ; буфер для ввода до 16 символов
Bin db 17 dup (?) ; наше число

end Start

Удачи!