2009-04-06 5 views

답변

10

인라인은 단지 제안 일 뿐이므로 내 추측은 아닐 것입니다.

간단한 재귀 계승 루틴 :

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

여기

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

이 호출의 분해이다 우리는 그것을 인라인으로 만들고 무엇이 다른지 확인해 봅니다. 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 

그리고 그들은 모두 나에게 동일하게 나타납니다, 그래서 난 내 원래의 가설을 고수하기 위하여려고하고는 지원되지 않습니다 말한다.

BTW :이 델파이에 좋은 답변을 2009 년

+0

감사합니다. RE : "In Delphi 2009"필자는 Delphi 7의 오브젝트 파스칼 참조 서를보고있었습니다. 오랫동안 인라인이 호환 가능한 키워드였던 것 같습니다. –

+0

나는 그것을 얼마 전에보고 기억하는 것 같습니다. –

+1

"인라인"은 원시 기계 코드를 사용자의 기능에 넣는 방법이었습니다. 이제 "asm"블록을 사용하고 컴파일러에서 알 수없는 명령어를 원한다면 DB, DW 및 DD 명령어가있는 바이트를 삽입합니다. –