From 2f1c3787dd3f5671041e5decf2ba2f247608466c Mon Sep 17 00:00:00 2001 From: Miheev Egor Date: Tue, 17 Sep 2024 18:29:06 +0300 Subject: [PATCH] =?UTF-8?q?sync(README)[02]:=20=D0=B2=D0=BA=D0=B8=D0=BD?= =?UTF-8?q?=D1=83=D1=82=D0=BE=20=D0=BD=D0=B5=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=BF=D1=80=D0=B5=D1=84=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D1=81=D1=83=20REX=20=D0=B8=20=D0=BD=D1=8B=D1=82=D1=8C=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=B4=D1=80=D1=83=D0=B3=D0=B8=D0=BC=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2=D0=BE=D0=B4=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 02-cpu-commnads/README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/02-cpu-commnads/README.md b/02-cpu-commnads/README.md index e502143..b81fcf0 100644 --- a/02-cpu-commnads/README.md +++ b/02-cpu-commnads/README.md @@ -2,3 +2,27 @@ ## Система команд процессора, ее связь с кодами команд +## Кодирование команд для x86-64 архитектуры + +Преподаватель на ресурсном курсе оставил огромный талмуд Intel на тему того, как кодируются команды у их процессоров. И пусть даже наш дорогой препод на лекции дал пояснения по конверсии и прочему, он оставил без ответа вопросы следующего толка: когда какие байты задействованы, где посмотреть опкоды команд и прочие мелочи жизни. Я тот еще программист, поэтому на меня тут не надейтесь, но помогу чем смогу + +Перво-наперво структура команды. Приведена она и у препода и в талмудике Intel, повторяться не хочу, но картинку оставлю + +![Структура команд](../assets/command_structure.png) + +На этой же картинке видно, что может быть от разное количество байт на КОП, на Displacement, на Immediate и прочем. Да и еще проскакивают надписи `(if required)` и `(optional)`. Вопрос назревает сам собой - а где смотреть-то. И ответ у меня к сожалению не утешительный - в том самом великом и ужасном талмудике от Intel (по крайней мере я не нашел другого способа понадежнее). Но тут есть одна так сказать проблемка... Таблички по командам Intel выглядят мягко скажем как-то так... + +![Пример таблицы опкода](../assets/opcode_table_example.png) + +Хтонь лично на мой взгляд довольно неприятная, но на самом деле она не так страшна, как вы подумали... Она значительно хуже... + +Пояснительную бригаду относительно суффиксов, префиксов, буковок и циферок, которые в табличке есть мы можем найти в начале (~44 страница). С вашего позволения я просто повторю то, что там написано с незанчительными комментариями + +- `REX.W` - Показывает, что REX префикс затрагивает размер операндов или меняет значение инструкции. Подробнее об этом они писали во второй главе. Учтите, что префиксы REX, которые повышают инструкции до работы с 64 битами не приводятся явно в колонке opcode. + +### Чутка про префикс REX + +Судя по всему, префикс REX стал почти обязателен при переходе на 64 разряда. Что ж, это не удивительно, так как в 64-разрядных системах прибавилось регистров, а их номера нужно где-то и как-то хранить, поэтому это вот такой вот "костылик". На самом деле в талмудике преведены схемы всех подключений, которые я пока не привожу, потому что это не самое главное, но может потом добавлю + +Вот что они пишут про префик REX во второй главе своего талмуда: "Префикс REX указывается не всегда в 64-разрядном режиме. Он необходим только тогда, когда инструкция адресуется к одному из рассширенных регистров или использует 64-разрядные операнды". То есть условно говоря если работам с 64 разрядами, то RAX нужен, а если нет - его может и не быть, если явно не сказано иное. Сами же REX - это 16 опкодов, которые берут пространство от 0x40 до 0x4F. В режиме режиме обратной совместимости и IA-32 отражают опкоды реальных инструкций, но нас естественно интересует режим 64 разрядов, а в нем они как отдельная инструкция не трактуются и идут только в связке. Также почему-то интел сокрушаются, что из-за этого однобайтовый опкод для инкреммента и декремента перестал существовать в 64 разрядных системах +