Vic*_*elo 0 delphi assembly strcat rdtsc
我正在Delphi和我一起工作Assembly,所以,我有一个问题.我使用的指令(RDTSC在大会得到一个64位读时间戳的),则该指令把数字分别在两个寄存器EAX和EDX.但没关系,我用Delphi Integer变量得到它.但现在,我需要将这些变量加入64位中的1位.就像是:
Var1 = 46523
var2 = 1236
Run Code Online (Sandbox Code Playgroud)
所以我需要将它放入一个变量,如:
Var3 = 465231236
Run Code Online (Sandbox Code Playgroud)
它就像一个StrCat,但我不知道该怎么做.有人可以帮帮我吗?
Dav*_*nan 10
您当然不希望连接两个值的十进制字符串表示.这不是您期望将返回的两个32位值组合RTDSC成64位值的方式.
结合46523和1236不应该产生465231236.这是错误的答案.相反,您希望采用高位32位,并将它们放在低位32位旁边.
你是合并$0000B5BB和$00004D4.正确的答案是$0000B5BB00004D4或者$00004D40000B5BB,取决于这两个值中的哪一个是高阶和低阶部分.
在代码中实现此功能,例如,使用Int64Rec:
var
Value: UInt64;
...
Int64Rec(Value).Lo := Lo;
Int64Rec(Value).Hi := Hi;
Run Code Online (Sandbox Code Playgroud)
返回的低和高32位值的位置Lo和.HiRTDSC
因此,位0到31被设置为值Lo,并且位32到63被设置为值Hi.
或者它可以使用按位运算编写:
Value := (UInt64(Hi) shl 32) or UInt64(Lo);
Run Code Online (Sandbox Code Playgroud)
如果您只需要读取时间戳计数器,那么您不需要执行任何操作.你可以实现这样的功能:
function TimeStampCounter: UInt64;
asm
RDTSC
end;
Run Code Online (Sandbox Code Playgroud)
寄存器调用约定要求将64位值返回值传递回调用者EDX:EAX.由于将RDTSC值放在那些精确的寄存器中(顺便说一句并非巧合),因此您无需做更多事情.
所有这一切都表示,而不是使用时间戳计数器,它通常是优选使用性能计数器,其通过缠绕TStopWatch从System.Diagnostics.
简单的方法是使用记录
type
TMyTimestamp = record
case Boolean of
true:
( Value: Int64 );
false:
( Value1: Integer; Value2: Integer );
end;
Run Code Online (Sandbox Code Playgroud)
并且您可以根据需要存储/读取每个值
var
ts: TMyTimestamp;
begin
ts.Value1 := 46523;
ts.Value2 := 1236;
WriteLn( ts.Value ); // -> 5308579624379
ts.Value := 5308579624379;
WriteLn( ts.Value1 ); // -> 46523
WriteLn( ts.Value2 ); // -> 1236
end;
Run Code Online (Sandbox Code Playgroud)
请参阅:Docwiki:记录中的变体部分
| 归档时间: |
|
| 查看次数: |
1029 次 |
| 最近记录: |