Перевод в восьмеричную систему - Assembler
Формулировка задачи:
Вводим в консоль двоичное число, на выходе нужно получить его в восьмеричном виде и вывести на консоль.
Как преобразовывать число из dl (?)
TITLE HOPHEY3 STACKSG SEGMENT PARA STACK 'STACK' DB 64 DUP(?) STACKSG ENDS DATASG SEGMENT PARA 'DATA' STR4 DB 'Введите данные', '$' STR1 DB 15 DUP(' ') STR2 DB 4 DUP(' ') DATASG ENDS CODESG SEGMENT PARA 'CODE' ASSUME CS:CODESG, DS:DATASG, SS:STACKSG ENTRY PROC FAR PUSH DS SUB AX,AX PUSH AX MOV AX,DATASG MOV DS,AX ;'Введите данные' MOV AH,09h LEA DX,STR4 INT 21H ;'Ввод числа' MOV AH,10 LEA DX,STR1 INT 21H ; ; ; ; ret ENTRY ENDP CODESG ENDS END ENTRY
Я так понимаю предварительно нужно представить вводимое число в дв.вид
mov ax,STR1 mov bx,ax mov cx,16 ob1: shl bx,1 jc ob2 mov dl,'0' jmp ob3 ob2: mov dl,'1' ob3: mov ah,2 int 21h loop ob1
Апну, что-ли . Хотелось бы понять хоть в каком направлении двигаться
Решение задачи: «Перевод в восьмеричную систему»
textual
Листинг программы
; ввести двоичное число и преобразовать его в 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
Объяснение кода листинга программы
- Ввод данных:
- Переменная
BinBuf
используется для хранения введенных пользователем данных. - Переменная
Bin
используется для хранения двоичного числа, которое нужно преобразовать.
- Переменная
- Преобразование двоичного числа в восьмеричное:
- Цикл
nextbin
используется для чтения каждого бита введенного числа. - Переменная
dx
используется для хранения текущего числа, которое обрабатывается. - Переменная
al
используется для хранения текущего бита. - Переменная
cf
используется для проверки переноса бита. - Цикл
nextoct
используется для обработки каждой цифры числа. - Переменная
cx
используется для хранения количества цифр, которые нужно вывести. - Переменная
dx
используется для хранения цифр в обратном порядке.
- Цикл
- Вывод результатов:
- Сообщение
Oct = $
выводится при помощи функцииint 21h
. - Цикл
output
используется для вывода цифр на экран.
- Сообщение
- Обработка ошибок:
- Если введено некорректное число, выводится сообщение
Введённое число не является двоичным!
. - Переменная
WrongMsg
содержит текст сообщения об ошибке. - Переменная
BinMsg
содержит текст сообщения, информирующего о вводе двоичного числа. - Переменная
CRLF
содержит символ новой строки, который используется для перехода на новую строку. - Переменная
OctMsg
содержит текст сообщения, информирующего о вводе восьмеричного числа.
- Если введено некорректное число, выводится сообщение