如何在带有MASM64的64位汇编中使用SEH?

时间:2018-09-29 18:00:51

标签: assembly visual-studio-2017 x86-64 masm seh

我正在尝试学习如何在使用MASM64编译的64位Windows可执行文件中使用结构化异常处理(SEH)。

到目前为止,让我们举一个简单的例子。我的测试目标是抑制此函数中的无效操作异常:

.data

holdPrevRSP QWORD ?

.code

ExceptionFrm PROC
    ; Exception handler?

    mov     rsp, [holdPrevRSP]

    ; int       3       ; tried to invoke debugger manually

    add     rsp, 100h
    pop     r15
    pop     r14
    pop     r13
    pop     r12
    pop     rsi
    pop     rsi
    pop     rbp
    pop     rbx
    ret
ExceptionFrm ENDP



TestFunc PROC FRAME:ExceptionFrm

    ; Define prolog:

    ; Need to save:
    ;   RBX, RBP, RDI, RSI, RSP, R12, R13, R14, and R15

    push    rbx
    .pushreg rbx
    push    rbp
    .pushreg rbp
    push    rdi
    .pushreg rdi
    push    rsi
    .pushreg rsi
    push    r12
    .pushreg r12
    push    r13
    .pushreg r13
    push    r14
    .pushreg r14
    push    r15
    .pushreg r15

    .ENDPROLOG

    ; really primitive way to restore RSP
    ; i know it's not multi-threaded safe!
    ; It's just for this test...
    mov     [holdPrevRSP], rsp

    ; define home stack for this function
    sub     rsp, 100h


    db 62h, 0, 0, 0, 0, 0       ; should raise invalid opcode exception



    ; Epilog
    add     rsp, 100h
    pop     r15
    pop     r14
    pop     r13
    pop     r12
    pop     rsi
    pop     rsi
    pop     rbp
    pop     rbx
    ret
TestFunc ENDP

END

我想我的问题是我不完全了解FRAME:关键字的作用。

我正在使用Visual Studio 2017来运行此测试。当我使用调试器浏览此代码时,当我遍历invalid opcode时,该过程将在该过程中其他不相关的位置引发调试器异常。

然后,我尝试在ExceptionFrm内放置一个断点,但是它从未被调用。

那我在做什么错了?

0 个答案:

没有答案