【发布时间】:2010-07-22 21:02:26
【问题描述】:
我正在尝试在 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 应该保存结果字符串的地址。然后我将edx 和ecx 分别设置为3 和1252,然后调用System._LStrSetLength。实际上,我愿意
_LStrSetLength(@result, 3, 1252)
其中 3 是字符串的新长度(字符 = 字节),1252 是标准 windows-1252 代码页。
然后,知道eax 是the address of the first character of the string,我只需将字符串设置为“ABC”。但它不起作用 - 它给了我无意义的数据或 EAccessViolation。有什么问题?
更新
现在我们有两个看似有效的myfunc 实现,一个使用NewAnsiString,一个使用LStrSetLength。我不禁想知道它们是否都正确,因为它们不会破坏 Delphi 对字符串的内部处理(引用计数、自动释放等)。
【问题讨论】:
-
对于 Delphi/Asm 问题,Embarcadero 的 BASM 论坛也很有用。使用字符串,你可能也对这个线程感兴趣:forums.embarcadero.com/thread.jspa?threadID=20231
标签: string delphi function assembly basm