Delphi - 주기의 비밀

3268 단어 Delphi
기술 교류, DH 설명.
하하, 나는 내가 표제당이라는 것을 인정한다.최근에 천서를 보고 밤에 읽는 것은 C 언어의 코드를 반집한 것이다. 괜찮은데 델피는 이런 책이 없어서 아쉽다. 그럼 우리 스스로 하자.우선 포 순환에 들어갔습니다.
Function TestFor( a, b: Integer ): Integer ;
Var
  I: Integer ;
Begin
  Result := a + b ;
  For I := 0 To 49 Do
    Result := Result + I ;
End ;
{$R *.dfm}

Procedure TForm1.btn1Click( Sender: TObject ) ;
Begin
  ShowMessage( IntToStr( TestFor( 1, 2 ) ) ) ;
End ;

어셈블러 코드:
Unit4.pas.28: Result := a + b ;
00523AE0 03D0             add edx,eax //  a+b,           add eax,edx            mov eax,edx ,    
Unit4.pas.29: For I := 0 To 49 Do
00523AE2 33C0             xor eax,eax //  eax,   I      
Unit4.pas.30: Result := Result + I ;
00523AE4 03D0             add edx,eax //   ,      +1,            
00523AE6 40               inc eax
Unit4.pas.29: For I := 0 To 49 Do
00523AE7 83F832           cmp eax,$32 //    ,       ,         .
00523AEA 75F8             jnz $00523ae4 //            
Unit4.pas.31: End ;
00523AEC 8BC2             mov eax,edx
00523AEE C3               ret 

책에서 C의 어셈블리 코드를 비교하면 Delphi의 어셈블리 코드는 매우 간략하다. 비록 국부 변수를 성명했지만 함수는 직접 레지스터로 대체되었다.좋아.책에서 C 순환체는 먼저 Jmp로 임계 변수와 비교한 다음에 순환체를 실행하는지 확인한다. 순환 변수를 바꾸면dd eax, 1을 사용한 다음에 eax를 창고 위에 있는 I. 다음에 0 to-1 Delphi 컴파일러로 바꾸면 식별되고 함수에 순환 코드를 추가하지 않는다.
다음은 도 순환, 즉 Repeat
function TestRepeat(a,b:Integer):Integer ;
var
  I:Integer;
begin
  Result:=a + b;
  I:=0;
  repeat
    Result:= Result + I;
    Inc(I);
  until I = 50;
end;

어셈블러 코드:
Unit4.pas.30: Result:=a + b;
00523AE0 03D0             add edx,eax
Unit4.pas.31: I:=0;
00523AE2 33C0             xor eax,eax
Unit4.pas.33: Result:= Result + I;
00523AE4 03D0             add edx,eax
Unit4.pas.34: Inc(I);
00523AE6 40               inc eax
Unit4.pas.35: until I = 50;
00523AE7 83F832           cmp eax,$32
00523AEA 75F8             jnz $00523ae4
Unit4.pas.36: end;
00523AEC 8BC2             mov eax,edx
00523AEE C3               ret 

우리는 어셈블리 코드가 포와 같은 것을 발견했다.이 코드는 VC가 역컴파일한 것과 차이가 많지 않으니, 먼저 순환체를 실행한 다음에 경계를 비교해라.자, while를 볼까요?
Function TestWhile(A, B: Integer): Integer;
Var
  I: Integer;
Begin
  Result:= A+ B;
  I:= 0;
  While I< 50 Do
  Begin
    Result:= Result+ I;
    Inc(I);
  End;
End;

어셈블러 코드:
Unit4.pas.38: Result:= A+ B;
00523AE0 03D0             add edx,eax
Unit4.pas.39: I:= 0;
00523AE2 33C0             xor eax,eax
Unit4.pas.42: Result:= Result+ I;
00523AE4 03D0             add edx,eax
Unit4.pas.43: Inc(I);
00523AE6 40               inc eax
Unit4.pas.40: While I< 50 Do
00523AE7 83F832           cmp eax,$32
00523AEA 7CF8             jl $00523ae4
Unit4.pas.45: End;
00523AEC 8BC2             mov eax,edx
00523AEE C3               ret 

어지러워, 여전히 똑같아.즉 델피의 3가지 순환 실행 효율은 같은 거죠.VC 역시 순환 변수를 초기화한 다음에 무조건 경계 검측으로 이동한 다음에 순환체 코드를 실행한다.순환이 이렇게 많으니 앞으로는 조건 판단이어야 한다

좋은 웹페이지 즐겨찾기