0

私は と で作業しているDelphiのでAssembly、問題がありました。RDTSC64 ビット読み取りタイムスタンプを取得するアセンブリでinstruction( ) を使用しました。この命令は、数値を 2 つのレジスタEAXとに別々に配置しますEDX。でも大丈夫です、Delphi Integer変数で取得します。しかし今、これらの変数を 1 つの 64 ビットに結合する必要があります。それは次のようなものです:

Var1 = 46523
var2 = 1236

だから私はそれを次のような1つの変数に入れる必要があります:

Var3 = 465231236

StrCat のようなものですが、やり方がわかりません。誰かが私を助けることができますか?

4

2 に答える 2

10

2 つの値の 10 進文字列表現を連結したくないことは確かです。RTDSCこれは、 から返された 2 つの 32 ビット値を 64 ビット値に結合する方法ではありません。

46523 と 1236 を組み合わせても 465231236 にはなりません。これは間違った答えです。代わりに、上位 32 ビットを取得し、下位 32 ビットと並べて配置します。

と を組み合わせ$0000B5BB$00004D4います。正解は、2 つの値のどちらが上位部分と下位部分である$0000B5BB00004D4$00004D40000B5BBに応じて、 または です。

たとえば、次を使用してコードでこれを実装しますInt64Rec

var
  Value: UInt64;
...
Int64Rec(Value).Lo := Lo;
Int64Rec(Value).Hi := Hi;

ここでLo、 およびHiは、 によって返される下位および上位の 32 ビット値ですRTDSC

したがって、ビット 0 ~ 31 は の値に設定され、Loビット 32 ~ 63 は の値に設定されますHi

または、ビット演算を使用して記述することもできます。

Value := (UInt64(Hi) shl 32) or UInt64(Lo);

タイムスタンプカウンターを読み取るだけでよい場合は、これを行う必要はありません。次のように関数を実装できます。

function TimeStampCounter: UInt64;
asm
  RDTSC
end;

レジスタの呼び出し規則では、64 ビット値の戻り値が で呼び出し元に返される必要がありますEDX:EAX。これらの正確なレジスタに値を配置するためRDTSC(ちなみに偶然ではありません)、これ以上何もする必要はありません。

TStopWatch以上のことから、通常は、タイムスタンプ カウンターを使用するよりも、 fromによってラップされるパフォーマンス カウンターを使用する方が望ましいと言えSystem.Diagnosticsます。

于 2015-11-14T19:21:22.167 に答える