Макросы MASM
Для упрощения использования операций, описанных в разделе Необработанные псевдооперации, в файле ksamd64.inc определен набор макросов, которые можно использовать для создания типичных прологов и эпилогов процедур.
Заметки
Макрос |
Описание |
---|---|
alloc_stack(n) |
Выделяет кадр стека размером в n байт (с помощью команды "sub rsp, n") и помещает соответствующую информацию для раскрутки (".allocstack b"). |
save_reg reg, loc |
Сохраняет защищенный регистр "reg" в стеке по RSP-смещению "loc" и помещает соответствующую информацию для раскрутки(".savereg reg, loc"). |
push_reg reg |
Сохраняет защищенный регистр "reg" в стеке и помещает соответствующую информацию для раскрутки(".pushreg reg"). |
rex_push_reg reg |
Сохраните слаболетучий регистр в стеке использование внедрения 2 байт, и выведите соответствующее размотайте сведения (reg .pushreg) это должно использоваться, если внедрения первая инструкция в функции убедиться, что функция высокий - patchable. |
save_xmm128 reg, loc |
Сохраняет защищенный XMM-регистр "reg" в стеке по RSP-смещению "loc" и помещает соответствующую информацию для раскрутки (".savexmm128 reg, loc"). |
set_frame reg, offset |
Присваивает регистру стекового кадра "reg" значение RSP + offset (с помощью команды mov или lea) и помещает соответствующую информацию для раскрутки (".set_frame reg, offset"). |
push_eflags |
Сохраняет регистр "eflags" в стек с помощью команды pushfq и помещает соответствующую информацию для раскрутки (".alloc_stack 8"). |
Ниже представлен пример пролога функции, в котором должным образом используются описанные макросы.
SkFrame struct
Fill dq ?; fill to 8 mod 16
SavedRdi dq ?; saved register RDI
SavedRsi dq ?; saved register RSI
SkFrame ends
sampleFrame struct
Filldq?; fill to 8 mod 16
SavedRdidq?; Saved Register RDI
SavedRsi dq?; Saved Register RSI
sampleFrame ends
sample2 PROC FRAME
alloc_stack(sizeof sampleFrame)
save_reg rdi, sampleFrame.SavedRdi
save_reg rsi, sampleFrame.SavedRsi
.end_prolog
; function body
mov rsi, sampleFrame.SavedRsi[rsp]
mov rdi, sampleFrame.SavedRdi[rsp]
; Here’s the official epilog
add rsp, (sizeof sampleFrame)
ret
sample2 ENDP