2012-02-24 13 views
7

कृपया मैं गए कोड के इस जीसीसी इनलाइन कोडांतरक टुकड़ाएक जीसीसी इनलाइन कोडांतरक परिवर्तित इनलाइन कोडांतरक डेल्फी

int src = 0; 
dword n; 
__asm(
      "sar %%cl,%%edx" 
      : "=d" (n) // saves in eax,edx 
      : "c" (src), "d" (n) // the inputs 
      ); 

और मेरे डेल्फी प्रयास है:

asm 
mov ecx, &src 
mov edx, &n 
sar cl,edx 
mov eax,edx 
end; 

कृपया यह सही है?

+5

मेरी सलाह इस कोड को असेंबलर के बजाय पास्कल में परिवर्तित करना होगा। –

उत्तर

10

इनलाइन असेंबलर डेल्फी में उसी तरह काम नहीं करता है क्योंकि यह जीसीसी में करता है। शुरुआत के लिए, आप डेल्फी में स्थूल और टेम्पलेट समर्थन की एक ही तरह की जरूरत नहीं है, तो आप एक घोषणा-एक बार सामान्य प्रयोजन कोडांतरक नियमित उपयोग करना चाहते हैं, तो आप एक समारोह के रूप में यह घोषणा करने के लिए है:

function ShiftArithmeticRight(aShift: Byte; aValue: LongInt): LongInt; 
{$IFDEF WIN64} 
asm 
    sar edx,cl 
    mov eax,edx 
end; 
{$ELSE} 
{$IFDEF CPU386} 
asm 
    mov cl,al 
    sar edx,cl 
    mov eax,edx 
end; 
{$ELSE} 
begin 
    if aValue < 0 then 
    Result := not (not aValue shr aShift) 
    else 
    Result := aValue shr aShift; 
end; 
{$ENDIF} 
{$ENDIF} 

डेल्फी में, इनलाइन असेंबलर को उस स्थान पर लागू किया जाना चाहिए जहां इसका उपयोग किया जाता है, और यह केवल 32-बिट में समर्थित है। ऐसे एएमएम ब्लॉक में आप ईएक्स, ईसीएक्स, ईडीएक्स स्वतंत्र रूप से, साथ ही आसपास के कोड में किसी भी पहचानकर्ता का उपयोग कर सकते हैं। उदाहरण के लिए:

var 
    lValue: LongInt; 
    lShift: Byte; 
begin 
    // Enter pascal code here 
    asm 
    mov cl,lShift 
    sar lValue,cl 
    end; 
    // Enter pascal code here 
end; 
+0

बहुत धन्यवाद हेनरिक Hellström, मैं आपके मूल्यवान उत्तर के आधार पर फिर से शुरू करूंगा। धन्यवाद – Alexis

+2

@Alexis कृपया आप इसे http://meta.stackexchange.com/questions/5234/ पढ़ सकते हैं और फिर इस उत्तर को स्वीकार करने पर विचार करें और अपने पिछले प्रश्नों के कुछ उत्तरों –

+0

मेरे मूल उत्तर में एक बग फिक्स्ड करें। एसएआर एक हस्ताक्षरित ऑपरेशन है, इसलिए AValue पैरामीटर LongInt और LongWord नहीं होना चाहिए। –

संबंधित मुद्दे