- •3.3. Организация памяти
- •3.3.1 Модели памяти ia-32
- •3.3.2 Пейджинг и виртуальная память
- •3.3.3 Организация памяти в 64-битном режиме
- •3.3.4. Режимы работы против модели памяти
- •3.3.6 Расширенная физическая адресация в защищенном режиме
- •3.3.7 Расчет адресов в 64-битном режиме
- •3.3.7.1 Каноническая адресация
- •3.4 Основные регистры выполнения программы
- •3.4.1 Регистры общего назначения
- •3.4.1.1 Регистры общего назначения в 64-битном режиме
- •3.4.2 Регистры сегментов
- •3.4.2.1 Регистры сегментов в 64-битном режиме
- •3.4.3.1 Флаги состояния
- •3.4.3.2 Флаг df
- •3.4.3.3 Системные флаги и поле iopl
- •3.7.2 Операнды регистров
- •3.7.5. Определение смещения
- •3.7.5.1 Определение смещения в 64-битном режиме
- •3.7.6 Режимы адресации ассемблера и компилятора
- •3.7.7 Адресация портов ввода / вывода
3.4.1.1 Регистры общего назначения в 64-битном режиме
В 64-битном режиме имеется 16 регистров общего назначения, а размер операнда по умолчанию - 32 бита. Однако регистры общего назначения могут работать либо с 32-битными, либо с 64-битными операндами. Если указан размер 32-разрядного операнда: доступны EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP, R8D-R15D. Если указан размер 64-разрядного операнда: доступны RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8-R15. R8D-R15D / R8-R15 представляют восемь новых регистров общего назначения. Доступ к этим регистрам можно получить на уровне байта, слова, слова и уровня qword. Префиксы REX используются для генерации 64-разрядных операндов или для ссылок на регистры R8-R15.
Регистры, доступные только в 64-битном режиме (R8-R15 и XMM8-XMM15), сохраняются на переходах из 64-разрядного режима в режим совместимости, а затем обратно в 64-разрядный режим. Однако значения R8-R15 и XMM8-XMM15 не определены после переходов из 64-битного режима через режим совместимости в прежний или реальный режим, а затем обратно через режим совместимости в 64-разрядный режим.
Таблица 3-2. Адресные регистры общего назначения
Тип регистра |
Without Rex |
With REX |
Byte register |
AL, BL, CL, DL, AH, BH, CH, DH |
AL, BL, CL, DL, DIL, SIL, BPL, SPL, R8L - R15L |
Word register |
AX, BX, CX, DX, DI, SI, BP, SP |
AX, BX, CX, DX, DI, SI, BP, SP, R8W - R15W |
Doubleword register |
EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP |
EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP, R8D - R15D |
Quadword register |
N.A. |
RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8 - R15 |
В 64-битном режиме существуют ограничения на доступ к байтовым регистрам. Инструкция не может ссылаться на устаревшие высокие байты (например: AH, BH, CH, DH) и один из новых байтовых регистров одновременно (например: младший байт регистра RAX). Однако инструкции могут ссылаться на старые байты с низким байтом (например: AL, BL, CL или DL) и новые байтовые регистры одновременно (например: младший байт регистра R8 или RBP). Архитектура применяет это ограничение, изменяя высокобайтовые ссылки (AH, BH, CH, DH) на ссылки с низким байтом (BPL, SPL, DIL, SIL: низкие 8 бит для RBP, RSP, RDI и RSI) для инструкций с использованием Префикс REX.
Когда в 64-битном режиме размер операнда определяет количество действительных битов в целевом регистре общего назначения:
• 64-разрядные операнды генерируют 64-битный результат в целевом регистре общего назначения.
• 32-разрядные операнды генерируют 32-битный результат с нулевым расширением до 64-битного результата в целевом регистре общего назначения.
• 8-битные и 16-разрядные операнды генерируют 8-битный или 16-разрядный результат. Верхние 56 бит или 48 бит (соответственно) целевого регистра назначения не изменяются операцией. Если результат 8-разрядной или 16-разрядной операции предназначен для вычисления 64-разрядного адреса, явным образом выставляю регистр до полного 64-битного.
Поскольку верхние 32 бита 64-разрядных регистров общего назначения не определены в 32-битных режимах, верхние 32 бита любого универсального регистра не сохраняются при переходе из 64-разрядного режима в 32-разрядный (для защищенного режим или режим совместимости). Программное обеспечение не должно зависеть от этих битов для поддержания значения после переключения с 64-битного до 32-битного режима
