gpt4 book ai didi

string - Delphi 汇编函数返回长字符串

转载 作者:行者123 更新时间:2023-12-03 05:53:53 24 4
gpt4 key购买 nike

我正在尝试学习 Delphi 中的内联汇编编程,为此我发现 this article非常有帮助。

现在我希望编写一个返回长字符串的汇编函数,特别是 AnsiString (为了简单起见)。我已经写了

function myfunc: AnsiString;
asm
// eax = @result
mov edx, 3
mov ecx, 1252
call System.@LStrSetLength
mov [eax + 0], ord('A')
mov [eax + 1], ord('B')
mov [eax + 2], ord('C')
end;

说明:

返回字符串的函数有一个不可见的 var result: AnsiString (在本例中)参数,因此,在函数的开头,eax 应保存地址结果字符串的。然后,我将 edxecx 分别设置为 3 和 1252,然后调用 System._LStrSetLength。实际上,我愿意

  _LStrSetLength(@result, 3, 1252)

其中 3 是字符串的新长度(以字符 = 字节为单位),1252 是标准 windows-1252代码页。

然后,知道eaxthe address of the first character of the string ,我只是将字符串设置为“ABC”。但它不起作用 - 它给了我无意义的数据或 EAccessViolation。有什么问题吗?

更新

现在我们有两个看似有效的 myfunc 实现,一个使用 NewAnsiString,另一个使用 LStrSetLength。我不禁想知道它们是否都是正确的,因为它们不会扰乱 Delphi 的内部字符串处理(引用计数、自动释放等)。

最佳答案

你必须使用某种:

function myfunc: AnsiString;
asm
push eax // save @result
call system.@LStrClr
mov eax,3 {Length}
{$ifdef UNICODE}
mov edx,1252 // code page for Delphi 2009/2010
{$endif}
call system.@NewAnsiString
pop edx
mov [edx],eax
mov [eax],$303132
end;

它将返回一个“210”字符串...

放置 {$ifdef UNICODE} block 以使您的代码与 2009 年之前的 Delphi 版本兼容始终是一个好主意。

关于string - Delphi 汇编函数返回长字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3313447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com