Преобразовать двоичный код в десятичный - 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.