Преобразовать двоичный код в десятичный - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д