關於乙個加法優化的乙個地方

2021-05-26 22:14:34 字數 2145 閱讀 4968

#include

#include

#include "base.h"

int main(int argc, char* argv, char* envp)  

下面是彙編:

01291000 >/$  55            push ebp

01291001  |.  8bec          mov ebp,esp

01291003  |.  56            push esi

01291004  |.  8b35 a0202901 mov esi,dword ptr ds:[<&msvcr100.printf>>;  msvcr100.printf

0129100a  |.  57            push edi

0129100b  |.  8b7d 08       mov edi,dword ptr ss:[ebp+8]             ;  edi的值變為1

0129100e  |.  8d47 0c       lea eax,dword ptr ds:[edi+c]             ;  eax的值變為9

01291011  |.  50            push eax                                 ; /<%d>

01291012  |.  68 f4202901   push offset bug_c++.??_c@_04hgipldbl@?$c>; |format = "%d

"01291017  |.  ffd6          call esi                                 ; \printf

01291019  |.  83c7 09       add edi,9

0129101c  |.  57            push edi

0129101d  |.  68 f4202901   push offset bug_c++.??_c@_04hgipldbl@?$c>;  ascii "%d

"01291022  |.  ffd6          call esi

01291024  |.  47            inc edi

01291025  |.  57            push edi

01291026  |.  68 f4202901   push offset bug_c++.??_c@_04hgipldbl@?$c>;  ascii "%d

"0129102b  |.  ffd6          call esi

0129102d  |.  83c4 18       add esp,18

01291030  |.  5f            pop edi

01291031  |.  33c0          xor eax,eax

01291033  |.  5e            pop esi

01291034  |.  5d            pop ebp

01291035  \.  c3            retn

0129100b  |.  8b7d 08       mov edi,dword ptr ss:[ebp+8]             ;  edi的值變為1

0129100e  |.  8d47 0c       lea eax,dword ptr ds:[edi+c]             ;  eax的值變為9

mov edi, dword ptr ss:[ebp + 8]

把記憶體單元中的內容送入edi

lea eax, dword ptr ds:[edi + c]

這裡之所以要用lea是因為lea載入的是相對偏移位址...就是edi + c的結果..

如果用add做

mov eax, 8(或者在記憶體中取)

add eax, edi

因為兩個數不可能是立即數...所以只能從記憶體中拿...如果用mov 則一共需要3條指令

mov eax, 9

mov edi, ***x

add eax, edi

但是用lea就可以將指令縮短為2條..因為它支援3個op的操作...

lea eax, dword ptr ds:[edi + 9]

這樣無形中節約了一條指令..

有乙個地方

今天早上的比賽終於還是勇士獲得了勝利,當時是有點小情緒,不過還好,畢竟我是較中立的球迷,當然卻還是希望雷霆贏。籃球嘛已經體會很多了。今天世界上最失落的人之一會有杜蘭特和威少吧。晚上跑步在操場遇見了隔壁班的乙個女生,挺好的,因為終於能在操場看到自己喜歡的影子了,重點當然是我認識。最近在進行乙個是軟體工...

python乙個注意的地方

class test l def init self self.l 1 2 7 a1 test a1.init 如果我這樣定義乙個類的話,執行了init方法後,a1.l的值為 1 2 7 test.l的值為。但是如果改成這樣子 class test l def init self a1 test a...

乙個關於js 優化的問題

在我們遍歷陣列 for 迴圈的時候,通常習慣的寫法是這樣 for var i 0 i myarray.length i 但是在這段 中,有乙個十分明顯的問題,就是每次在迴圈的時候,都會計算一邊 myarray.length 的值,這就意味著每次都要實時查詢dom,而dom的操作又是十分昂貴的。在這個...