मैं डेल्फी 7 में एक एएसएम समारोह लिखा लेकिन यह कुछ और करने के लिए अपने कोड बदल देती है:डेल्फी लेबल और एएसएम अजीबता?
function f(x: Cardinal): Cardinal; register;
label err;
asm
not eax
mov edx,eax
shr edx, 1
and eax, edx
bsf ecx, eax
jz err
mov eax, 1
shl eax, cl
mov edx, eax
add edx, edx
or eax, edx
ret
err:
xor eax, eax
end;
// compiled version
f:
push ebx // !!!
not eax
mov edx,eax
shr edx, 1
and eax, edx
bsf ecx, eax
jz +$0e
mov eax, 1
shl eax, cl
mov edx, eax
add edx, edx
or eax, edx
ret
err:
xor eax, eax
mov eax, ebx // !!!
pop ebx // !!!
ret
// the almost equivalent without asm
function f(x: Cardinal): Cardinal;
var
c: Cardinal;
begin
x := not x;
x := x and x shr 1;
if x <> 0 then
begin
c := bsf(x); // bitscanforward
x := 1 shl c;
Result := x or (x shl 1)
end
else
Result := 0;
end;
यह push ebx
और pop ebx
क्यों उत्पन्न करता है? और यह mov eax, ebx
क्यों करता है?
ऐसा लगता है कि यह mov eax, ebx
की वजह से आंशिक स्टैक फ्रेम उत्पन्न करता है।
यह साधारण परीक्षण mov eax, edx
उत्पन्न करता है लेकिन यह है कि स्टैक फ्रेम उत्पन्न नहीं करता है:
function asmtest(x: Cardinal): Cardinal; register;
label err;
asm
not eax
and eax, 1
jz err
ret
err:
xor eax, eax
end;
// compiled
asmtest:
not eax
and eax, $01
jz +$01
ret
xor eax, eax
mov eax, edx // !!!
ret
ऐसा लगता है यह label err
के साथ कुछ किया है। अगर मैं इसे हटा देता हूं तो मुझे mov eax, *
भाग नहीं मिलता है।
ऐसा क्यों होता है?
Quality Central पर एक बग रिपोर्ट बनाई गई।
http://qc.embarcadero.com/wc/qcmain.aspx –
@Jeroen यकीन है कि एक बग के रूप में इसकी रिपोर्ट करें। कोई जांच नहीं ... – Egon
आपने यहां कई "क्यों" प्रश्न पूछे हैं, लेकिन आपके द्वारा स्वीकार किए गए प्रतिक्रिया से उनमें से कोई भी उत्तर नहीं दिया गया था। ऐसा लगता है कि आप वास्तव में जानना चाहते थे कि डेल्फी असेंबलर में एक नए निर्देश के लिए कैसे कूदना है, इस बात के बावजूद कि आपके अपने प्रयास विफल क्यों हुए। क्या यह सही है? –