;Prg_3_1.asm
;Программа преобразования двухзначного шестнадцатеричного числа
;в символьном виде в двоичное представление
;Ввод: исходное шестнадцатеричное число из двух цифр
;вводится с клавиатуры
;Выход: результат помещается в регистр dl
;__________________________________________
;__________________________________________
Data segment Para Public "data”
; Para(опция выравнивания) – указывает на начало сегмента на границе параграфа, так что адрес начала нацело делится на 16 (10H).
; Public(опция совмещения) – указывает на то, что нужно скомпилировать отдельно оттранслированные программы в один модуль.
;”data” (опция класс) – используется для группировки родственных сегментов при компоновке. В данном случае указывает на сегмент данных.
Message db "Введите две шестнадцатеричные цифры, $”
; определение переменной Message
; $ - требование завершить вывод (для функции 09h, прерывания int 21h)
Data ends
Stk segment stack
; stack(опция совмещения) – указывает, что это сегмент стека
Db 256 dup ("?”)
; 256 вопросов (резервирует стек)
Stk ends
Code segment Para Public "Code”
; Para(опция выравнивания) – указывает на начало сегмента на границе параграфа, так что адрес начала нацело делится на 16 (10H).
; Public(опция совмещения) – указывает на то, что нужно скомпилировать отдельно оттранслированные программы в один модуль.
;”code” (опция класс) – используется для группировки родственных сегментов при компоновке. В данном случае указывает на сегмент кода.
Main proc
;начало процедуры main
assume cs:code, ds:data, ss:stk
; assume - для указания ассемблеру назначения каждого сегмента в программе
; cs:code – связывает регистр CS и сегмент кода
; ds:data – связывает регистр DS и сегмент данных
; ss:stk – связывает регистр SS и сегмент стека
mov ax, data
; адрес сегмента данных в регистр ах
mov ds, ax
; перемещение ax в ds
mov ah, 9
; записывает в ah - 9
mov dx, offset Message
; mov dx, offset Message – помещает в dx смещение Message относительно сегмента данных
int 21h
; вызов прерывания 21h с ранее определённым значением регистра ah=09, т.е. вывод строки.
Xor ax, ax
; очистить регистр ax
Mov ah,1h
; записать в регистр ah значение 1h
int 21h
; вызов прерывания 21h с ранее определённым значением регистра ah=01, т.е. ввод с клавиатуры с отображением на экране.
Mov dl, al
; перемещение содержимого регистра al в регистр dl
; al – содержит код состояния после выполнения функции 01h, прерывания int 21h
Sub dl, 30h
; вычитание dl=dl-30h
Cmp dl, 9h
; сравнить dl с 9h
Jle M1
; перейти на метку M1 если dl<=9h
Sub dl, 7h
; вычитание dl=dl-7h
M1:
; определение метки M1
Mov cl, 4h
; записать в регистр cl значение 4h
Shl dl, cl
; сдвиг в содержимого dl на 4 разряда влево
int 21h
; вызов прерывания 21h с ранее определённым значением регистра ah=01, т.е. ввод с клавиатуры с отображением на экране.
Sub al, 30h
; вычитание al=al-30h
Cmp al, 9h
; сравнение al c 9h
Jle M2
; перейти на метку M2 если al<=9h
Sub al, 7h
; вычитание al=al-7h
M2:
; определение метки M2
Add dl, al
; сложение dl=dl+al
Mov ax, 4c00h
; пересылка 4c00h в регистр ax
int 21h
; вызов прерывания 21h с ранее определённым значением регистра ah=01, т.е. ввод с клавиатуры с отображением на экране.
Main endp
; конец процедуры main
Code ends
; конец сегмента кода
End main
; конец программы с точкой выхода main