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

delphi – 删除用纯汇编编写的函数的序言

发布时间:2020-12-15 04:12:13 所属栏目:大数据 来源:网络整理
导读:我正在使用Delphi 2010.是否可以告诉Delphi不为函数生成序言?我正在写一些像这样的纯汇编函数: procedure SomeAssembly; stdcall;begin asm ... end;end; 我想告诉Delphi不要为这个函数生成一个序言和结语,比如C的__declspec(裸)功能. 所以没有人浪费他们
我正在使用Delphi 2010.是否可以告诉Delphi不为函数生成序言?我正在写一些像这样的纯汇编函数:
procedure SomeAssembly; stdcall;
begin
    asm
        ...
    end;
end;

我想告诉Delphi不要为这个函数生成一个序言和结语,比如C的__declspec(裸)功能.

所以没有人浪费他们的时间,我不需要帮助让这些功能与序幕一起工作;我已经可以做到了.这只是一个很大的不便,将使维护成为一个巨大的麻烦.我将不得不手动检查编译器生成的序言以查看它们的长度,如果更改,我的程序将崩溃.

我也知道我可以将函数编写为字节数组中的一系列字节,但这比查找Delphi序言的长度更糟糕.

解决方法

Delphi不为没有参数的函数生成序言或结尾,并使用寄存器调用约定声明.如果您想要没有序言的函数,请将它们声明为零参数,寄存器调用约定函数.此外,跳过开始结束块并直接进入汇编.
procedure SomeAssembly; // register; (implied)
asm
  // ...
end;

既然你实际上在谈论函数的本质,那么调用它们可能会很棘手.如果你已经实现了一个函数,好像它接收了参数并使用了不同的调用约定,那么你必须确保编译器在调用站点知道它.为此,声明一个反映函数“真实”类型而不是声明类型的函数指针.例如,如果您的函数实际上是一个双参数stdcall函数,请声明如下:

type
  TSomeAssemblyFunc = function (Arg1: Integer; Arg2: PAnsiChar): Boolean; stdcall;
var
  SomeAssemblyProc: TSomeAssemblyProc;

现在,分配该变量,使其指向您的函数:

SomeAssemblyProc := TSomeAssemblyProc(@SomeAssembly);
if SomeAssembly(2,'foo') then ...

除了跳过序言和尾声之外,编译器还会为此函数生成不正确的RET指令(因为调用约定不同),所以你必须确保在代码中说ret 8而不是让编译器默认ret指令发生.

如果你有一个有效的调试器,找到Delphi序言的长度是微不足道的:

>在函数开头设置断点.>调用该功能.>当调试器在断点处停止时,切换到CPU视图.>查看构成序言的说明.>计算这些指令旁边显示的字节数.

(编辑:李大同)

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

    推荐文章
      热点阅读