Перевод из двоичной системы в десятичную - Assembler

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

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

Добрый день. Нужно ввести с клавиатуры 2 двоичных 8-розрядных числа (допустим x и y). И вывести на экран десятичные значения данных чисел, а также их сумму и разность(в десятичной). С ассемблером знакома плохо, попыталась написать, выдаёт divide overflow:
data segment 
 x db 8 dup(?)         ;первое двоичное
 y db 8 dup(?)         ;второе двоичное
 z db 3 dup(?)         ;результат для сумы  в десятичной
 nx db 3 dup(?)        ;первое в десятичной
 ny db 3 dup(?)        ;второе в десятичной
 
 z1 db 3 dup(?)      ;результат для разности  в десятичной
 mn db 2
 text db 'Vvedit 1 4islo:'
 txt db 'Vvedit 2 4islo:'
 sum db 'Suma:'
 raz db 'raznica:'
 d1 db 'Desyatіchn 1:'
 d2 db 'Desyatichn 2:'
data ends
 
stk segment stack
 db 128 dup(?)
stk ends
 
code segment 
 assume DS:data,SS:stk,cs:code
 output proc         ;процедура вывода на экран
  mov ah,40h
  mov bx,01
  int 21h
  ret 
 output endp
 input proc          ;процедура чтения с экрана
  mov ah,3fh
  mov bx,0
  mov cx,8
  int 21h
  ret
 input endp
 next proc           ; процедура перехноса на следующую строку
  mov ah,6h
  mov dx,0ah
  int 21h
  ret
 next endp
main: mov ax,data
 mov ds,ax 
 mov cx,15          
 lea dx,text
 call output   ;вывод первого сообщения
 lea dx,x
 call input     ;чтение первого двоичного числа
 call next      
 mov cx,15
 lea dx,txt
 call output  ;вывод второго сообщения
 lea dx,y
 call input    ;чтение второго двоичного числа
 call next
 mov cx,13
 lea dx,d1
 call output   ;вывод сообщения "десятичное 1:"
 mov al,x      ;начало перевода х
 mul mn
 add al,x+1
 mul mn
 add al,x+2
 mul mn
 add al,x+3
 mul mn
 add al,x+4
 mul mn
 add al,x+5
 mul mn
 add al,x+6
 mul mn
 add al,x+7
 mov nx,al 
 mov al,y  ;начало перевода у
 mul mn
 add al,y+1
 mul mn
 add al,y+2
 mul mn
 add al,y+3
 mul mn
 add al,y+4
 mul mn
 add al,y+5
 mul mn
 add al,y+6
 mul mn
 add al,y+7
 mov ny,al   
 add al,nx  ;сложение
 mov z,al
 mov cl,x
 mov al,y
 sub cl,al ;вычитание
 mov z1,al
 mov al,nx
 mov ah,100
 div ax
 add al,48 ;перевод из числа в код ASCII
 mov nx,al
 mov al,ah
 mov ah,10
 div ax
 add al,48
 add ah,48
 mov nx+1,al
 mov nx+2,ah
 mov al,ny
 mov ah,100
 div ax
 add al,48
 mov ny,al
 mov al,ah
 mov ah,10
 div ax
 add al,48
 add ah,48
 mov ny+1,al   ;запись трёхразрядного десятичного
 mov ny+2,ah
 mov al,z
 mov ah,100
 div ax
 add al,48
 mov z,al
 mov al,ah
 mov ah,10
 div ax
 add al,48
 add ah,48
 mov z+1,al
 mov z+2,ah
 mov al,z1
 mov ah,100
 div ax
 add al,48
 mov z1,al
 mov al,ah
 mov ah,10
 div ax
 add al,48
 add ah,48
 mov z1+1,al
 mov z1+2,ah 
 mov cx,3
 lea dx,nx       
 call output         ;вывод результатов на экран
 call next
 mov cx,13
 lea dx,d2
 call output
 mov cx,3
 lea dx,ny
 call output
 call next
 mov cx,5
 lea dx,sum
 call output
 mov cx,3
 lea dx,z
 call output
 call next
 mov cx,8
 lea dx,raz
 call output
 mov cx,3
 lea dx,z1
 call output
 mov ax,4c00h
 int 21h
 code ends
end main
Есть большие подозрения что неправильно выделила память под числа. Да и вообще дико запуталась пока писала. Поиском не нашла подобного Перевод делала по алгоритму: 10101011= ((((((1*2+0)*2+1)*2+0)*2+1)*2+0)*2+1)*2+1=171 Помогите пожалуйста разобраться.

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

textual
Листинг программы
add al,'0'; превращаем в символ
    stosb
    pop ax
    test ax,ax; деление закончено?
    jnz a1
exit:   mov ah,9; выводим строку на экран
    mov dx,di
    inc dx
    int 21h

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

  1. al, 0 - переменная al содержит символ, который является двоичным представлением числа, а 0 - это символ, который добавляется к al.
  2. stosb - команда, которая записывает символ из регистра al в буфер экрана.
  3. pop ax - команда, которая помещает значение регистра ax в стек.
  4. test ax,ax - команда, которая проверяет, не равно ли значение регистра ax нулю.
  5. jnz a1 - команда, которая выполняет переход, если значение регистра ax не равно нулю.
  6. mov ah,9 - команда, которая помещает значение 9 в регистр ah.
  7. mov dx,di - команда, которая помещает значение регистра di в регистр dx.
  8. inc dx - команда, которая увеличивает значение регистра dx на единицу.
  9. int 21h - команда, которая выполняет функцию 21h, которая является функцией вывода символа на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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