加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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代码,请使用呼叫.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读