Поделиться через


Необработанные псевдооперации

В этом разделе перечислены псевдооперации.

Заметки

Псевдооперация

Описание

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

См. также

Ссылки

Завершение вспомогательных процедур для MASM