Для примера рассмотрим следующую задачу. Пусть в регистре al нахо-
дится число от 0 до 9. Требуется получить в нём соответствующий ASCII-код
символа от '0' до '9'. Для этого достаточно написать команду or al,30h.
Дело в том, что в ASCII-кодах цифр биты 4 и 5 равны единице – мы их как
раз и устанавливаем с помощью маски 30h – в двоичном представлении
00110000.
Также в ассемблере имеются команды, позволяющие скопировать указан-
ный бит операнда во флаг CF и затем выполнить внутри операнда с ним ка-
кое-либо действие – они записываются как bt, btc, btr, bts.
2. Команды сравнения и условного перехода. Для сравнения двух чисел ис-
пользуется команда cmp. Она вычитает первый операнд из второго (аналогично
sub), но результат не сохраняет, а лишь выставляет соответствующие флаги.
После команды cmp обычно используется одна из команд условного пе-
рехода. Имеется несколько групп команд условного перехода.
Во-первых, команды, выполняющие переход в зависимости от состояния
конкретного флага: jz – переход, если нуль, jnz – если не нуль, jc – если пере-
нос, jnc – если переноса нет и т.д.
Во-вторых, команды, выполняющие переход в зависимости от равенства
или неравенства операндов: je – переход, если равны, jne – если не равны.
Сюда же можно отнести две специфические команды: jcxz – переход, если
регистр cx=0, jecxz – если регистр ecx равен нулю.
В-третьих, команды перехода после сравнения беззнаковых операндов: ja
– переход, если больше, jae – если больше или равно, jb – если меньше и т.д.
В-четвертых, команды перехода после сравнения операндов со знаком: jg
- переход, если больше, jge – если больше или равно, jl – если меньше и т.д.
Пример:
cmp eax, ebx ;сравнить два числа
jl L1; если меньше (числа со знаком), идти на L1
3. Команда цикла. Для организации циклов, в принципе, можно исполь-
зовать команды условного перехода. Но для удобства имеется и специальный
способ организации цикла, повторяющего заданное число шагов. Для этого в
регистр ecx (или cx) помещается число повторений, затем ставится метка на-
чала цикла, далее идёт тело цикла, а в конце ставится команда loop с меткой.
Команда loop вычитает единицу из ecx (или cx) и сравнивает его с нулём.
Если результат не равен нулю, выполняется переход на метку – т.е. цикл
продолжается. Пример:
mov ecx,10
L1:
; тело цикла...
loop L1
Если мы хотим явно указать, будет в цикле использоваться регистр ecx или cx,
то вместо loop можно использовать команды loopd и loopw соответственно.