Перевод из двоичной системы в десятичную - Assembler
Формулировка задачи:
Добрый день. Нужно ввести с клавиатуры 2 двоичных 8-розрядных числа (допустим x и y). И вывести на экран десятичные значения данных чисел, а также их сумму и разность(в десятичной). С ассемблером знакома плохо, попыталась написать, выдаёт divide overflow:
Есть большие подозрения что неправильно выделила память под числа. Да и вообще дико запуталась пока писала. Поиском не нашла подобного Перевод делала по алгоритму:
10101011= ((((((1*2+0)*2+1)*2+0)*2+1)*2+0)*2+1)*2+1=171
Помогите пожалуйста разобраться.
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
Решение задачи: «Перевод из двоичной системы в десятичную»
textual
Листинг программы
add al,'0'; превращаем в символ stosb pop ax test ax,ax; деление закончено? jnz a1 exit: mov ah,9; выводим строку на экран mov dx,di inc dx int 21h
Объяснение кода листинга программы
al
,0
- переменнаяal
содержит символ, который является двоичным представлением числа, а0
- это символ, который добавляется кal
.stosb
- команда, которая записывает символ из регистраal
в буфер экрана.pop ax
- команда, которая помещает значение регистраax
в стек.test ax,ax
- команда, которая проверяет, не равно ли значение регистраax
нулю.jnz a1
- команда, которая выполняет переход, если значение регистраax
не равно нулю.mov ah,9
- команда, которая помещает значение 9 в регистрah
.mov dx,di
- команда, которая помещает значение регистраdi
в регистрdx
.inc dx
- команда, которая увеличивает значение регистраdx
на единицу.int 21h
- команда, которая выполняет функцию 21h, которая является функцией вывода символа на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д