Оригинальный код был такой, но добрый анон его подправил, жаль не до конца. код рабочий, но слишном длинный:
program Kbd_2;
begin
asm
mov CL, 10;
mov AX, 0040h;
mov ES, AX;
mov AX, 006Ch;
mov SI, AX;
@PRG:
@CHK1: //здесь начинаются 3 одинаковых цикла (1 цикл)
in AL, 64h;
and AL, 00000010b;
jnz @CHK1;
mov AL, 11101101b;
out 60h, AL;
@CHK2:
in AL, 64h;
and AL, 00000010b;
jnz @CHK2;
mov AL, 00000010b;
out 60h, AL;
mov BX, [ES:SI];
mov DX, BX;
add DX, 18;
@W1:
mov BX, [ES:SI];
cmp BX, DX;
jb @W1;
@CHK3: //2й цикл
in AL, 64h;
and AL, 00000010b;
jnz @CHK3;
mov AL, 11101101b;
out 60h, AL;
@CHK4:
in AL, 64h;
and AL, 00000010b;
jnz @CHK4;
mov AL, 00000100b;
out 60h, AL;
mov BX, [ES:SI];
mov DX, BX;
add DX, 18;
@W2:
mov BX, [ES:SI];
cmp BX, DX;
jb @W2;
@CHK5: // 3-й цикл
in AL, 64h;
and AL, 00000010b;
jnz @CHK5;
mov AL, 11101101b;
out 60h, AL;
@CHK6:
in AL, 64h;
and AL, 00000010b;
jnz @CHK6;
mov AL, 00000001b;
out 60h, AL;
mov BX, [ES:SI];
mov DX, BX;
add DX, 18;
@W3:
mov BX, [ES:SI];
cmp BX, DX;
jb @W3; //Конец циклов, которые нужно сократить
dec CL;
jnz @PRG;
@CHK7:
in AL, 64h;
and AL, 00000010b;
jnz @CHK7;
mov AL, 11101101b;
out 60h, AL;
@CHK8:
in AL, 64h;
and AL, 00000010b;
jnz @CHK8;
mov AL, 00000010b;
out 60h, AL;
end;
end.
В коде есть 3 одинаковых цикла, в которых поочередно меняется только одна строка:
mov AL, 00000010b;
mov AL, 00000100b;
mov AL, 00000001b;
Эту часть кода аццкий препод попросил сократить и сделать один цикл вместо трех, где одна единственная строка, которая меняется, менялась бы с помощью деления или сдвига вправо.