Необработанные псевдооперации
В этом разделе перечислены псевдооперации.
Заметки
Псевдооперация |
Описание |
---|---|
PROC FRAME [:ehandler] |
Приводит к тому, что компилятор MASM создает запись в таблице функции в PDATA и раскручивает информацию в XDATA для структурной обработки исключений функции при раскрутке.При наличии обработчика ошибок данная процедура вводится в XDATA как языковой обработчик. При использовании атрибута FRAME за ним обязательно должна следовать директива .ENDPROLOG.Если функция является конечной (в соответствии с разделом Типы функций), атрибут FRAME является необязательным, так же как и остатки этих псевдоопераций. |
.PUSHREG reg |
Создает в коде завершения UWOP_PUSH_NONVOL запись для указанного номера регистра с помощью текущего смещения в прологе. Следует применять эту операцию только к защищенным целочисленным регистрам.Для передачи временных регистров следует использовать ALLOCSTACK 8. |
.SETFRAME reg, offset |
Заполняет поле регистра для фреймов и указывает смещение в информации для раскрутки с помощью указанного регистра и смещения.Смещение должно быть кратным 16 и меньшим или равным 240.Данная директива также создает в коде завершения UWOP_SET_FPREG запись для указанного регистра с помощью текущего смещения в прологе. |
.ALLOCSTACK size |
Создает код UWOP_ALLOC_SMALL или UWOP_ALLOC_LARGE с указанным размером текущего смещения в прологе. Операнд size должен быть кратным 8. |
.SAVEREG reg, offset |
Создает запись в коде завершения UWOP_SAVE_NONVOL или UWOP_SAVE_NONVOL_FAR для указанного регистра и смещения, используя текущее смещение в прологе.Компилятор MASM выберет наиболее подходящий способ кодировки. Смещение должно иметь положительное значение и быть кратным 8.Смещение указывается относительно кадра процедуры (как правило, в RSP) или указателя на кадр (немасштабированный). |
.SAVEXMM128 reg, offset |
Создает запись в коде завершения UWOP_SAVE_XMM128 или UWOP_SAVE_XMM128_FAR для указанного регистра XMM и смещения, используя текущее смещение в прологе.Компилятор MASM выберет наиболее подходящий способ кодировки. Смещение должно иметь положительное значение и быть кратным 16.Смещение указывается относительно кадра процедуры (как правило, в RSP) или указателя на кадр (немасштабированный). |
.PUSHFRAME [код] |
Создает запись в коде завершения UWOP_PUSH_MACHFRAME.Если указан дополнительный код, к записи в код завершения добавляется модификатор 1.В противном случае используется модификатор 0. |
.ENDPROLOG |
Сообщает об окончании объявлений в прологе.Находится в первых 255 байтах функции. |
Ниже представлен пример пролога функции, демонстрирующий допустимое использование большинства кодов операций.
sample PROC FRAME
db 048h; emit a REX prefix, to enable hot-patching
push rbp
.pushreg rbp
sub rsp, 040h
.allocstack 040h
lea rbp, [rsp+020h]
.setframe rbp, 020h
movdqa [rbp], xmm7
.savexmm128 xmm7, 020h;the offset is from the base of the frame
;not the scaled offset of the frame
mov [rbp+018h], rsi
.savereg rsi, 038h
mov [rsp+010h], rdi
.savereg rdi, 010h; you can still use RSP as the base of the frame
; or any other register you choose
.endprolog
; you can modify the stack pointer outside of the prologue (similar to alloca)
; because we have a frame pointer.
; if we didn’t have a frame pointer, this would be illegal
; if we didn’t make this modification,
; there would be no need for a frame pointer
sub rsp, 060h
; we can unwind from the following AV because of the frame pointer
mov rax, 0
mov rax, [rax] ; AV!
; restore the registers that weren’t saved with a push
; this isn’t part of the official epilog, as described in section 2.5
movdqa xmm7, [rbp]
mov rsi, [rbp+018h]
mov rdi, [rbp-010h]
; Here’s the official epilog
lea rsp, [rbp-020h]
pop rbp
ret
sample ENDP