我正在尝试学习 Delphi 中的内联汇编编程,为此我发现本文非常有帮助。
现在我希望编写一个返回长字符串的汇编函数,特别是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
应保存结果字符串的地址。然后我设置edx
and ecx
分别为 3 和 1252,然后调用System._LStrSetLength
。实际上,我确实
_LStrSetLength(@result, 3, 1252)
其中 3 是字符串的新长度(以字符 = 字节为单位),1252 是标准长度windows-1252代码页。
然后,知道了eax
is 字符串第一个字符的地址,我只是将字符串设置为“ABC”。但它不起作用 - 它给了我无意义的数据或 EAccessViolation。问题是什么?
Update
现在我们有两个看似有效的实现myfunc
, 一名雇用NewAnsiString
和一名雇用LStrSetLength
。我不禁想知道它们是否都是正确的,因为它们不会扰乱 Delphi 对字符串的内部处理(引用计数、自动释放等)。