Macros MASM
Para simplificar o uso de Pseudo-operações brutas, há um conjunto de macros, definido em ksamd64.inc, que pode ser usado para criar prólogos e epílogos típicos de procedimento.
Comentários
Macro |
Descrição |
---|---|
alloc_stack (n) |
Atribui um quadro de pilha de bytes de n (usando o rsp new, n), e se chama o apropriado desenrola informações .allocstack (n) |
registro de save_reg, lugar |
Salva um registro permanente de registro na pilha no lugar do deslocamento de RSP, e o emite-se apropriado desenrolam informações.(registro de .savereg, lugar) |
registro de push_reg |
Pressiona um registro permanente de registro na pilha, e o emite-se apropriado desenrolam informações.(registro de .pushreg) |
registro de rex_push_reg |
Salvar um registro permanente na pilha usando um envio de 2 bytes, e o emite-se apropriado desenrolam informações (registro de .pushreg) que isso deve ser usado se o enviar é a primeira instrução na função para garantir que a função está quente - patchable. |
save_xmm128 registro, lugar |
Salva um registro permanente de registro de MMX na pilha no lugar do deslocamento de RSP, e o emite-se apropriado desenrolam informações (registro .savexmm128, o lugar) |
registro de set_frame, deslocamento |
Define o registro de registro do quadro para ser deslocado RSP + (usando um movimento, ou pasto), e o emite-se apropriado desenrolam informações (registro de .set_frame, o deslocamento) |
push_eflags |
Pressiona os eflags com uma instrução de pushfq, e o emite-se apropriado desenrolam informações .alloc_stack (8) |
Aqui está um prólogo de função de exemplo com uso adequado de macros:
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