2009-04-06 12 views

答えて

10

インラインは単なる提案なので、私の推測はおそらくありませんが、見つけ出すことができます。

ルーチン階乗単純な再帰:ここ

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

は、それへの呼び出しの解体である:

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

、ルーチン自体の解体:今

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

私たちはそれをインラインとし、何が違うかを見ますNコール:

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

、ルーチン自体:

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

そして、彼らは両方とも私には同じように表示されますので、私は私の元の仮説に固執し、それらがサポートされていないと言うつもりです。

ところで:これはDelphiで良い答えのために、2009年

+0

おかげです。 RE:「In Delphi 2009」Delphi 7用のObject Pascalのリファレンスを見ていましたが、明らかにインラインは長い間順方向互換性のキーワードとなっていました。 –

+0

私は少し前にそれを見て覚えているように見えます。 –

+1

「インライン」は、生の機械コードをどのように機能に組み込むかということでした。これで "asm"ブロックを使用するだけで、コンパイラが知らない命令が必要な場合は、DB、DW、およびDD命令でバイトを挿入します。 –

関連する問題