Преобразовать двоичный код в десятичный - Assembler
Формулировка задачи:
Ребят, нужно дополнить код, нужно, чтобы результат выполнения программы , то есть двоичный код преобразовался в десятичную СИ, при этом не используя стандартные функции.
Листинг программы
- ; Prg_6_1. asm
- ;Источник: В.И.Юров. Assembler. Учебник для ВУЗОВ.
- ;Программа~преобразования двузначного шестнадцатеричного числа
- ;в символьном виде в двоичное представление.
- ;Вход: исходное шестнадцатеричное число из двух цифр,
- ;вводится с клавиатуры.
- ;Выход: результат преобразования помещается в регистр dl.
- ;
- ; -----------------------------
- data segment para public "data" ;сегмент данных
- message db "Input two hexadecimal digits$"
- data ends
- stk segment stack
- db 256 dup ("?") ;сегмент стека
- stk ends
- code segment para public "code" ;начало сегмента кода
- main proc; начало процедуры main
- assume cs:code,ds:data,ss:stk
- mov ax,data ;адрес сегмента данных в регистр ах
- mov ds,ax ;ax в ds
- mov ah,9
- mov dx,offset message
- int 21h
- xor ax,ax ;очистить регистр ax
- mov ah,1h ;1h в регистр ah
- int 21h ; генерация прерывания с номером 2lh
- mov dl,al ; содержимое регистра al в регистр dl
- sub dl,30h ; вычитание: (dl) = (dl)-30h
- cmp dl,9h ; сравнить (dl) с 9h
- jle M1 ;перейти на метку Ml, если dl<9h или dl=9h
- sub dl,7h ;вычитание: (dl)=(dl)-7h
- M1: ;определение метки M1
- mov cl,4h ;пересылка 4h в регистр cl
- shl dl,cl ;сдвиг содержимого dl нa 4 разряда влево
- int 21h ;вызов прерывания с номером 21h
- sub al,30h ;вычитание: (dl)=(dl)~30h
- cmp al, 9h ; сравнить (al) с 9h
- jle M2 ; перейти на метку M2, если al<9h или al=9h
- sub al,7h ; вычитание: (al) = (al)-7h
- M2: ;определение метки М2
- add dl,al ;сложение: (dl)=(dt)+(al)
- mov ax,4c00h ;пересылка 4c00h в регистр ах
- int 21h ;вызов прерывания с номером 2lh
- main endp ;конец процедуры main
- code ends ; конец сегмента кода
- end main ; конец программы с точкой входа main
Решение задачи: «Преобразовать двоичный код в десятичный»
textual
Листинг программы
- mov ax, <-двоичный код
- mov bx,10
- xor cx,cx
- cnv:
- xor dx,dx
- div bx
- push dx
- inc cx
- or ax,ax
- jnz cnv
- mov ah,02h
- print:
- pop dx
- add dl,30h
- int 21h
- loop print
Объяснение кода листинга программы
- mov ax, <-двоичный код
Переменная
ax
получает значение двоичного кода. - mov bx,10
Переменная
bx
устанавливается равной 10. - xor cx,cx
Переменная
cx
устанавливается равной 0. - cnv: Это метка цикла.
- xor dx,dx
Переменная
dx
устанавливается равной 0. - div bx
Деление переменной
ax
на переменнуюbx
. - push dx
Значение
dx
сохраняется на стеке. - inc cx
Переменная
cx
увеличивается на 1. - or ax,ax
Переменная
ax
устанавливается равной 0. - jnz cnv
Если
cx
больше 0, то происходит переход к меткеcnv
. - mov ah,02h
Переменная
ah
устанавливается равной 2. - print: Это метка цикла.
- pop dx
Значение
dx
восстанавливается из стека. - add dl,30h
Значение
dl
увеличивается на 30. - int 21h Вызов функции BIOS для вывода символа.
- loop print
Переменная
cx
уменьшается на 1. Еслиcx
больше 0, то происходит переход к меткеprint
. Таким образом, код преобразует двоичный код в десятичный, используя цикл деления. Значение двоичного кода сначала делится на 10, затем выводится на экран. Процесс продолжается до тех пор, пока значениеcx
не станет равным 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д