2009-04-06 7 views

Répondre

10

Ma conjecture n'est probablement pas puisque inline est seulement une suggestion, mais laisse savoir.

Une simple routine récursive factoriel:

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

Voici le démontage de l'appel à elle:

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

et le démontage de la routine elle-même:

// 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 

maintenant nous le faisons en ligne et voir ce qui est différent je n l'appel:

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

Et la routine elle-même:

// 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 

Et ils semblent tous deux la même chose pour moi, donc je vais rester avec mon hypothèse de départ et dire qu'ils ne sont pas pris en charge.

BTW: Ceci est en Delphi 2009.

+0

Merci pour la bonne réponse. RE: "En Delphi 2009" je regardais à travers ma référence Object Pascal pour Delphi 7, apparemment en ligne a été un mot-clé compatible avant depuis longtemps, il n'a jamais rien fait à l'époque. –

+0

On dirait que je me souviens d'avoir vu ça il y a un moment aussi. –

+1

"Inline" était la façon dont vous pouviez mettre du code machine brut dans vos fonctions. Maintenant vous utilisez simplement les blocs "asm", et si vous voulez des instructions que le compilateur ne connait pas, insérez les octets avec les instructions DB, DW et DD. –

Questions connexes