delphi – 如何在asm块中引发异常?
发布时间:2020-12-15 04:14:10 所属栏目:大数据 来源:网络整理
导读:我想在X64 asm块中引发异常. 让我们假设我有这样的函数: function Example(Values: array of integer): integer;asm or rcx,rcx jz @error .... 我知道我只能读取指针并获得AV,但是我想提出一个更具描述性的错误. 我可以做一个额外的功能并调用那个: asm o
我想在X64 asm块中引发异常.
让我们假设我有这样的函数: function Example(Values: array of integer): integer; asm or rcx,rcx jz @error .... 我知道我只能读取指针并获得AV,但是我想提出一个更具描述性的错误. 我可以做一个额外的功能并调用那个: asm or rcx,rcx jz @error .... @error: mov ecx,1 mov rdx,ErrorString jmp RaiseError .... function RaiseError(code: integer; const Msg: string); begin case code of 1: raise EEmptyArrayError.Create(Msg); 但是,错误将在引起的函数之外发生.如何从(似乎)源自Example函数内部获取异常. 请注意,这是X64,因此适用于X86的所有SEH答案都不合适,因为X64使用VEH. 解决方法
raise的完整语法是:
raise Exception at address 您需要做的就是将当前IP作为参数传递,错误proc可以将其传递给异常. 您可以使用lea rax [rip]获取RIP. 因此代码变成: asm or rcx,ErrorString lea r8,[rip] jmp RaiseError .... function RaiseError(code: integer; const Msg: string; address: pointer); begin case code of 1: raise EEmptyArrayError.Create(Msg) at address; 当然,在这种情况下,它更容易使用 function RaiseError(code: integer; const Msg: string); begin case code of 1: raise EEmptyArrayError.Create(Msg) at ReturnAddress; 注意在这种情况下,如果你保留jmp,错误似乎来自调用例程,在这种情况下实际上是正确的.如果您希望异常将有罪的手指指向您的asm代码,请使用呼叫. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |