Режим адресации в IA-32

Я искал режимы адресации в IA-32, но не нашел ни одного веб-сайта или статьи, в которых просто объяснялись бы режимы адресации. Мне нужна статья или что-то, что объясняет дело просто какой-то картинкой памяти во время ее изменения и указанием режима адреса по картинкам.

Я знаю, что в IA-32 общая форма адресации выглядит следующим образом:

Сегмент + База + (индекс * масштаб) + смещение

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

Наконец, я хочу, чтобы объяснение режимов адресации в IA-32 было просто и желательно представлено картинками о памяти и ее смещении и...

Я изучаю язык программирования на ассемблере по книге Руководство по программированию на ассемблере в Linux.

Тогда спасибо.


person user3679015    schedule 29.08.2014    source источник
comment
См. Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32, том 1: Базовая архитектура, раздел 3.7.5 Указание смещения.   -  person Jester    schedule 29.08.2014
comment
Насколько мне известно, возможно около 30 различных типов режимов адресации, если используются все комбинации. Глава 4 этой ссылки разъяснит вам их все: ic.unicamp.br/~pannain/mc404/aulas/pdfs/   -  person icbytes    schedule 29.08.2014
comment
Итак, спасибо за ваш ответ. Я прочитаю pdf. Надеюсь, он хорошо прояснит вопрос.   -  person user3679015    schedule 29.08.2014
comment
Википедия четко показывает все режимы адресации x86: en.wikipedia.org/wiki/X86#Addressing_modes   -  person nrz    schedule 29.08.2014


Ответы (1)


Это изображение найдено в этой презентации PowerPoint.

Режимы адресации

Это означает, что вы можете иметь такие адреса, как [eax + ecx * 2 + 100]. Вам не обязательно использовать все эти поля.

См. также Ссылка на содержимое ячейки памяти. (режимы адресации x86)

Масштабный коэффициент кодируется в машинном коде как 2-битный счетчик сдвига. ESP не может быть индексом из-за особых случаев указания наличия байта SIB и байта SIB с без индекса. См. rbp не допускается в качестве базы SIB? для краткого изложения особых случаев.


Сегментацию можно игнорировать в 32- или 64-разрядном режиме под обычными ОС, такими как Linux.

Регистр сегмента выбирается автоматически в зависимости от базового регистра в режиме адресации или с префиксом переопределения сегмента (например, ds:, cs:).

Но Linux использует плоскую модель памяти, поэтому база сегмента всегда равна 0 для всех сегментов (кроме fs или gs, используемых для локального хранения потока). База сегмента добавляется к «смещению», рассчитанному из базы, индекса, масштаба и смещения, чтобы получить окончательный линейный адрес. Таким образом, обычно часть «смещения» представляет собой весь линейный адрес.

Этот линейный адрес является виртуальным адресом, который аппаратно преобразуется в физический через таблицы страниц / TLB (управляемые ядром).

person Mika Lammi    schedule 29.08.2014
comment
Остальное может быть и ОК, но в обычных 32-битных режимах адресации сегментные регистры не сдвигаются влево на 4 бита и не добавляются к адресу, они обычно являются индексами (индексами) в таблице селекторов. Селектор содержит информацию о сегменте. - person Rudy Velthuis; 29.08.2014
comment
Чтобы уточнить, 4-битный сдвиг происходит только в реальном режиме. - person Drew McGowen; 29.08.2014
comment
Так что спасибо за ваш ответ, потому что это просто, и я понял. особенно о смещении 4 бит в реальном режиме и защищенном режиме. - person user3679015; 29.08.2014
comment
Но у меня есть еще вопрос по картинке. Почему ESP нельзя использовать в качестве индекса? и почему цифры на шкале всего 1,2,4,8? почему не 16,32? и последний вопрос: что означает слово смещения в программировании на языке ассемблера? Я нашел другое значение этого слова в некоторых словарях. Тогда спасибо - person user3679015; 29.08.2014
comment
@ user3679015 См. руководства Intel или AMD. Таких адресных форм нет. Байт SIB имеет только 2 бита для масштаба, поэтому возможны только 4 разных масштаба: 0b00:1, 0b01:2, 0b10:4, 0b11:8. кодировок используется для кодирования SIB без индексного регистра. - person nrz; 30.08.2014