Инструменты пользователя

Инструменты сайта


examination:asm:question43

Вопрос №43. Безусловные переходы

Синтаксис команды безусловного перехода:

Jmp [модификатор] адрес_перехода

Здесь адрес_перехода представляет метку или адрес области памяти, в которой находится указатель перехода.

Всего в системе команд процессора есть несколько кодов машинных команд безусловного перехода JMP. Их различия определяются дальностью перехода и способом задания целевого адреса. Дальность перехода определяется местоположением операнда адрес_перехода. Этот адрес может находиться в текущем сегменте кода или в некотором другом сегменте. В первом случае переход называется внутрисегментным, или близким, во втором – межсегментным, или дальним. Внутрисегментный переход предполагает, что изменяется только содержимое EIP/IP. Три вида близкого перехода:

  1. прямой короткий переход (расстояние от команды JMP до адреса перехода не превышает -128 или +127 байт. В этом случае транслятор ассемблера формирует машинную команду безусловного перехода длиной 2 байта – первый байт это код операции, значение второго байта вычисляется как разность между значением смещения команды, следующей за JMP, и значением адреса перехода)
  2. прямой переход (отличается от предыдущего тем, что длина команды 3 байта, тк поле адреса расширяется до 2 байтов)
  3. косвенный переход (в команде указывается не сам адрес перехода, а место, где он находится)

Межсегментный переход (кроме регистра EIP/IP, модифицируется еще регистр CS)

  1. прямой переход (длина – 5 байтов: 2 байта это смещение, 2 байта это сегментная составляющая адреса)
  2. косвенный переход (в качестве операнда – адрес области памяти в которой содержатся смещение и сегментная часть целевого адреса перехода)

а теперь подробнее)

Самый простой способ изменить последовательность выполнения команд заключается в использовании команды jmp — так называемой команды безусловного перехода. Она перезаписывает указатель команд (регистр IP или CS), что заставляет процессор «переключиться» на выполнение команды по указанному адресу. Формат команды таков: JMP [тип_перехода] операнд

Команда JMP — аналог конструкции GOTO, которая используется в высокоуровневых языках программирования. Название команды объясняет ее действие, а именно «jump», «переход». Команде нужно передать один обязательный операнд — адрес в памяти, с которого процессор должен продолжить выполнение программы. Операнд может быть указан явно (непосредственное значение адреса) или быть регистром общего назначения, в который загружен требуемый адрес. Но новичкам я никогда не рекомендовал бы это делать: язык ассемблера, подобно языкам программирования высокого уровня, позволяет обозначить адрес назначения при помощи метки. В зависимости от «расстояния» переходы бывают трех типов: короткие (short), ближние (near) и дальние (far). Тип перехода задается необязательным параметром инструкции jmp. Если тип не задан, по умолчанию используется тип near. Максимальная «длина» короткого перехода (то есть максимальное расстояние между текущим и целевым адресом) ограничена. Второй байт инструкции (операнд) содержит только одно 8-разрядное значение, поэтому целевой адрес может быть в пределах от -128 до 127 байтов. При переходе выполняется знаковое расширение 8-разрядного значения и его добавление к текущему значению Е(1Р). «Длина» ближнего перехода (near) зависит только от режима процессора. В реальном режиме меняется только значение IP, поэтому мы можем «путешествовать » только в пределах одного сегмента (то есть в пределах 64 Кб); в защищенном режиме используется EIP, поэтому целевой адрес может быть где угодно в пределах 4 Гб адресного пространства. Переход типа far модифицирует кроме IP еще и сегментный регистр CS, который используется при вычислении фактического адреса памяти. Поэтому команда перехода должна содержать новое значение CS.

Короткий переход полезен в ситуации, где метка назначения находится в пределах 128 байтов. Поскольку команда короткого перехода занимает 2 байта, команда ближнего перехода занимает 3 байта, а дальнего — 5 байтов, мы можем сэкономить байт или три.

examination/asm/question43.txt · Последние изменения: 2014/01/15 12:13 (внешнее изменение)