Delphi - 주기의 비밀
3268 단어 Delphi
하하, 나는 내가 표제당이라는 것을 인정한다.최근에 천서를 보고 밤에 읽는 것은 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 역시 순환 변수를 초기화한 다음에 무조건 경계 검측으로 이동한 다음에 순환체 코드를 실행한다.순환이 이렇게 많으니 앞으로는 조건 판단이어야 한다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Delphi] TStringBuilder그리고 꼭 사용해야만 할까? 그림처럼 Heap 영역에 "Hello" 공간을 생성하고 포인팅을 한다. "Hello World" 공간을 새로 생성한 후 포인팅을 하게 된다. 결국 "Hello" 라는 String 객체가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.