Названия регистров для работы с плавающей точкой в Intel 64:
XMM0-XMM15
ST0-ST7
MM0-MM7
X87 FPU Control Word
X87 FPU Status Word
X87 FPU Tag Word
X87 FPU Data Pointer
X87 FPU Instruction Pointer
XMM11 это один из (16-ти) "векторных регистров", имеет размер 128 бит (16 байт).
Может использоваться для хранения (?) двух целых чисел или двух чисел с плавающей точкой.
Группа операций процессора называется Streaming SIMD Extensions.
Стандарт, описывающий побитовую раскладку называется IEEE 754.
sinxx %XMM11, %XMM12
инструкция movaps позволяет перемещать данные из одного 128-битного регистра в другой, или в память.
«Moves 4, 8 or 16 single-precision floating-point values from the source operand to the destination operand»
movaps %XMM11, [rsp+offset]
Пример (неудачный) документации:
https://www.felixcloutier.com/x86/movaps
operand is a memory operand, the operand must be aligned on a 16-byte (128-bit version), 32-byte (VEX.256 encoded version) or 64-byte (EVEX.512 encoded version) boundary or a general-protection exception (#GP) will be generated.
Чем плоха эта документация:
1) команда описывается в обобщённом виде. Мне не надо знать про все варианты. Мне нужно понятное объяснение:
- как записывать инструкцию
- на что в записи надо обращать внимание (из каких частей её собирать)
- какими битами кодируется результат и как это делается
- какой эффект вызывает инструкция (что где изменяется)
Не смысла экономить и снижать количество HTML-страниц. Можно сгенерировать описание для каждой отдельной инструкции, а так же обобщённое описание, всё на разных страницах.
2) алгоритм преобразования разбросан где-то и его будет не просто собрать воедино даже для ChatGPT (я пробовал, результата добиться не удалось).
3) использованные части, слова и понятия не определены. А ведь не сложно было добавить по гиперссылке на описание каждого слов, места на экране гиперссылки много не занимают.
Помогает ли wiki, как движок?
https://en.wikipedia.org/wiki/MOVAPD
The source operand can be either an XMM register (xmm2) or a memory address (m128).
The destination operand can be either an XMM register (xmm1) or a memory address (m128).
m128 — A memory double quadword operand in memory.
Ну хорошо, а чем m128 отличается от номера регистра? Или какая связь с адресом в памяти, там же не непосредственное значение?
Вот ещё описание:
https://c9x.me/x86/html/file_module_x86_id_180.html
здесь лучше, привели бинарный код инструкции:
0F 28 /r
не всё равно недостаточно объяснили его.
Объясняется ли как формируются биты этого "/r" ? Нет, на этой странице не объясняются и нет гиперссылки куда надо.
Эту /r они скопировали из руководства Intel.
«/r — Indicates that the ModR/M byte of the instruction contains a register operand and an r/m operand.»
(Cтраница 574 английской версии руководства)
Лично мне всё равно непонятно, как тут биты записывать.
MOVAPD—Move Aligned Packed Double-Precision Floating-Point Values
66 0F 28 /r
MOVAPD xmm1, xmm2/m128
66 0F 29 /r
MOVAPD xmm2/m128, xmm1
https://shell-storm.org/x86doc/MOVAPS.html
Страница хороша тем, что на ней есть некоторое подобие псевдоалгоритма:
MOVAPS (128-bit load- and register-copy- form Legacy SSE version)
DEST[127:0] (cid:197) SRC[127:0]
DEST[MAX_VL-1:128] (Unmodified)
Но получается, что это ещё язык, который надо изучать.
(и как обычно, нет гиперссылок, для обучения не подходит).
https://stackoverflow.com/questions/667 … structions
Сообщают, что инструкция кодируется тремя байтами. Это хорошо.
Рекомендуют прочитать:
- Intel Optimization Manual
- Agner Fog, microarchitecture guide
(это просто "на память").
Есть ещё табличка:
Instruction Operand Encoding
Op/En Operand 1 Operand 2
RM ModRM:reg (w) ModRM:r/m (r)
MR ModRM:r/m (w) ModRM:reg (r)
Тут предполагается, что читающий знает:
1) как кодируются регистры
2) как кодируется байт ModRM, как добавляется адрес памяти
это "режим адресации".
(гиперссылки, конечно, нет)
https://stackoverflow.com/questions/150 … e-notation
xmm/m128 — An XMM register or a 128-bit memory operand. The 128-bit XMM registers are XMM0 through XMM7; XMM8 through XMM15 are available using REX.R in 64-bit mode. The contents of memory are found at the address provided by the effective address computation.
(это цитата со страницы 578 руководства)
Тут уже чуть понятнее, но опять же нет ссылки на описание "effective address computation".
«An effective-address calculation uses a 64-bit base and index registers and sign-extend displacements to 64 bits.»
Это страница 74 руководства.
«Generally, displacements and immediates in 64-bit mode are not extended to 64 bits. They are still limited to 32
bits and sign-extended during effective-address calculations. In 64-bit mode, however, support is provided for 64-
bit displacement and immediate forms of the MOV instruction.»
Там же. Здесь я просто не понял, что написано. каким образом этот support провайдится?
Отредактировано Лис (2023-02-24 07:11:51)