0

亲爱的了解汇编程序的德尔福人——

我有一个很棒的例程,在 Unicode 之前的世界中运行良好。

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

@Exit:
end;

鉴于我的 ASM 技能充其量只是初级,如何在 D2009+ 中做到这一点?

添加:此测试失败:

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;

谢谢——我很高兴承认自己犯了一个大脑袋放屁。:-)

缺口

4

2 回答 2

3

对于 32 位编译器,无需更改该代码。这是错误的测试用例,因为字符串文字的内置引用计数为 -1。

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

于 2013-01-01T23:22:11.963 回答
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;
于 2013-01-01T18:22:29.840 回答