Другие языки программирования и технологии

Язык программирования Ассемблер

Помогите пожалуйста.Имеет ли значение тот факт, на какое количество байт передается управление с помощью команды условного перехода?
SA
Syrym Atygai
92
Если речь об x86, то в ней существуют разные опкоды для разных видов перехода. Относительные, задаваемые операндом команды (в формате знакового целого числа, прибавляемого к IP/EIP/RIP следующей инструкции):
 EB rel8   ; jump short, 8-битное смещение, доступно с 8088
E9 rel16 ; jump near, 16-битное смещение, доступно с 8088
E9 rel32 ; jump near, 32-битное смещение, доступно с 80386 в режиме 32-битной адресации
Переходы делаются только внутри текущего сегмента. Заметим, что если в 8088, 8086, 80286 разница между длиной инструкций EB и E9 была 1 байт (2 и 3 байта, соотв.), то в 32-битном режиме это - уже 3 байта (E9 - 5-байтовая). В 64-битном режиме эти виды переходов не поддерживаются.

Следующая категория переходов - это переходы по абсолютному значению регистра.
 FF/4 r/m16 ; jump near, absolute indirect, 16-битный адрес
FF/4 r/m32 ; jump near, absolute indirect, 32-битный адрес
FF/4 r/m64 ; jump near, absolute indirect, 64-битный адрес
16- и 32-битные адреса расширяются нулями (т.е. воспринимаются как беззнаковые). Значение указанного регистра загружается напрямую в IP/EIP/RIP. Сегмент не меняется. Все данные инструкции "весят" по 2 байта. Эти инструкции присутствовали с самых первых версий процессоров (8088, 8086).

Дальше идут дальние переходы со сменой сегмента. Переходы с заданием адреса непосредственно в операнде команды:
 EA p16:16 ; jump far, absolute, 16-битный адрес
EA p16:32 ; jump far, absolute, 32-битный адрес
Значение CS:IP/EIP берётся из операнда команды, составляющего, соответственно, 16+16 или 16+32 бит, итого инструкция занимает 5 или 7 байт. Эта инструкция также присутствовала с самого начала.

Дальние переходы по адресу, лежащему в памяти:
 FF/5 m16:16 ; jump far, absolute indirect, 16-битный адрес
FF/5 m16:32 ; jump far, absolute indirect, 32-битный адрес
FF/5 m16:64 ; jump far, absolute indirect, 64-битный адрес
Эти инструкции похожи на EA и занимают столько же байт, только операнд содержит не адрес перехода, а адрес в данных, из которого нужно взять абсолютный адрес перехода. Эти инструкции также присутствуют с самых ранних версий архитектуры процессора.

Переходы в защищённом режиме кодируются так же, как в реальном 8086 или в эмуляции 8086 внутри защищённого режима, но меняется принцип сегментной адресации (в адресной схеме 8086 сегмент умножался на 16, и к этому прибавлялось смещение, а в защищённом режиме сегмент транслируется в реальный адрес через таблицу сегментов).

Ещё один эффект от выбора перехода - это настройка адресов в DLL (если говорить о Windows). Все лежащие в сегменте данных или кода абсолютные адреса настроены, исходя из того, что DLL будет загружена в адресное пространство процесса по определённому начальному адресу (указанному в самой DLL). Поскольку разработчики библиотек обычно не уделяют внимания выбору уникального начального адреса, большинству DLL назначается один и тот же адрес по умолчанию, а при загрузке в память загрузчик самостоятельно разводит их по непересекающимся участкам адресного пространства. Это требует перенастройки всех абсолютных адресов внутри данных и кода перемещаемых библиотек, поэтому каждый абсолютный адрес добавляет к стоимости перемещения. С относительными адресами перехода такого не происходит.
Sanec Sanec
Sanec Sanec
54 053
Лучший ответ
Обычно указывается метка команды, на которую следует передать управление. Непосредственный операнд указывать нельзя. Пример прямого перехода ... Существуют две команды прямого перехода. В первой команде относительный адрес перехода задается в виде байта (короткий переход), а в другой – в виде слова (длинный переход). ... Если она укладывается в байт, ассемблер формирует машинную команду короткого перехода (1 байт), иначе – формирует команду длинного перехода (2 байта). Однако сделать такой выбор ассемблер в состоянии, если метка была описана до команды перехода, т.е. имеет место переход по ссылке назад.