2015-04-03 3 views
1

Я ищу пример кода для сборки, и назначение в основном заключается в замене одной точки перехода на другую.В чем разница, если таковая имеется, между LONG и FAR прыгает в Assembly?

Исходный jmp - SHORT jmp, и конечная точка, с которой мне нужно приблизиться, не может быть достигнута с помощью этой инструкции.

У меня есть три варианта, я либо удаляю 'SHORT', я вставляю 'LONG' или вставляю 'FAR'.

Если есть документация в любом месте, что указывает на различия между ними, я еще не нашел ее. Может ли кто-нибудь помочь?

ответ

6

Я предполагаю, что ваш вопрос относится к архитектуре x86; вы не указали в своем вопросе.

A SHORT прыжок - относительный переход к определенному смещению от текущего указателя указателя. A LONG jump использует большее значение смещения и поэтому может отскакивать дальше от текущего указателя инструкции. Оба этих типа перехода обычно равны относительной - то есть операнд является смещением от текущего указателя инструкции (хотя в источнике сборки вы обычно указываете целевую метку - тогда ассемблер или компоновщик вычисляет смещение). Ни один из них не перескакивает на другой сегмент кода, поэтому они являются «близкими» переходами.

FAR скачка определяет как сегмент и смещение, которые являются как абсолютной в том смысле, что они определяют необходимый указатель сегмента кода и команд, а не смещение относительно указателя сегмента текущего кода/команды.

(Обратите внимание, что можно также совершить непрямой абсолютный прыжок, где вы указываете операнд, который содержит абсолютный адрес, к которому вы хотите перейти. В этом случае прыжок может быть как ближним, так и дальним - он может включать или не включать требуемый сегмент кода).

Если вы не указали расстояние «прыжок», то до ассемблера вы получите короткий, длинный или дальний прыжок. Большинство современных ассемблеров являются «двухпроходными» и, если возможно, будут использовать короткий прыжок, или длинный или дальний прыжок в противном случае - последний, только если потребуется.

См. wikipedia's entry on x86 memory segmentation, если вам нужна помощь в понимании того, что я подразумеваю под «сегментом».

См. this description of the x86 JMP instruction для получения полной информации о возможных режимах адресации команд JMP.

+0

Полностью забыл выбрать ответ по этому вопросу. D'о. Спасибо за объяснение, это было полезно! – spoorlezer

1

SHORT jump: Если jmp является прямым прыжком, они используют относительные значения смещения от 00h до 7Fh, которые позволяют выполнить выполнение программы другой инструкцией с максимальным количеством 127 байтов между ними. Если это обратный прыжок, они используют относительные значения смещения от 80h до FFh, которые позволяют выполнять выполнение программы другой инструкцией с максимальным количеством 125 байтов между ними.
A LONG прыжок может использовать большее смещение.
A FAR прыжок, переход на другой сегмент кода.

+0

«Скачок« LONG »может использовать большее смещение». Это неправда. Скачок 'LONG' указывает абсолютный адрес. То есть 'JMP 0x100' перескакивает на адрес 0x100 в текущем сегменте. Скачок 'FAR' также указывает абсолютный адрес. –

+1

@JimMischel, это неверно, см. Ссылку на детали инструкции JMP, которые я дал в своем ответе выше. Скачок 'LONG' является либо относительным, либо« абсолютным косвенным ». Скачок 'FAR' всегда указывает абсолютный адрес, но прыжок' LONG' не работает. – davmac

+0

@ davmac: Спасибо за исправление. –

Смежные вопросы