Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Para simplificar el uso de las Pseudoperaciones sin formato, existe un conjunto de macros, definidas en ksamd64.inc, que se pueden usar para crear prólogos y epílogos típicos de procedimientos.
Comentarios
Macro |
Descripción |
|---|---|
alloc_stack(n) |
Asigna un marco de pila de n bytes (utilizando sub rsp, n) y emite la información de desenredo apropiada (.allocstack n) |
save_reg registro, ubicación |
Guarda un registro del registro no variable en la pila en la ubicación de desplazamiento de RSP y emite la información de desenredo apropiada.(.savereg registro, ubicación) |
push_reg registro |
Inserta un registro del registro no variable en la pila y emite la información de desenredo apropiada.(.pushreg registro) |
rex_push_reg registro |
Guarde un registro permanente en la pila mediante una inserción de 2 bytes, y emite el adecuado desenreda la información (registro) de .pushreg This debe usarse si la inserción es la primera instrucción de la función para asegurarse de que la función es activo - patchable. |
save_xmm128 registro, ubicación |
Guarda un registro del registro XMM no variable en la pila en la ubicación de desplazamiento de RSP y emite la información de desenredo apropiada (.savexmm128 registro, ubicación) |
set_frame registro, desplazamiento |
Establece el registro del registro de marco como RSP + desplazamiento (mediante mov o lea) y emite la información de desenredo apropiada (.set_frame registro, desplazamiento) |
push_eflags |
Inserta eflags con una instrucción pushfq y emite la información de desenredo apropiada (.alloc_stack 8) |
Este es un ejemplo de prólogo de función con uso apropiado de las 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