Другие языки программирования и технологии
Язык программирования Ассемблер
Помогите пожалуйста.Имеет ли значение тот факт, на какое количество байт передается управление с помощью команды условного перехода?
Если речь об x86, то в ней существуют разные опкоды для разных видов перехода. Относительные, задаваемые операндом команды (в формате знакового целого числа, прибавляемого к IP/EIP/RIP следующей инструкции):
Следующая категория переходов - это переходы по абсолютному значению регистра.
Дальше идут дальние переходы со сменой сегмента. Переходы с заданием адреса непосредственно в операнде команды:
Дальние переходы по адресу, лежащему в памяти:
Переходы в защищённом режиме кодируются так же, как в реальном 8086 или в эмуляции 8086 внутри защищённого режима, но меняется принцип сегментной адресации (в адресной схеме 8086 сегмент умножался на 16, и к этому прибавлялось смещение, а в защищённом режиме сегмент транслируется в реальный адрес через таблицу сегментов).
Ещё один эффект от выбора перехода - это настройка адресов в DLL (если говорить о Windows). Все лежащие в сегменте данных или кода абсолютные адреса настроены, исходя из того, что DLL будет загружена в адресное пространство процесса по определённому начальному адресу (указанному в самой DLL). Поскольку разработчики библиотек обычно не уделяют внимания выбору уникального начального адреса, большинству DLL назначается один и тот же адрес по умолчанию, а при загрузке в память загрузчик самостоятельно разводит их по непересекающимся участкам адресного пространства. Это требует перенастройки всех абсолютных адресов внутри данных и кода перемещаемых библиотек, поэтому каждый абсолютный адрес добавляет к стоимости перемещения. С относительными адресами перехода такого не происходит.
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 назначается один и тот же адрес по умолчанию, а при загрузке в память загрузчик самостоятельно разводит их по непересекающимся участкам адресного пространства. Это требует перенастройки всех абсолютных адресов внутри данных и кода перемещаемых библиотек, поэтому каждый абсолютный адрес добавляет к стоимости перемещения. С относительными адресами перехода такого не происходит.
Обычно указывается метка команды, на которую следует передать управление. Непосредственный операнд указывать нельзя. Пример прямого перехода ... Существуют две команды прямого перехода. В первой команде относительный адрес перехода задается в виде байта (короткий переход), а в другой – в виде слова (длинный переход). ... Если она укладывается в байт, ассемблер формирует машинную команду короткого перехода (1 байт), иначе – формирует команду длинного перехода (2 байта). Однако сделать такой выбор ассемблер в состоянии, если метка была описана до команды перехода, т.е. имеет место переход по ссылке назад.
Похожие вопросы
- Почему здесь нет языка программирования ассемблер?
- Кто нибудь знает когда был разработан язык программирования Ассемблер?
- А какие языки программирования изучали в 80х и на чём вы их изучали?
- А зачем так много языков программирования? Разве нельзя было обойтись одним ассемблером?
- Ассемблер сложно ли выучить этот язык программирования.
- Подойдет ли ассемблер как первый язык программирования?
- Чем известен Ассемблер, для чего нужен и чем выделяется на фоне остальных языков программирования???
- Какой язык программирования выбрать для изучения для начинающего ? (внутри)
- С какого языка программирования начать?
- И снова про языки программирования ^_^ Поправьте, если я ошибаюсь где-то.