Шестой и седьмой абзацы
man: ;преобразование ASCII кода в числа в 16ричный формат
mov dl, input[bx] ;запись в dl ASCII-кода из массива input
cmp dl, 60h
jle man0
sub dl, 57h ;если разряд равен a..f, то вычесть из него 57h
jmp man2
man0: cmp dl, 40h ;сравнение разряда с 40h
jle man1
sub dl, 37h ;если разряд равен A..F, то вычесть из него 37h
jmp man2
man1: sub dl, 30h ;если разряд равен 0..9, то вычесть из него 30h
man2:
mov middle1[bx], dl
inc bx
inc cl
cmp cl, 27h
jle man
Еще раз, массив input хранит у нас 40 чисел, представляющих собой ASCII коды чисел и букв. Данная программа преобразует эти коды в числа: код «0» в число 0, код «1» в число 1, код «2» в число 2, …, код «А» или код «а» в число 10, код «В» или код «b» в число 11, код «С» или код «с» в число 12, код «D» или код «d» в число 13, код «E» или код «e» в число 14, код «F» или код «f» в число 15. Полученные после преобразования числа заносятся в массив middle1.
Посмотрим на таблицу ASCII кодов, согласно которой символы с 48 до 57 представляют собой число от 0 до 9; также символы с 65 по 70 представляют собой числа с 10(А) до 15(F); и символы с 97 по 102 представляют собой числа с 10(а) до 15(f).
Теперь разберем построчно программу:
man: ;преобразование ASCII кода в числа в 16ричный формат
mov dl, input[bx] ;запись в регистр dl ASCII-кода из массива input, bx – это номер числа,
;который меняется
cmp dl, 60h ; сравним номер ASCII-кода символа, введенного с клавиатуры,
; с числом 60h (96)
jle man0 ; если код символа меньше, либо равен 96, то перейдем к метке «man0»
; если номер кода меньше 97, то это не строчные буквы «а», «b», ... «f»
; а если номер кода соответствует «а», «b», ... «f», то от него
; необходимо отнять 87 (57h в шестнадцатеричной форме)
sub dl, 57h ; из регистра dl отнимаем 87 и в нем остается соответственно
; (97-87=10 и 102-87=15) число от 10 до 15
jmp man2 ; переход к метке процедуры «man2»
; после того как в регистре dl осталось число от 10 до 15, его
; необходимо записать в массив middle1 и увеличить bx на единицу
; ( bx – номер элемента массива input), что и происходит в процедуре
; «man2»
; вспомним строчку jle man0
man0: cmp dl, 40h ;сравнение регистра dl с числом 64 (40 h – в шестнадцатеричной
; форме), после которого идут заглавные буквы «A», «B», ... «F»
jle man1 ; если код символа в регистре dl меньше, либо равен 64, переходим к
; метке «man1» в тексте программы
sub dl, 37h ; а если код ASCII символа в регистре dl соответствует символам «A»,
; «B», … «F», то вычитаем из регистра dl число 55 (37h). В таком случае
; в регистре dl останется число от 10 до 15 (65-55=10 и 70-55=15).
jmp man2 ; переход к метке процедуры «man2»
; после того как в регистре dl осталось число от 10 до 15, его
; необходимо записать в массив middle1 и увеличить bx на единицу
; ( bx – номер элемента массива input), что и происходит в процедуре
; «man2»
; вспомним строчку jle man1
man1: sub dl, 30h ;если ASCII соответствует символам от «0» до «9», то отнимаем 48(30h)
; в результате в регистре dl остается число от 10 до 15.
; Согласно логике тут стоит строчка «jmp man2», которая упущена
; автором программы, ввиду того, что процедура «man2» описывается
; сразу ниже
man2: ; эта процедура вызывается тогда, когда в регистре dl осталось число
; от 0 до 15 (от 0 до F)
mov middle1[bx], dl ; записываем получившееся число из регистра в массив middle1 по
; элементу с номером bx
inc bx ; после чего увеличиваем номер элемента массива bx на 1
inc cl ; увеличиваем cl на 1
; так как у нас массив input насчитывает 40 чисел, повторяем эту
; процедуру «man» преобразования ASCII кода в 16-ричное число
; 40(27h) раз
cmp cl, 27h ; сравниваем номер раза в регистре cl с 40
; как по мне, то регистр cl использовать не обязательно, достаточно
; после «inc bx» написать сразу «cmp bx, 27h»
jle man ; если меньше, либо равно, то повторяем процедуру «man».
; После преобразования кодов в числа продолжаем программу
