Delphi - 用函数编写.pas库

Vic*_*elo 1 delphi assembly function

我正在使用Assembly在Delphi中编写一些函数.所以我想把它放在一个名为的.pas文件中Strings.pas.用于uses新的Delphi软件.我需要写什么才能使它成为一个有效的库?
我的功能是这样的:

function Strlen(texto : string) : integer;
begin
  asm
    mov esi, texto
    xor ecx,ecx
    cld
    @here:
    inc ecx
    lodsb
    cmp al,0
    jne @here
    dec ecx
    mov Result,ecx
  end;
end;
Run Code Online (Sandbox Code Playgroud)

这会计算字符串中字符的数量.如何在lib中创建它Strings.pasuses Strings;在我的表单中调用?

Rem*_*eau 13

一个.pas文件是一个单元,而不是.一个.pas文件需要unit,interfaceimplementation语句,如:

Strings.pas:

unit Strings;

interface

function Strlen(texto : string) : integer;

implementation

function Strlen(texto : string) : integer;
asm
  // your assembly code...
  // See Note below...
end;

end.
Run Code Online (Sandbox Code Playgroud)

然后,您可以添加.pas文件到您的其他项目,并useStrings需要单位.它将直接编译到每个可执行文件中.您不需要从中创建单独的库.但如果你愿意,你可以.创建一个单独的库(DLL)或包(BPL)项目,将.pas文件添加到它,并将其编译为可执行文件,然后您可以在其他项目中引用它.

对于DLL库,您将无法直接使用useStrings单元.您将不得不export从库中获取函数(并且string不是安全的数据类型来传递模块之间的DLL边界),例如:

Mylib.dpr:

library Mylib;

uses
  Strings;

exports
  Strings.Strlen;

begin
end.
Run Code Online (Sandbox Code Playgroud)

然后你可以让你的其他项目使用external引用DLL文件的子句来声明函数,例如:

function Strlen(texto : PChar) : integer; external 'Mylib.dll';
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以创建一个.pas声明要导入的函数的包装器文件,将该单元添加到其他项目中并use根据需要添加,例如:

StringsLib.pas:

unit StringsLib;

interface

function Strlen(texto : PChar) : integer;

implementation

function Strlen; external 'Mylib.dll';

end.
Run Code Online (Sandbox Code Playgroud)

对于包,您可以直接use使用Strings单位.只需在项目管理器.bpi中的其他项目的" 需求"列表中添加对包的引用,然后use根据需要添加该单元.在这种情况下,string安全传递.

注意:在您显示的汇编代码中,对于不导致访问冲突的函数,您需要保存并恢复ESI寄存器.请参阅Delphi文档中的注册保存约定部分.