
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.170] |
![]() |
|
![]() |
|
|
Всем привет!
Решил себе для памяти составить "Шпаргалку по регистрам x86-64". Прошу ознакомится, может чего добавить можно, или указать на ошибки ![]() 1.1. Регистры общего назначения 16 регистров, которые могут использоваться для хранения данных и адресов: RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP, R8 — R15 1.2. Регистры сегментов CS, DS, ES, FS, GS, SS: 16-битные регистры в 64-разрядных системах в основном не используются так, как это было в 16- или 32-разрядных системах, благодаря плоской модели памяти, где вся память доступна как единое пространство. Однако регистры FS и GS все еще имеют значение и могут использоваться для специфических задач, связанных с многопоточностью и управлением памятью. 1.3. Регистры состояния Эти регистры используются для управления состоянием процессора и выполнения инструкций: RFLAGS: Регистр состояния, который содержит флаги, указывающие на результат арифметических операций и состояние процессора. 1.4. Регистры SIMD и операций с плавающей точкой Для работы с векторными данными и параллельными вычислениями используются регистры SIMD (Single Instruction, Multiple Data): ST0 — ST7: 80-битные регистры FPU, используемые для выполнения операций с плавающей точкой в формате x87. Эти регистры могут хранить числа с плавающей точкой в формате IEEE 754, что позволяет выполнять высокоточные вычисления. MM0 — MM7: 64-битные регистры используются для выполнения операций с целыми числами. 🖐 По поводу ST* и MM* запилил отдельный топик! XMM0 — XMM15: 128-битные регистры, используемые для операций с плавающей точкой и целыми числами. YMM0 — YMM15: 256-битные регистры, которые расширяют XMM-регистры и используются в инструкциях AVX (Advanced Vector Extensions). ZMM0 — ZMM31: 512-битные регистры, которые используются в современных процессорах, поддерживающих AVX-512, для выполнения различных операций, включая арифметические, логические и операции с плавающей точкой. 1.5. Специальные регистры Существуют также специальные регистры, которые используются для управления памятью и выполнения операций: CR0 — CR4: 64-битные регистры управления, используемые для управления режимами работы процессора и управления памятью. DR0 — DR7: 64-битные регистры отладчика и тестирования играют важную роль в отладке программ и управлении виртуальной памятью. TR3 — TR7: 64-битные регистры используются для управления тестированием и отладкой в системах с поддержкой виртуальной памяти. ДЛЯ МНОГИХ РЕГИСТРОВ ПРЕДУСМОТРЕН 32-БИТНЫЙ ДОСТУП (К МЛАДШЕЙ ЧАСТИ) |
Сообщ.
#2
,
|
|
|
Цитата Majestio @ CS, DS, ES, FS, GS, SS: 16-битные регистры в 64-разрядных системах в основном не используются так, как это было в 16- или 32-разрядных системах, благодаря плоской модели памяти, где вся память доступна как единое пространство. Однако регистры FS и GS все еще имеют значение и могут использоваться для специфических задач, связанных с многопоточностью и управлением памятью. 16-битные регистры указателей сегмента или селекторы в GDT/LDT таблицах c 64-битной или 128-битной теневой частью, содержащей базовый адрес начала сегмента. В 64-битных системах не доступны (там чисто физически значения префиксов сегментов CS/DS/ES/SS в системе команд помечены как недействительные операции), кроме FS и GS, но есть аналоги для CS и DS в MSR регистрах. IDRT, GDTR - 64-битные указатели на логические адреса расположения таблиц прерываний и описателей блоков сегментов и шлюзов LDTR - 16-битный селектор в GDT для LDT c 64-битной или 128-битной теневой частью (в теневые части подгружается запись из таблицы для подавления лишних обращений к памяти) TR - 16-битный селектор текущей TSS c 64-битной или 128-битной теневой частью (Task state segment - аппаратное описание состояния текущей задачи (только регистры общего назначения, но можно до сохранять через FXSAVE и остальное). Цитата Majestio @ RFLAGS: Регистр состояния, который содержит флаги, указывающие на результат арифметических операций и состояние процессора. +FSW регистр состояния FPU FCW регистр управления FPU (для RFLAGS биты управления и состояния смешаны, а у FPU разнесены на 2 разных) Цитата Majestio @ ST0 — ST7: 80-битные регистры FPU, используемые для выполнения операций с плавающей точкой в формате x87. Эти регистры могут хранить числа с плавающей точкой в формате IEEE 754, что позволяет выполнять высокоточные вычисления. MM0 — MM7: 64-битные регистры используются для выполнения операций с целыми числами. +MM0 - MM7 занимают тот же блок регистров что и ST0 - ST7 и для использования первых необходима команда FINIT, а для вторых EMMS (это не относится к XMM0-XMM15 Цитата Majestio @ CR0 — CR4: 64-битные регистры управления, используемые для управления режимами работы процессора и управления памятью. Еще CR7 (CR0-CR4,CR7) |
Сообщ.
#3
,
|
|
|
Благодарю!!!
![]() Я писал "по-верхам". Буду постепенно вычитывать и дополнять/исправлять. |
Сообщ.
#4
,
|
|
|
Цитата macomics @ Еще CR7 (CR0-CR4,CR7) Нашел какую-то противоречивую инфу по этому: Цитата 1) В архитектуре x86/x86-64 регистры управления (Control Registers, CR) используются для управления режимами работы процессора, виртуализацией, защитой памяти и другими системными функциями. Основные регистры управления — это CR0, CR1, CR2, CR3, CR4, CR8 (в 64-битном режиме). Однако не все из них доступны или используются в современных процессорах. Цитата 2) В некоторых процессорах (например, Intel) могут быть дополнительные регистры управления, такие как CR5–CR7, но они зарезервированы и не используются. В документации Intel и AMD указано, что попытка доступа к этим регистрам вызовет исключение #UD (Invalid Opcode). Где бы официальные доки почитать? |
Сообщ.
#5
,
|
|
|
https://disk.yandex.ru/d/rFcZy963E67vAg
На англ. Но официальнее некуда. Я по памяти писал. Там и правда CR8 Еще у меня очепятка в IDRT. Должно быть IDTR |
Сообщ.
#6
,
|
|
|
Цитата macomics @ https://disk.yandex.ru/d/rFcZy963E67vAg На англ. Но официальнее некуда. Я по памяти писал. Там и правда CR8 Еще у меня очепятка в IDRT. Должно быть IDTR Еще раз - благодарочка! ![]() ЗЫ: Далеко не убегай - ты ещё тут нужен мало-мало ![]() Добавлено Цитата macomics @ +MM0 - MM7 занимают тот же блок регистров что и ST0 - ST7 и для использования первых необходима команда FINIT, а для вторых EMMS (это не относится к XMM0-XMM15 По этому вопросу запилил отдельный топик - также просьба почекать ![]() |
![]() |
Сообщ.
#7
,
|
|
Список регистров можно найти вот тут: https://en.wikipedia.org/wiki/X86#32-bit
Картинка: https://upload.wikimedia.org/wikipedia/comm...gisters_svg.svg Но тут отсутствуют как минимум: • Расширение AVX-512: K0-K7 • XCR0 (Extended Control Register не имеет ничего общего с CR0) • Расширение MPX: BND0-BND3, BNDCFGU, BNDSTATUS • Расширение AMX: TMM0-TMM7 (они же TILEDATA), TILECFG • PKRU (Protection Key Rights for User Pages) • MSR-регистры (их сотни, часть из них доступны через инструкции типа RDPID и пр.) Вот тут я ещё составлял список когда-то: https://www.cyberforum.ru/showthread.php?p=12316722 (регистра MXCSR_MASK на самом деле нет). Хороший способ найти все регистры — открыть раздел 13 тома 1 Intel SDM. P.S. Кстати, возможно, у AMD тоже есть какие-то свои специфичные регистры. Добавлено Цитата Majestio @ А ещё к 16-битной и 8-битной (причём, к 2-м 8-битным: младший байт и старший байт младшего слова).ДЛЯ МНОГИХ РЕГИСТРОВ ПРЕДУСМОТРЕН 32-БИТНЫЙ ДОСТУП (К МЛАДШЕЙ ЧАСТИ) ![]() ![]() [ RAX ] [ EAX ] [ AX ] [AL][AH] Добавлено Для статей, кстати, у нас есть раздел Assembler FAQ |
Сообщ.
#8
,
|
|
|
Цитата Jin X @ Для статей, кстати, у нас есть раздел Assembler FAQ Пасибище!!! Будем изучять ![]() ![]() Цитата Jin X @ А ещё к 16-битной и 8-битной Да-да, я это еще с TASM помню, исправлю) |
Сообщ.
#9
,
|
|
|
Jin X, судя по картинке ZMM, YMM, XMM от 0 до 15 тоже используют разделяемые регистры? |
![]() |
Сообщ.
#10
,
|
|
Цитата Majestio @ Да, XMM – это младшие 128 бит от YMM / ZMM.ZMM, YMM, XMM от 0 до 15 тоже используют разделяемые регистры? Более того, например, AVX / AVX-512 инструкция vmulss (произведение скалярных значений в векторах) работает только с регистрами xmm, потому что делать версию с регистрами большего размера просто нет смысла, т.к. используется только младшие 32 бита. В 32-битном коде доступны только 8 XMM/YMM/ZMM-регистров, а в 64-битном — 16 XMM/YMM при работе с SSE/AVX и 32 XMM/YMM/ZMM при работе с AVX-512. |