यहाँ दोनों x86 और x64 के लिए, मेरे संस्करण है:
function GetCPUID: TCPUID;
asm
{$IF Defined(CPUX86)}
push ebx
push edi
mov edi, eax
mov eax, 1
xor ecx,ecx
cpuid
mov [edi+$0], eax
mov [edi+$4], ebx
mov [edi+$8], ecx
mov [edi+$c], edx
pop edi
pop ebx
{$ELSEIF Defined(CPUX64)}
mov r8, rbx
mov r9, rcx
mov eax, 1
cpuid
mov [r9+$0], eax
mov [r9+$4], ebx
mov [r9+$8], ecx
mov [r9+$c], edx
mov rbx, r8
{$IFEND}
end;
x64 के बारे में अच्छी चीजों में से एक यह है कि बहुत सारे रजिस्ट्रार उपलब्ध हैं, जिनमें से कई अस्थिर हैं। तो हम उस स्क्रैच स्पेस का उपयोग कर सकते हैं और मुख्य मेमोरी को छूने से बच सकते हैं। जाहिर है, हमें परिणाम वापस करने के लिए मुख्य स्मृति को छूना है।
RBX is nonvolatile से हम इसके मूल्य को संरक्षित करते हैं। हमारे द्वारा संशोधित अन्य सभी रजिस्ट्रार अस्थिर हैं और इसलिए हमें उन्हें संरक्षित करने की आवश्यकता नहीं है। मैं इसे और सरल बनाने के किसी भी तरीके से नहीं सोच सकता।
यह आसानी से एक तर्क के रूप प्रदान किया जाने वाला CPUID
के लिए इनपुट अनुमति देने के लिए बढ़ाया जा सकता है:
function GetCPUID(ID: Integer): TCPUID;
asm
{$IF Defined(CPUX86)}
push ebx
push edi
mov edi, edx
xor ecx,ecx
cpuid
mov [edi+$0], eax
mov [edi+$4], ebx
mov [edi+$8], ecx
mov [edi+$c], edx
pop edi
pop ebx
{$ELSEIF Defined(CPUX64)}
mov r8, rbx
mov r9, rcx
mov eax, edx
cpuid
mov [r9+$0], eax
mov [r9+$4], ebx
mov [r9+$8], ecx
mov [r9+$c], edx
mov rbx, r8
{$ELSE}
{$Message Fatal 'GetCPUID has not been implemented for this architecture.'}
{$IFEND}
end;
यह 0 की एक उप-पत्ती मूल्य, ECX में पारित मान लिया गया है। दोबारा, यदि आप इसे पास करना चाहते हैं, तो यह काफी आसान है:
function GetCPUID(Leaf, Subleaf: Integer): TCPUID;
asm
{$IF Defined(CPUX86)}
push ebx
push edi
mov edi, ecx
mov ecx, edx
cpuid
mov [edi+$0], eax
mov [edi+$4], ebx
mov [edi+$8], ecx
mov [edi+$c], edx
pop edi
pop ebx
{$ELSEIF Defined(CPUX64)}
mov r9,rcx
mov ecx,r8d
mov r8,rbx
mov eax,edx
cpuid
mov [r9+$0], eax
mov [r9+$4], ebx
mov [r9+$8], ecx
mov [r9+$c], edx
mov rbx, r8
{$ELSE}
{$Message Fatal 'GetCPUID has not been implemented for this architecture.'}
{$IFEND}
end;
प्रश्न क्या है? भाषा के लिए आपको इसे बंद करने की आवश्यकता है? –
@ Fermat2357 डेल्फी x64 asm –
यह एक अच्छा सवाल IMHO है। यह "बहुत स्थानीय" नहीं है। मौजूदा कोड को बनाए रखते समय अन्य डेल्फी उपयोगकर्ताओं को एक ही समस्या का सामना करना पड़ सकता है। –