技術交流,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 ;對比書中c的反彙編**,delphi反彙編出來的**很精簡,雖然宣告了區域性變數,但是函式直接用暫存器代替了.很好.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迴圈體先直接用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;我們發現反彙編**和for是一樣的.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;我暈,居然還是一樣的.也就是delphi裡面3種迴圈執行效率是一樣的吧.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
而vc同樣是先初始化迴圈變數,然後無條件跳轉到邊界檢測,然後才執行迴圈體**.
迴圈就這麼多,以後該是條件判斷
Delphi語法基礎 迴圈語句
一 for語句 格式 for 控制變數 初值 to 終值 do 語句 for 控制變數 初值 downto 終值 do 語句 for語句執行過程 1 先將初值賦給左邊的變數 稱為迴圈控制變數 2 判斷迴圈控制變數的值是否已 超過 終值,如已超過,則跳到步驟5 3 果末超過終值,則執行do後面的那個語...
揭開《秘密》的秘密
你生命中所發生的一切,都是你吸引來的。它們是被你心中所保持的 心像 吸引而來,它們就是你所想的。你的每乙個思想多是真實存在的東西 它是一種力量。吸引力法則說 同類 會吸引 同類 因此當你腦中出現乙個思想,也會吸引其他同類思想過來。與中國成語的 物以類聚 人以群分 很相似 如果能在心中想著你所要的,並...
《秘密》卷一 秘密 財富的秘密
秘密 卷一 秘密 財富的秘密 充分釋放精神潛能之後,我們的物質也將極大豐富,因為精神潛能能幫助我們從物質世界中獲取一切所需的能源。乙個人在充分釋放自身的精神潛能後,他就會像一塊磁石,向所有渴望的東西發出吸引力。每個人都擁有致富的潛能 你是否對身邊的環境不滿?無論如何你要確立信心,你是有能力和力量的,...