;
; Основной цикл деления - получить десятичный разряд.
; Повторять, пока остаются разряды.
more_dec:
xor dx,dx ; очистить
div bx ; разделить на 10
push dx ; сохранить остаток
inc cl ; добавить к значению счетчика
; разрядов единицу
or ax,ax ; проверить частное
jnz more_dec ; продолжить, если больше
;
; Основной цикл печати разрядов - обратный порядок.
sub ch,cl ; минимальное число разрядов
; получено?
jle morechr ; да, начать отображение
xor dx,dx ; нет, начать вставлять "нули"
morezero:
push dx
inc cl ; добавить к значению счетчика
; разрядов единицу
dec ch ; проверить на совпадение
jnz morezero ; нет - продолжать вставку
morechr:
pop dx ; восстановить последний разряд
add dl,30h ; преобразовать в код ASCII
- П-31 -
@DisChr dl ; разряд результата
dec cl ; вычесть из счетчика разрядов
; единицу
jnz morechr ; продолжить, если больше
;
pop dx ; восстановить содержимое регистров
pop cx
pop bx
pop ax
ret
;
bin2dec ENDP
;
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++
; BIN2DEC2 - Преобразование из двоичной в десятичную систе-
; му счисления; отображает 32-разрядное число. Создает
; два десятичных числа, которые отображаются через обра-
; щения к BIN2DEC.
; Может быть указано минимальное число разрядов, под-
; лежащих отображению. Если минимальное количество ука-
; занных разрядов больше фактического числа разрядов, вы-
; ходное число дополняется начальными нулями.
; Примечание: сдвоенных регистров, содержащих число,
; разбивается в лучшем случае, наименьшая значащая часть
; числа составляет 9.999. Оно никогда не будет отображено
; как отрицательное число.
;
; Вход : DX: AX = число, подлежащее отображению
; CH = минимальное число разрядов, подлежащих
; отображению
;
; Выход : (регистры AX : DX восстанавливаются)
;
; Вызываемые стандартные программы: BIN2DEC (вывод
; 16-разрядного числа в десятичном виде)
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
PUBLIC BIN2DEC2 ; библиотечная стандартная программа
;
bin2dec2 PROC NEAR
;EXTRN bin2dec2:NEAR ; ссылка на стандартную программу
; BIN2DEC
push ax ; сохранить содержимое регистров
push bx
push cx
push dx
;
; Проверить на отрицательное число. Если отрицательное,
; сделать положительным.
or dx,dx ; число положительное ?
jnl bd2_pos ; да, игнорировать "отрицательное"
not ax ; сделать число положительным
not dx
add ax,1 ; (точное) дополнение в двоич-
; ной системе счисления (допол-
; нительный код), реализуемое
- П-32 -
; аппаратным способом
adc dx,0
push dx
push ax
@DisChr '-'
pop ax
pop dx
;
; Теперь разбить число, подлежащее распечатке, на две
; управляемые части.
bd2_pos:
mov bx,10000 ; установить делитель = 10000
div bx ; разбить число на пары
cmp dx,0 ; отбросить, если наибольшее
je bd2_2big ; значащее число слишком велико
or ax,ax ; выяснить, равно ли "0"
; наибольшее значащее число
jz bd2_nosig ; нет наибольшего значащего
; числа
;
; Печать первого наибольшего значащего числа (старшая
; часть числа).
push dx
sub ch,4 ; четыре разряда будут распе-
; чатаны из наименьшей значащей
; части числа
jnc bd2_cntok ; запросить больше 4 для того,
; чтобы значение счетчика стало
; действительным
mov ch,0 ; в противном случае, опрос идет
; до тех пор, пока не кончатся разряды
bd2_cntok:
call bin2dec ; печатать наибольшую значащую
; часть числа
pop dx ; восстановить наименьшую
; значащую часть числа
mov ch,4 ; четыре разряда в наименьшей
; значащей части числа
;
; Печатать наименьшую значащую часть числа (младшую часть
; числа).
bd2_nosig:
mov ax,dx ; печатать сначала содержимое
; регистра DX (наименьшую зна-
; чащую часть числа)
call bin2dec ; печатать наименьшую значащую
; часть числа
bd2_done:
pop dx ; восстановить содержимое регист-
; ров и выйти из программы
pop cx
pop bx
pop ax
ret
bd2_2big:
@DisStr Bin2BigErrMsg
- П-33 -
jmp short bd2_done ; возвратиться из стан-
; дартной программы
;
_TEXT ENDS
_DATA SEGMENT
Bin2BigErrMsg db "BIN2DEC2 error: Oшибка: число слишком
велико.$"
_DATA ENDS
_TEXT SEGMENT
;
bin2dec2 ENDP
;
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
; BIN2HEX - Преобразование из двоичной в шестнадцатирич-
; ную систему счисления; отображает 16-разрядное число в
; шестнадцатиричном виде.
; Может быть указано минимальное количество разрядов,
; подлежащих отображению : если минимальное число указанных
; разрядов больше фактического количества разрядов, выход-
; ное число дополняется значащими нулями.
;
; Вход : AX = число, подлежащее отображению
; CH = минимальное число разрядов, подлежащих
; отображению (от 1 до 4).
; Если CH=0, то значение счетчика разря-
; дов по умолчанию принимается равным 4)
;
; Выход : нет (регистры AX и CX восстанавливаются)
;
; Вызываемые стандартные программы: нет
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
PUBLIC BIN2HEX ; библиотечная стандартная программа
;
bin2hex PROC NEAR
push ax ; сохранить содержимое регистров
push bx
push cx
push dx
;
mov bx,ax ; использовать регистр BX для
; временного хранения
cmp ch,0 ; счетчик уже установлен?
jne align_left ; да, тогда продолжать
mov ch,4 ; иначе, установить значение
; счетчика символов, равным 4
;
; Выровнять число по левому краю регистра AX (циклически
; сдвигать влево на (4 - CH) х 4 битовые позиции
allign_left:
mov cl,4 ; определить число сдвигаемых цифр
sub cl,ch
shl cl,1 ; умножить на 4
shl cl,1
rol bx,cl ; выравнивание влево
mov cl,4 ; и установить наименьшее
; значение счетчика циклического сдвига
- П-34 -
;
; Основной цикл повторить N раз. Печатать старший разряд.
more_hex:
rol bx,cl ; переместить на один разряд
; вправо
mov al,bl ; переслать в регистр AL
and al,0Fh ; только младший разряд
add al,90h ; скрытое преобразование в
daa ; шестнадцатиричные символы
; в коде ASCII
adc al,40h
daa
;
; Отобразить разряд
@DisChr al
dec ch ; вычесть из счетчика разрядов
; единицу
jnz more_hex ; продолжить, если больше
;
pop dx ; восстановить содержимое регистров
pop cx
pop bx
pop ax
ret
;
bin2hex ENDP
;
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
; CHGCASE - Изменить регистр клавиатуры для симво-
; лов. Меняет регистр символов в коде ASCII. Указывается
; тип преобразования регистра клавиатуры.
;
; 1. Принудительное изменение верхнего регистра клавиатуры
; на нижний.
; 2. Принудительное изменение нижнего регистра клавиатуры на
; верхний.
; 3. Изменить состояние регистра клавиатуры на противополож-
; ное (если нижний, то верхний; если верхний, то нижний).
;
; Вход : AL = буквенный символ в коде ASCII, подлежащий
; преобразованию
; AH = тип преобразования:
; "L" или "l" = печать символа на нижнем
; регистре клавиатуры
; "U" или "u" = печать символа на верхнем
; регистре клавиатуры
; любое другое значение меняет состояние
; регистра клавиатуры на противоположное
;
; Выход : AL = преобразованный символ в коде ASCII