Win32Asm Tutorial |
![]() |
назад | 7- Условные переходы | вперед | ![]() |
7.0 - Условные переходы
В секции кода, вы также можете использовать метки, как здесь:
.code
mov eax, edx
sub eax, ecx
cmp eax, 2
jz loc1
xor eax, eax
jmp loc2
loc1:
xor eax, eax
inc eax
loc2:
(xor eax, eax означает: eax = 0.)
Давайте исследуем код:
mov eax, edx : поместить edx в eax
sub eax, ecx : вычесть ecx из eax
cmp eax, 2
Это новая команда: cmp. Команда Cmp производит сравнение двух операндов. Она сравнивает два значения (регист, память, непосредственное значение) и устанавливает флаг нуля Z (zeroflag) если они равны. Флаг нуля, так же, как флаг переноса, находится во внутреннем флаговом регистре.
jz loc1
Это также новая команда - условный переход. Jz = (jump if zero) переход если ноль. То есть переход, если флаг нуля установлен. Loc1 это метка для смещения в памяти, на команды 'xor eax, eax | inc eax'. Значит jz loc1 = переход на команды после метки loc1 если флаг нуля установлен.
cmp eax, 2 : устанавливает флаг нуля, если eax=2
jz loc1 : переход, если флаг нуля установлен
=
Переход на команды после метки loc1, если eax равно 2
Далее здесь стоит jmp loc2. Это тоже переход, но безусловный: т.е. всегда переходит. Что именно делает вышеприведенный код:
if ((edx-ecx)==2)
{
eax = 1;
}
else
{
eax = 0;
}
или BASIC версия:
IF (edx-ecx)=2 THEN
EAX = 1
ELSE
EAX = 0
END IF
7.1 - Регистр флагов
Регистр флага имеет набор флагов, которые устанавливаются или сбрасываются в зависимости от вычислений или других событий. Я не буду расказывать о всех, а только о некоторых важных:
ZF (Zero flag) Флаг нуля
Этот флаг устанавливается, когда результат вычисления нулевой (чтобы сравнить - фактически substraction без того, чтобы сохранить(экономить) результаты, но устанавливать флажки только). This flag is set when the result of a calculation is zero (сравнение это фактически вычитание без сохранения результата, и установка соответствующих флагов).