मैं Delphi और Assembly के साथ काम कर रहा हूं, इसलिए, मुझे समस्या थी। मैंने एक निर्देश (RDTSC) का उपयोग किया, जिसमें 64-बिट रीड-टाइम स्टैम्प प्राप्त करने की असेंबली में, निर्देश ने दो रजिस्टर EAX और EDX में अलग से नंबर डाल दिए। लेकिन यह ठीक है, मैं इसे Delphi Integer चर के साथ प्राप्त करता हूं। लेकिन अब, मुझे 64-बिट्स में से 1 में उन चर को शामिल करने की आवश्यकता है। यह पसंद है:

Var1 = 46523
var2 = 1236

इसलिए मुझे इसे एक चर में डालने की आवश्यकता है जैसे:

Var3 = 465231236

यह एक StrCat की तरह है, लेकिन मुझे नहीं पता कि यह कैसे करना है। कोई मेरी मदद कर सकता है?

0
Victor Melo 14 नवम्बर 2015, 22:11

2 जवाब

सबसे बढ़िया उत्तर

आप निश्चित रूप से दो मूल्यों के दशमलव स्ट्रिंग प्रतिनिधित्व को संक्षिप्त नहीं करना चाहते हैं। यह वह तरीका नहीं है जिससे आपको RTDSC से लौटे दो 32 बिट वैल्यू को 64 बिट वैल्यू में संयोजित करने की उम्मीद है।

46523 और 1236 को मिलाकर 465231236 नहीं निकलना चाहिए। यह गलत उत्तर है। इसके बजाय, आप उच्च क्रम 32 बिट्स लेना चाहते हैं, और उन्हें कम क्रम 32 बिट्स के साथ रखना चाहते हैं।

आप $0000B5BB और $00004D4 का संयोजन कर रहे हैं। सही उत्तर या तो $0000B5BB00004D4 या $00004D40000B5BB है, जिसके आधार पर दो मान उच्च और निम्न क्रम वाले भाग हैं।

उदाहरण के लिए, {X0}} का उपयोग करके इसे कोड में लागू करें।

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

जहां RTDSC द्वारा लौटाए गए निम्न और उच्च 32 बिट मान Lo और Hi हैं।

तो, बिट्स 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 {{X1 से }}

10
David Heffernan 14 नवम्बर 2015, 21:06

एक रिकॉर्ड का उपयोग करने के लिए सरल तरीका है

type
  TMyTimestamp = record
    case Boolean of
      true:
        ( Value: Int64 );
      false:
        ( Value1: Integer; Value2: Integer );
  end;

और आप अपनी पसंद के अनुसार प्रत्येक मूल्य को स्टोर / पढ़ सकते हैं

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;

देखें: रिकॉर्ड्स: वेरिएंट पार्ट्स इन रिकॉर्ड्स

6
Sir Rufo 14 नवम्बर 2015, 19:32