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


Макросы 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

Сохраняет защищенный регистр в стеке, используя двухбайтовую инструкцию push, и помещает соответствующую информацию для раскрутки (".pushreg reg"). Этот макрос следует использовать, чтобы обеспечить возможность горячего обновления данной функции.

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

См. также

Ссылки

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