структура UNWIND_CODE
Массив кода раскрутки используется для записи последовательности операций в прологе, оказывающих влияние на энергонезависимые регистры и RSP.Каждый элемент кода имеет следующий формат:
UBYTE |
Смещение в прологе |
UBYTE: 4 |
Код операции очистки |
UBYTE: 4 |
Сведения об операции |
Элементы массива располагаются в убывающем порядке в соответствии с положением в прологе.
Смещение в прологе
Смещение от начала пролога конца инструкции, которая выполняет данную операцию, плюс 1 (это расположение следующей инструкции).Код завершающей операции
Примечание. В кодах некоторых операций необходимо использовать смещение без учета знака в качестве значения в локальном кадре стека.Это смещение отсчитывается от начала (нижнего адреса) выделенного фиксированного пространства стека.Если поле регистра кадра стека в структуре UNWIND_INFO является пустым, то смещение отсчитывается от RSP.Если поле регистра кадра стека не является пустым, смещение отсчитывается от расположения RSP в момент установки регистра FP.Оно рассчитывается как регистр FP минус смещение регистра FP (16 * масштабированное смещение регистра кадра стека в UNWIND_INFO).При использовании регистра FP любой код раскрутки со смещением должен использоваться только после установки в прологе регистра FP.Для всех кодов операций кроме UWOP_SAVE_XMM128 и UWOP_SAVE_XMM128_FAR смещение будет кратным 8, поскольку хранимые в стеке значения выравниваются до 8 байт (сам стек всегда выравнивается до 16 байт).Для кодов операций с коротким смещением (менее 512 Кбайт) завершающий USHORT в узлах кода содержит смещение, разделенное на 8.Для кодов операций с длинным смещением (от 512 Кбайт до 4 Гбайт) два завершающих узла USHORT кода содержат смещение (с прямым порядком следования байтов).
Для кодов операций UWOP_SAVE_XMM128 и UWOP_SAVE_XMM128_FAR смещение будет кратным 16, поскольку все 128-битные операции XMM должны выполняться в памяти, выровненной до 16 байт.Поэтому для операции UWOP_SAVE_XMM128 используется масштабный коэффициент 16, который позволяет использовать смещение до 1 МБ.
Кодом завершающей операции может быть:
узел UWOP_PUSH_NONVOL (0)1
Отправка энергонезависимого регистра целых чисел с уменьшением значения RSP в 8 раз.Значение в поле сведений об операции является числом регистра.Обратите внимание, что из-за ограничений, накладываемых на эпилог, коды раскрутки UWOP_PUSH_NONVOL должны использоваться первыми в прологе и, соответственно, последними в массиве кодов раскрутки.Этот относительный порядок применяется ко всем другим кодам раскрутки операций, за исключением UWOP_PUSH_MACHFRAME.
Узлы UWOP_ALLOC_LARGE (1)2 или 3
Выделение для стека большого объема памяти.Существуют два варианта.Если в поле сведений об операции содержится значение ноль, в соседнюю ячейку записывается размер выделенной памяти, поделенный на 8.Если в поле сведений об операции содержится значение 1, то в следующие две ячейки записывается размер выделенной памяти без масштабирования с прямым порядком следования байтов. Это позволяет выделять до 4 ГБ - 8.
узел UWOP_ALLOC_SMALL (2)1
Выделение для стека небольшого объема памяти.Размер выделения рассчитывается как число в поле сведений об операции * 8 + 8, что позволяет выделять от 8 до 128 байт.
Код раскрутки должен всегда использовать наиболее короткую кодировку для выделения памяти в стеке.
Размер выделения
Код раскрутки
От 8 до 128 байт
UWOP_ALLOC_SMALL
От 136 до 512 КБ - 8 байт
UWOP_ALLOC_LARGE, operation info = 0
От 512 КБ до 4 ГБ – 8 байт
UWOP_ALLOC_LARGE, operation info = 1
узел UWOP_SET_FPREG (3)1
Установите регистр указателя кадра стека, задав для регистра какое-либо смещение текущего RSP.Это смещение рассчитывается как значение (масштабированное) смещения в поле регистра указателя кадра стека UNWIND_INFO * 16, что разрешает смещение со значением от 0 до 240.Использование смещения позволяет установить указатель кадра стека по центру фиксированного выделения стека, что способствует повышению плотности кода и разрешает использовать большее количество форм коротких инструкций.Обратите внимание, что поле сведений об операции является зарезервированным и не должно использоваться.
UWOP_SAVE_NONVOL (4)2 узла
Сохраните энергонезависимый регистр целых чисел в стеке, используя функцию MOV вместо PUSH.Как правило, она применяется для создания изолированного кода, при котором энергонезависимый регистр сохраняется в стеке в том положении, которое было ранее выделено.Значение в поле сведений об операции является числом регистра.Смещение стека (масштабированное по 8) записывается в следующей ячейке кода завершающей операции, как описано выше в примечании.
Узлы UWOP_SAVE_NONVOL_FAR (5)3
Сохраните энергонезависимый регистр целых чисел в стеке с длинным смещением, используя функцию MOV вместо PUSH.Как правило, она применяется для создания изолированного кода, при котором энергонезависимый регистр сохраняется в стеке в том положении, которое было ранее выделено.Значение в поле сведений об операции является числом регистра.Смещение стека (немасштабированное) записывается в следующих двух ячейках кода завершающей операции, как описано выше в примечании.
Узлы UWOP_SAVE_XMM128 (8)2
Сохраните все 128 байт энергонезависимого регистра XMM в стеке.Значение в поле сведений об операции является числом регистра.Смещение стека (масштабированное на 16) записывается в следующую ячейку.
Узлы UWOP_SAVE_XMM128_FAR (9)3
Сохраните все 128 байт энергонезависимого регистра XMM в стеке с длинным смещением.Значение в поле сведений об операции является числом регистра.Смещение стека (немасштабированное) записывается в следующие две ячейки.
узел UWOP_PUSH_MACHFRAME (10)1
Передача машинного кадраИспользуется для записи воздействия аппаратного вмешательства или исключения.Существуют два варианта.Если в поле сведений об операции значение ноль, значит в стек были переданы следующие данные:
RSP+32
SS
RSP+24
Old RSP
RSP+16
EFLAGS
RSP+8
CS
RSP
RIP
Если в поле сведений об операции значение "1", значит в стек были переданы следующие данные:
RSP+40
SS
RSP+32
Old RSP
RSP+24
EFLAGS
RSP+16
CS
RSP+8
RIP
RSP
Код ошибки.
Этот код раскрутки должен всегда присутствовать в фиктивном прологе, который никогда не выполняется, но присутствует перед реальной точкой входа подпрограммы прерывания и существует, только чтобы предоставить место для имитации передачи машинного кадра.UWOP_PUSH_MACHFRAME записывает эту имитацию, что означает, что компьютер концептуально выполнил следующее:
Перемещение обратного адреса RIP с вершины стека в Temp
Передача SS
Передача old RSP
Передача EFLAGS
Передача CS
Передача Temp
Передача кода ошибки (если в поле сведений об операции значение "1")
Смоделированная операция UWOP_PUSH_MACHFRAME уменьшает RSP на 40 (если в поле сведений об операции значение "0") или 48 (если в поле сведений об операции значение "1")
Сведения об операции
Значение этих 4 байт зависит от кода операции.Чтобы выполнить кодирование регистра (целых чисел) общего назначения, используется следующее сопоставление.0
RAX
1
RCX
2
RDX
3
RBX
4
RSP
5
RBP
6
RSI
7
RDI
От 8 до 15
Запросы из R8 в R15
См. также
Ссылки
Данные раскрутки для обработки исключений и поддержки отладчика