Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
LOOPcond
Влияние команды на флаги и форматы команды:
|
|
|
|
|
|
|
|
|
E2 cb |
LOOP rel8 |
Увеличить (E)CX и выполнить короткий переход, если (E)CX <> 0 |
8086 |
loop met2 |
E1 cb |
LOOPE rel8 |
Увеличить (E)CX и выполнить короткий переход, если (E)CX<>0 и ZF=1 |
8086 |
loope met2 |
E1 cb |
LOOPZ rel8 |
Увеличить (E)CX и выполнить короткий переход, если (E)CX<>0 и ZF=1 |
8086 |
loopz met2 |
E0 cb |
LOOPNE rel8 |
Увеличить (E)CX и выполнить короткий переход, если (E)CX<>0 и ZF=0 |
8086 |
loopne met2 |
E0 cb |
LOOPNZ rel8 |
Увеличить (E)CX и выполнить короткий переход, если (E)CX<>0 и ZF=0 |
8086 |
loopnz met2 |
Описание:
Команда LOOP уменьшает регистр-счетчик без изменения какого-либо из флагов. Затем проверяются условия характерные для конкретной формы используемой команды LOOP. Если условия удовлетворяются, то происходит короткий переход на метку, заданную операндом команды LOOP.
Если атрибут размера адреса равен 16 бит, то в качестве счетчика используется регистр CX, иначе — ECX.
Операнд команды LOOP — это знаковое непосредственное значение в диапазоне от -128 до +127, оно задает смещение точки перехода относительно первого байта следующей команды.
Команды LOOP обеспечивают циклический контроль и объединяют индексное управление циклом с условным ветвлением. Условные формы команды LOOPcond наряду с анализом значения в регистре (E)CX проверяют состояние флага ZF. Следует понимать, что сама команда LOOPcond не оказывает никакого влияния на этот флаг, его значение определяется результатом исполнения предшествующих команд, которые исполняются в теле цикла.
Операция:
IF Address = 16 THEN CountReg is CX; ELSE CountReg is ECX; FI;
CountReg = CountReg - 1;
IF (Команда не LOOP)
THEN
IF (Команда LOOPE) OR (Команда LOOPZ))
THEN BranchCond = (ZF = 1) AND (CountReg ¹ 0)
FI;
IF (Команда LOOPNE) OR (Команда LOOPNZ))
THEN BranchCond = (ZF = 0) AND (CountReg ¹ 0)
FI;
FI;
IF BranchCond
THEN
IF OperandSize = 16
THEN IP = IP + SignExtend(rel8);
ELSE (* OperandSize = 32 *)
EIP =EIP + SignExtend(rel8);
FI;
FI;
Особые ситуации защищенного режима:
#GP(0), если смещение точки, к которой осуществляется переход, находится вне пределов текущего кодового сегмента.
Особые ситуации режима реальной адресации:
Нет.
Особые ситуации режима V86:
Нет.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru