Operações de Pseudo bruto
Este tópico lista as operações de pseudo.
Comentários
Operação de pseudo |
Description |
---|---|
QUADRO de PROC [: ehandler] |
Causas MASM para gerar uma função de entrada no .pdata da tabela e desenrolar informações em .xdata para uma função do estruturado comportamento de desenrolamento de manipulação de exceção. Se ehandler estiver presente, esse proc é inserido o .xdata como o manipulador específico do idioma. Quando o atributo de quadro é usado, ele deve ser seguido por um.Diretiva ENDPROLOG. Se a função é uma função de folha (conforme definido na Tipos de função) o atributo de quadro é desnecessário, pois o restante dessas pseudo-operations. |
.PUSHREG reg |
Gera uma entrada de código de desenrolamento UWOP_PUSH_NONVOL para o número de registro especificado usando o atual deslocamento no prólogo. Isso deve ser usado somente com os registradores de inteiro não-volátil. Para as verificações extras de registradores volátil, use um.ALLOCSTACK 8, em vez disso |
.SETFRAME reg, deslocamento |
Preenchimentos no quadro de registram o campo e o deslocamento nas informações de desenrolamento usando o registrador especificado e o deslocamento. O deslocamento deve ser um múltiplo de 16 e menor ou igual a 240. Essa diretiva também gera uma entrada de código de desenrolamento UWOP_SET_FPREG para o registro especificado usando o atual deslocamento de prólogo. |
.Tamanho ALLOCSTACK |
Gera um UWOP_ALLOC_SMALL ou um UWOP_ALLOC_LARGE com o tamanho especificado para o atual deslocamento no prólogo. O operando de tamanho deve ser um múltiplo de 8. |
.SAVEREG reg, deslocamento |
Gera um UWOP_SAVE_NONVOL ou uma entrada de código de desenrolamento UWOP_SAVE_NONVOL_FAR para o registrador especificado e o deslocamento usando o atual deslocamento de prólogo. MASM escolherá a codificação mais eficiente. O deslocamento deve ser positivo e um múltiplo de 8. Deslocamento é relativo à base de quadro do procedimento, o que é geralmente em RSP, ou usando um ponteiro de quadro, o ponteiro do quadro de escala. |
.SAVEXMM128 reg, deslocamento |
Gera um UWOP_SAVE_XMM128 ou uma entrada de código de desenrolamento de UWOP_SAVE_XMM128_FAR para o registrador XMM especificado e o deslocamento usando o atual deslocamento de prólogo. MASM escolherá a codificação mais eficiente. O deslocamento deve ser positivo e múltiplo de 16. Deslocamento é relativo à base de quadro do procedimento, o que é geralmente em RSP, ou usando um ponteiro de quadro, o ponteiro do quadro de escala. |
.PUSHFRAME [código] |
Gera uma entrada de código de desenrolamento UWOP_PUSH_MACHFRAME. Se o código opcional for especificado, a entrada de código de desenrolamento é fornecida um modificador de 1. Caso contrário, o modificador é 0. |
.ENDPROLOG |
Sinaliza o fim das declarações de prólogo. Deve ocorrer nos primeiros 255 bytes da função. |
Aqui está um prólogo da função de exemplo com o uso correto da maioria dos opcodes:
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