Delphi 迴圈的秘密

2022-02-18 04:21:01 字數 3134 閱讀 1277

技術交流,dh講解.

哈哈,我承認我是標題黨.

最近看天書夜讀裡面是對c語言的**反彙編,不錯,可惜delphi沒有這樣的書,那我們自己動手吧.

首先進入for迴圈了.

function testfor( a, b: integer ): integer ;

var i: integer ;

begin

result := a + b ;

for i := 0 to 49 do

result := result + i ;

end ;

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跳過去與臨界變數比較,然後再來看是否執行迴圈體,而改變迴圈變數它用了add eax,1,然後再把eax傳給棧上面的i.

後來我嘗試改成0 to -1 delphi編譯器會識別出來,然後不會新增任何迴圈**到函式中去的.

接下來是do迴圈,也就是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

我們發現反彙編**和for是一樣的.

這段**就和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

我暈,居然還是一樣的.也就是delphi裡面3種迴圈執行效率是一樣的吧.

而vc同樣是先初始化迴圈變數,然後無條件跳轉到邊界檢測,然後才執行迴圈體**.

迴圈就這麼多,以後該是條件判斷

Delphi語法基礎 迴圈語句

一 for語句 格式 for 控制變數 初值 to 終值 do 語句 for 控制變數 初值 downto 終值 do 語句 for語句執行過程 1 先將初值賦給左邊的變數 稱為迴圈控制變數 2 判斷迴圈控制變數的值是否已 超過 終值,如已超過,則跳到步驟5 3 果末超過終值,則執行do後面的那個語...

揭開《秘密》的秘密

你生命中所發生的一切,都是你吸引來的。它們是被你心中所保持的 心像 吸引而來,它們就是你所想的。你的每乙個思想多是真實存在的東西 它是一種力量。吸引力法則說 同類 會吸引 同類 因此當你腦中出現乙個思想,也會吸引其他同類思想過來。與中國成語的 物以類聚 人以群分 很相似 如果能在心中想著你所要的,並...

《秘密》卷一 秘密 財富的秘密

秘密 卷一 秘密 財富的秘密 充分釋放精神潛能之後,我們的物質也將極大豐富,因為精神潛能能幫助我們從物質世界中獲取一切所需的能源。乙個人在充分釋放自身的精神潛能後,他就會像一塊磁石,向所有渴望的東西發出吸引力。每個人都擁有致富的潛能 你是否對身邊的環境不滿?無論如何你要確立信心,你是有能力和力量的,...