如何迁移一些汇编程序代码,将Delphi字符串引用计数到Delphi Unicode

时间:2013-01-01 17:43:35

标签: string delphi

亲爱的德尔福知道汇编者的人 -

我有这个伟大的例程,在Unicode前世界中运行良好。

function StringRefCount(const Src: String): Integer;
asm
  test eax, eax
  je   @Exit
  mov  edx, eax
  mov  eax, [edx - 8]

@Exit:
end;

鉴于我的ASM技能充其量只是最基本的,如何在D2009 +中完成?

ADDED:此测试失败:

procedure TestStringStuff.TestStringRefCount;
var
  TempString: string;
  TempResult: Integer;
  SecondString: string;
begin
  TempString := 'this is a temp string';
  TempResult := StringRefCount(TempString);
  CheckEquals(1, TempResult);
  SecondString := TempString;
  TempResult := StringRefCount(TempString);
  CheckEquals(2, TempResult);
end;

谢谢 - 我很高兴承认一个重要的大脑放屁。 : - )

尼克

2 个答案:

答案 0 :(得分:3)

如果你想看到引用的引用计数,你必须首先在堆上创建一个字符串实例,如下所示:

procedure TestStringStuff.TestStringRefCount;
var
  TempString: string;
  TempResult: Integer;
  SecondString: string;
begin
  TempString := 'this is a temp string';
  UniqueString(TempString);  // <-- !!
  TempResult := StringRefCount(TempString);
  CheckEquals(1, TempResult);
  SecondString := TempString;
  TempResult := StringRefCount(TempString);
  CheckEquals(2, TempResult);
end;

答案 1 :(得分:3)

32位编译器的代码无需进行任何更改。这是一个错误的测试用例,因为字符串文字的内置引用计数为-1。

对于64位代码(以及新编译器上的32位代码),最好使用RTL已提供的相同名称的函数。