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.pas以uses Strings;在我的表单中调用?
Rem*_*eau 13
一个.pas文件是一个单元,而不是库.一个.pas文件需要unit,interface和implementation语句,如:
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文件到您的其他项目,并use在Strings需要单位.它将直接编译到每个可执行文件中.您不需要从中创建单独的库.但如果你愿意,你可以.创建一个单独的库(DLL)或包(BPL)项目,将.pas文件添加到它,并将其编译为可执行文件,然后您可以在其他项目中引用它.
对于DLL库,您将无法直接使用use该Strings单元.您将不得不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文档中的注册保存约定部分.