, Я не знаю много о режимах адресации, доступных на 8-битных процессорах с в основном фиксированными однобайтовыми инструкциями.

дать немного фона, я хотел изучить, как инструкции x86 кодируются / декодируются вручную. Я наткнулся наModR/M а такжеSIB байт, и кажется, что понимание режимов адресации x86 является основополагающим для понимания схемы кодирования команд.

Поэтому я сделал поиск в Google для режимов адресации x86. Большинство блогов / видео, которые возвращал поиск, были адресованы режимам для процессора 8086. Проходя через некоторые из них, различные режимы адресации былиРегистр, Прямой, Косвенный, Индексированный, Основанныйи еще немного. Но блоги используют противоречивые имена при обращении к этим режимам адресации. Несколько разных источников используют несколько разных режимов адресации. Различные термины даже не упомянуты в руководстве IntelВот, Например, я не могу найти где-нибудь в руководстве Intel, режим адресации под названием Direct или Indirect. Так жеMod биты вModRM Байт - это 2-битное поле, что заставляет задуматься, возможно ли более 4 режимов адресации.

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

 pvg16 сент. 2017 г., 20:22
Эти термины на самом деле не являются «старыми терминами», которые каким-то образом перестали существовать, они просто несколько общие и не специфичные для Intel. Руководства Intel не определяют терминологию, поскольку, очевидно, Intel не единственный производитель процессоров или разработчик ISA.
 Hans Passant16 сент. 2017 г., 21:08
Разбивка по режиму адресации не очень полезна для x86. Это очень неортогональный дизайн, в отличие от 68000. Основными драйверами были низкий бюджет транзисторов, стремление оставаться совместимым с предыдущими проектами и оптимизация для плотности кода.
 rcgldr16 сент. 2017 г., 20:24
X86 имеет косвенный режим регистрации, который совпадает с базовым и / или индексированным (адрес или базовый адрес в регистре). Чего у него нет, так этокосвенная память режим иликосвенный режим многоуровневой памяти встречается на некоторых (в основном старых) процессорах
 Margaret Bloom16 сент. 2017 г., 20:24
ModRM был расширен с помощью байта SIB (Scale, Index, Base) (и продолжает расширяться для размещения новых регистров), индексированные, основанные и т. Д. Документированы. Direct и Indirect используются в описании некоторых инструкций. Режим адресации регистра является одним из режимов байта ModRM. Дело в том, что Intel не нужно называть все режимы, так как после того, как она показала, как их кодировать и как они работают, ей просто не важно, какой режим адресации вы используете - она ​​просто заботится о том, что вы используете операнд памяти определенного размера.
 Gene16 сент. 2017 г., 20:39
Это термины для категорий режимов адресации, придуманные авторами книг по компьютерной архитектуре. Все, что вы читаете, относится к режимам адресации x86 с этими категориями. Это может быть полезно, если вы знаете, что означают термины, так как это дает вам начало понимания режимов. Но только начало. Категории широки, и их определения перекрываются (один из примеров - база против индекса). Intel (и AMD) несут ответственность только за указание режимов работы. Они могут называть их как хотят. Было бы хорошо, если бы весь мир использовал одну и ту же терминологию, но этого еще не было.

Ответы на вопрос(1)

Решение Вопроса

адресации x86. Все они имеют форму[base + index*scale + disp8/disp32] (или подмножество любых 1 или 2 компонентов этого), за исключением 64-битной относительной RIP-адресации.Ссылка на содержимое ячейки памяти. (режимы адресации x86).

Корпорация Intel официально называет эти компоненты режимов адресации в разделе 3.7.5 тома 1. Они также используют регистр по сравнению с непосредственным доступом к памяти, но обычно не имеют большого значения для различных форм режима адресации.

Биты Mod в байте ModRM являются 2-битным полем, что заставляет меня задуматься, возможно ли более 4 режимов адресации.

Мод выбирает «Регистрация против памяти» с дисплеем 0/8/32. Есть «escape» коды для большего количества режимов

Режимы, которые будут[rbp] без смещения вместо этого означает, что есть disp32 без базы. (Вот почему вы видите[rbp+0] в разборке: лучшая кодировка для[rbp] является base = rbp, с disp8, равным 0. (Обратите внимание, что[rbp] бесполезно, когда это указатель кадра.)Кодировки ModR / M, которые были бы base = rsp, означают, что есть байт SIB.Кодировки SIB, которые будут иметь индекс = RSP, означают отсутствие индекса. (Учитывая предыдущее правило, это позволяет кодировать[rsp]вместо менее полезного[rsp+rsp].)

При написании на английском языке на ассемблере естественно использовать термины с очевидными значениями, включая те, которые вы упомянули. Например,Руководство по оптимизации Intel говорит (мой акцент):

2.3.2.4 Микрооперационная очередь и детектор петлевого потока (LSD)

... (микроплавкие мопы с индексированными режимами адресации в IDQ на SnB не ламинированы)

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

Индексированные режимы адресации включают любую комбинацию, которая используетidx*scaleНезависимо от того, с базовым регистром или с disp32, или с обоими. (idx одно не кодируется;[rax*1] на самом деле кодируется какdisp32+idx*1 с участиемdisp32=0.) В какой-то момент они говорят «любой режим адресации с индексом» или подобный, иначе может быть не совсем ясно, что именно они имели в виду. Конечно,тестирование со счетчиками производительности можете проверить интерпретацию.

Но они не переусердствуют с придумыванием имен для вещей. Когда нет очевидной английской фразы, которую они могут приклеить к чему-либо, они пишут (все еще в разделе Sandybridge):

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

В таблице 2-19 они имеют два столбца, один дляBase + Offset > 2048; или жеBase + Index [+ Offset]и еще один дляBase + Offset < 2048 с задержками на 1 цикл ниже (за исключением загрузок AVX 256b). (Забавный факт,[rdi+8] задержка на 1с ниже, чем[rdi-8].)

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

В руководстве к vol.1 Intel использует некоторые термины, которые вы описываете. Они описывают режим адресации только с компонентом смещения как «прямой» (вид), и[reg] как «косвенный», потому что эти термины используются, когда речь идет о наборах команд и о том, какие режимы адресации они поддерживают.

vol.13.7.5. Задание смещения

В следующих режимах адресации предлагается использовать общие комбинации компонентов адреса.

,

Смещение alone Только смещение представляет собойнепосредственный (не вычислено) смещение операнда. Поскольку смещение закодировано в инструкции, эта форма адресаиногда называется абсолютным или статическим адресом, Обычно используется для доступа к статически распределенному скалярному операнду.

База ⎯ Одна база представляет собойкосвенный смещение операнда. ...

(Индекс * Масштаб) + Смещение ⎯ Этот режим адреса предлагает эффективный способ индексации в статический массив ...База + Индекс + Смещение ...Base + (Index ∗ Scale) + Displacement ⎯ Совместное использование всех компонентов адресации позволяет эффективно индексировать двумерный массив, когда элементы массива имеют размер 2, 4 или 8 байтов.

Но, как вы видели, они не составляют названия для более сложных форм.

Тем не менее, они различают операнды Immediate и Register против Memory. (3.7 ОПЕРАНДНАЯ АДРЕСАЦИЯ). Обычно они мало или вообще не делают различий между операндом r / m32, который использует кодировку регистров, и другим операндом, который должен быть регистром.

Терминология инструкции филиала

Прямое против косвенного также подходит для филиалов. Это немного похоже на разговор о режиме адресации для достижения байтов кода, который будет запущен следующим.

6.3.7. Функции ветвления в 64-битном режиме

...

Размеры адреса влияют на размер RCX, используемого для JCXZ и LOOP; они также влияют на вычисление адреса длякосвенная память ветви. Такие адреса являются 64-битными по умолчанию; но они могут быть переопределены до 32 бит с помощью префикса размера адреса.

Память косвенная естьjmp [rax]где конечное значение RIP берется из памяти, а не ветвь с регистром вродеjmp rax который устанавливает RIP = RAX. x86 не имеет режима адресации с косвенной памятью для загрузки / хранения; Выборка кода после перехода ветки вводит дополнительный уровень косвенности в терминологии. (вроде, как бы, что-то вроде).

Том 2ручной ввод дляjmp говорит о косвенных или относительных или абсолютных скачках. (Хотя обратите внимание, что x86 не имеет абсолютного прямоговозле переходы (поместите адрес в регистр для этого), только абсолютный дальний адрес, указанный с непосредственным указателем (ptr16:16 или жеptr16:32) или косвенно с ячейкой памяти.)

При описании непрямых скачков,jmp r/m32 (или 64), они говорят «абсолютное смещение, указанное косвенно в регистре GP или памяти». («абсолютное смещение» относительно базы сегмента CS).

Сегментация усложняет обращение к x86-адресации, особенно при сравнении специальных режимов адресации, которые могут явно включать в себя сегмент и те, которые этого не делают.

Названия режимов адресации переоценены

Гораздо проще вспомнить, что могут делать режимы адресации x86 с точки зрения подмножеств общего случая, чем запоминать все различные возможности по отдельности с такими именами, как Indexed, Based или что-то еще.

Вы видите такие вещи в уроках, какhttps://www.tutorialspoint.com/microprocessor/microprocessor_8086_addressing_modes.htm или жеhttp://www.geeksforgeeks.org/addressing-modes/ что делает большую сделку из классификации режимов адресации. У последнего даже есть тест с просьбой сопоставить операторы C с некоторыми именами в режиме адресации.

Благодаря менее гибким 16-разрядным режимам адресации их мало, и вы можете попытаться назвать их, а «На основе» и «Индексированный» фактически дает вам другой выбор регистров. Но когда вы программируете, все, что вам действительно нужно помнить, это то, что вы выбираете любое подмножество[bx|bp] + [di|si] + disp0/8/16, Вот какdi/si (индекс DST / SRC) и, возможно,bx/bp получил их имена.

Подобная терминология может быть полезна при сравнении возможностей различных ISA. Например,Википедия говорит что старые ISA, такие как PDP-8, широко использовали косвенную память, потому что у них было мало регистров и только 8-битный диапазон адресации с регистрами.

Википедия также говорит:

Обратите внимание, что не существует общепринятого способа присвоения имен различным режимам адресации.

Нет смысла придавать большое значение именам режимов. Если вы пишете что-то, убедитесь, что вы понимаете, что вы имеете в виду, не завися от конкретного технического значения определенных терминов. например если вы говорите «режим индексной адресации», убедитесь, что читатель знает из контекста, включаете ли выbase+index*scale или нет.

Интересно, возникло ли какое-то желание называть режимы 8-битными микросхемами, предшествовавшими 8086 году. Вы можете спросить об этом сноваhttps://retrocomputing.stackexchange.com/, Я не знаю много о режимах адресации, доступных на 8-битных процессорах с в основном фиксированными однобайтовыми инструкциями.

Ваш ответ на вопрос