Dimon4ik:
Давайте, я объясню.
Регистр BL - 8-мибитный. Биты в регистрах нумеруются от младших к старшим, начиная с нуля.
Т.е. биты регистра будут расположены так: 7 6 5 4 3 2 1 0
Допустим, что мы ввели цифру 5. В кодировке ASCII цифре 5 соответствует код 53, который в 16-ричной с.с. записывается как 35h, а в двоичной - как 00110101b.
Вначале (перед циклом) производятся 4 сдвига влево на 1 разряд (т.е. суммарно сдвиг влево на 4 разряда). При этом старшие разряды "выходят" за разрядную сетку, т.е. пропадают.
Справа же биты заполняются нулями.
В результате значение регистра BL перед циклом станет равным 01010000b.
Теперь переходим к циклу.
Первая команда (shl bl, 1) производит сдвиг влево регистра BL на 1 разряд. В результате операции биты 7-1 регистра BL примут значения битов 6-0 данного регистра перед операцией, бит 0 примет значение 0, а значение бита 7 регистра перед выполнением операции будет помещено в бит переноса регистра флагов (CF).
Т.е. на первой итерации после выполнения этой команды регистры процессора будут иметь такие значения:
BL = 10100000b
CF = 0
Вторая команда заносит в регистр DL значение '0'. Цифра '0' в кодировке ASCII имеет код 48, в 16-ричной с.с. он представляется как 30h, в десятичной - 00110000b.
Т.е. регистр DL принимает значение 00110000b
Теперь самая интересная команда - adc dl, 0. Эта команда осуществляет прибавление к значению регистра DL числа 0 и, дополнительно, прибавление значения флага переноса. Т.е. DL = DL + 0 + CF [$8660$] DL = DL + CF.
На первом шаге, т.к. CF = 0, регистр DL останется без изменений, т.е. будет иметь значение 00110000b
Последовательность команд mov ah, 2; int 21h вызывает функцию 2 прерывания 21h. Данная функция выводит в консоль символ, код ASCII которого соответствует значению регистра DL. В нашем случае там записан код символа '0', т.е. будет произведен вывод на экран цифры 0.
Команда loop bin_loop уменьшает значение регистра CX на 1 и в случае, если CX [$8800$] 0, осуществляет передачу управления на заданную метку, т.е. организует цикл. У нас значение CX равно 4, значит, после выполнения команды CX станет равным 3 и будет осуществлена передача управления.
Быстро разберем оставшиеся итерации.
Шаг 2.
Состояние регистров:
BL = 10100000b
CX = 3
shl bl, 1: BL = 01000000b; CF = 1
mov dl, '0': DL = 00110000b
adc dl, 0: DL = 00110001b = 31h = '1'
mov ah, 2
int 21h - вывод цифры 1 на экран
loop bin_loop: CX = 2, переход
Шаг 3.
Состояние регистров:
BL = 01000000b
CX = 2
shl bl, 1: BL = 10000000b; CF = 0
mov dl, '0': DL = 00110000b
adc dl, 0: DL = 00110000b = 30h = '0'
mov ah, 2
int 21h - вывод цифры 0 на экран
loop bin_loop: CX = 1, переход
Шаг 4.
Состояние регистров:
BL = 10000000b
CX = 1
shl bl, 1: BL = 00000000b; CF = 1
mov dl, '0': DL = 00110000b
adc dl, 0: DL = 00110001b = 31h = '1'
mov ah, 2
int 21h - вывод цифры 1 на экран
loop bin_loop: CX = 0, нет перехода
В результате на экран будет выведена такая последовательность: 0101, что соответствует цифре 5