2009-04-06 7 views

Antwort

10

Meine Vermutung ist wahrscheinlich nicht, da Inline nur ein Vorschlag ist, aber lasst uns herausfinden.

Eine einfache rekursive faktorielles Routine:

// fact := Factorial(5); 
mov eax,$00000005 
call Factorial 
mov ebx,eax 

Und die Demontage der Routine selbst: Jetzt

// 9: begin 
push ebx 
mov ebx,eax 
// 10: if aNum > 1 then 
cmp ebx,$01 
jbe $0040ab30 
// 11: Result := Factorial(aNum - 1) * aNum 
mov eax,ebx 
dec eax 
call Factorial 
imul ebx 
pop ebx 
ret 
// 13: Result := 1; 
0040ab30: mov eax,$00000001 
// 14: end; 
pop ebx 
ret 

function Factorial(const aNum: cardinal): cardinal; 
begin 
    if aNum > 1 then 
    Result := Factorial(aNum - 1) * aNum 
    else 
    Result := 1; 
end; 

Hier ist die Demontage des Anrufs ist Wir machen es Inline und sehen, was ist anders ich n der Anruf:

// 21: fact := Factorial(5); 
mov eax,$00000005 
call Factorial 
mov ebx,eax 

Und die Routine selbst:

// 9: begin 
push ebx 
mov ebx,eax 
// 10: if aNum > 1 then 
cmp ebx,$01 
jbe $0040ab30 
// 11: Result := Factorial(aNum - 1) * aNum 
mov eax,ebx 
dec eax 
call Factorial 
imul ebx 
pop ebx 
ret  
// 13: Result := 1; 
0040ab30: mov eax,$00000001 
// 14: end; 
pop ebx 
ret 

Und beide scheinen gleich zu mir, so werde ich mit meiner ursprünglichen Hypothese bleiben und sagen, dass sie nicht unterstützt werden.

BTW: Das ist in Delphi 2009

+0

Vielen Dank für die gute Antwort. RE: "In Delphi 2009" Ich habe meine Object Pascal-Referenz für Delphi 7 durchgesehen, anscheinend war Inline schon lange ein vorwärtskompatibles Schlüsselwort, es hat damals nie etwas getan. –

+0

Scheint so, als ob ich mich daran erinnere, es vor einer Weile gesehen zu haben. –

+1

"Inline" war früher, wie man rohen Maschinencode in seine Funktionen einbauen konnte. Jetzt verwenden Sie einfach "asm" -Blöcke, und wenn Sie Anweisungen brauchen, die der Compiler nicht kennt, fügen Sie die Bytes mit DB-, DW- und DD-Anweisungen ein. –