- cs — сегментный регистр кода, в котором находится физический (базовый) адрес текущего сегмента кода;
· eip/ip — регистр указателя команды, в котором находится значение, представляющее собой смещение в памяти следующей команды, подлежащей выполнению, относительно начала текущего сегмента кода.
Таким образом, команды передачи управления изменяют содержимое регистров cs и eip/ip, в результате чего микропроцессор выбирает для выполнения не следующую по порядку команду программы, а команду в некотором другом участке программы.
Модификаторы:
- near ptr — прямой переход на метку внутри текущего сегмента кода. Модифицируется только регистр eip/ip на основе указанного в команде адреса (метки) или выражения,
- far ptr — прямой переход на метку в другом сегменте кода. Адрес перехода задается в виде непосредственного операнда или адреса (метки) и состоит из 16-битного селектора и 16/32-битного смещения, которые загружаются, соответственно, в регистры cs и ip/eip;
- word ptr — косвенный переход на метку внутри текущего сегмента кода. Модифицируется (значением смещения из памяти по указанному в команде адресу, или из регистра) только eip/ip. Размер смещения 16 или 32 бит;
- dword ptr — косвенный переход на метку в другом сегменте кода. Модифицируются (значением из памяти — и только из памяти, из регистра нельзя) оба регистра, cs и eip/ip. Первое слово/двойное слово этого адреса представляет смещение и загружается в ip/eip; второе/третье слово загружается в cs.
Команда безусловного перехода jmp
|
|
Синтаксис команды безусловного перехода
jmp [модификатор] адрес_перехода - безусловный переход без сохранения информации о точке возврата.
Всего в системе команд микропроцессора есть несколько кодов машинных команд безусловного перехода jmp.
Их различия определяются дальностью перехода и способом задания целевого адреса.
Дальность перехода определяется местоположением операнда адрес_перехода. Этот адрес может находиться в текущем сегменте кода или в некотором другом сегменте. В первом случае переход называется внутрисегментным, или близким, во втором — межсегментным, или дальним.
Внутрисегментный переход предполагает, что изменяется только содержимое регистра eip/ip.
Можно выделить три варианта внутрисегментного использования команды jmp:
- прямой короткий;
- прямой;
- косвенный.
Опишите состав и назначение команд условного перехода
JCC – команда условного перехода
Синтаксис: jcc метка
Осущ переход внутри текущего сегмента команд в соответствии с условием.
Команды условного перехода удобно применять для проверки различных условий, возникающих в ходе выполнения программы. Ниже приведены перечень команд условного перехода, анализируемые ими флаги и соответствующие им логические условия перехода.
|
|
Коман | Сост провер фл | Усл перехода |
JA | CF = 0 и ZF = 0 | Выше(беззнак |
JAE | CF = 0 | выше или = |
JB | CF = 1 | ниже |
JBE | CF=1илиZF=1 | ниже или = |
JG | ZF=0иSF=OF | >(знаковые) |
JGE | SF = OF | Больше или= |
JL | SF <> OF | меньше |
JLE | ZF=1 или SF <> OF | меньше или= |
JC | CF = 1 | перенос |
JE | ZF = 1 | равно |
JZ | ZF = 1 | 0 |
JNA | CF=1иZF =1 | не выше |
JNAE | CF = 1 | не выше или= |
JNB | CF = 0 | не ниже |
JNBE | CF=0 и ZF=0 | не ниже и не= |
JNC | CF = 0 | нет переноса |
JNE | ZF = 0 | не равно |
JNG | ZF = 1 или SF <> OF | не больше |
JNGE | SF <> OF | не бол или= |
JNL | SF = OF | не меньше |
JNLE | ZF=0и SF=OF | не меньш или= |
JNO | OF=0 | нет переполн. |
JNP | PF = 0 | Нет четности |
JNS | SF = 0 | Нет знака |
JNZ | ZF = 0 | нет нуля |
JO | OF = 1 | переполнение |
JP | PF = 1 | Четность |
JPE | PF = 1 | Четное |
JPO | PF = 0 | Не четное |
JS | SF = 1 | Знак |
JCXZ/JECXZ Переход, если выполнено условие / Переход, если CX/ECX равен нулю.
Опишите состав и назначение команд работы с циклами
Эти команды используют регистр ecx/cx как счетчик цикла.
loop метка_перехода (Loop) — повторить цикл. Команда позволяет организовать циклы, подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла. Работа команды заключается в выполнении следующих действий:
декремента регистра ecx/cx;
сравнения регистра ecx/cx с нулем:
если (ecx/cx) > 0, то управление передается на метку перехода;
если (ecx/cx) = 0, то управление передается на следующую после loop команду.
loope/loopz метка_перехода (Loop till cx <> 0 or Zero Flag = 0) — повторить цикл, пока cx <> 0 или zf = 0.
Команды loope и loopz — абсолютные синонимы, поэтому используйте ту команду, которая вам больше нравиться. Работа команд заключается в выполнении следующих действий:
декремента регистра ecx/cx;
сравнения регистра ecx/cx с нулем;
анализа состояния флага нуля zf:
если (ecx/cx) > 0 и zf = 1, управление передается на метку перехода;
если (ecx/cx) = 0 или zf = 0, управление передается на следующую после loop команду.
loopne/loopnz метка_перехода (Loop till cx <> 0 or Not Zero flag=0) — повторить цикл пока cx <> 0 или zf = 1.
Команды loopne и loopnz также абсолютные синонимы. Работа команд заключается в выполнении следующих действий:
декремента регистра ecx/cx;
сравнения регистра ecx/cx с нулем;
анализа состояния флага нуля zf:
если (ecx/cx) > 0 и zf = 0, управление передается на метку перехода;
если (ecx/cx)=0 или zf=1, управление передается на следующую после loop команду.
Команды loope/loopz и loopne/loopnz по принципу своей работы являются взаимообратными. Они расширяют действие команды loop тем, что дополнительно анализируют флаг zf, что дает возможность организовать досрочный выход из цикла, используя этот флаг в качестве индикатора.
Недостаток команд организации цикла loop, loope/loopz и loopne/loopnz в том, что они реализуют только короткие переходы (от –128 до +127 байт). Для работы с длинными циклами придется использовать команды условного перехода и команду jmp