Перевод в восьмеричную систему - Assembler

Узнай цену своей работы

Формулировка задачи:

Вводим в консоль двоичное число, на выходе нужно получить его в восьмеричном виде и вывести на консоль.
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
Как преобразовывать число из dl (?)
Апну, что-ли . Хотелось бы понять хоть в каком направлении двигаться

Решение задачи: «Перевод в восьмеричную систему»

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

Объяснение кода листинга программы

  1. Ввод данных:
    • Переменная BinBuf используется для хранения введенных пользователем данных.
    • Переменная Bin используется для хранения двоичного числа, которое нужно преобразовать.
  2. Преобразование двоичного числа в восьмеричное:
    • Цикл nextbin используется для чтения каждого бита введенного числа.
    • Переменная dx используется для хранения текущего числа, которое обрабатывается.
    • Переменная al используется для хранения текущего бита.
    • Переменная cf используется для проверки переноса бита.
    • Цикл nextoct используется для обработки каждой цифры числа.
    • Переменная cx используется для хранения количества цифр, которые нужно вывести.
    • Переменная dx используется для хранения цифр в обратном порядке.
  3. Вывод результатов:
    • Сообщение Oct = $ выводится при помощи функции int 21h.
    • Цикл output используется для вывода цифр на экран.
  4. Обработка ошибок:
    • Если введено некорректное число, выводится сообщение Введённое число не является двоичным!.
    • Переменная WrongMsg содержит текст сообщения об ошибке.
    • Переменная BinMsg содержит текст сообщения, информирующего о вводе двоичного числа.
    • Переменная CRLF содержит символ новой строки, который используется для перехода на новую строку.
    • Переменная OctMsg содержит текст сообщения, информирующего о вводе восьмеричного числа.

Оцени полезность:

8   голосов , оценка 4.5 из 5
Похожие ответы