亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 代碼優化.txt

?? 會變語言實現的一些程序
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
32位代碼優化常識

--------------------------------------------------------------------------------
        原作者:  Benny/29A 
        翻譯改寫:hume/冷雨飄心 

關于代碼優化的文章實在太多了,遺憾的是大部分我都沒有看,盡管他們就擺在我的床邊(每當我要看的時候就忍不住打哈欠...嘿嘿).這篇文章較短所以翻了一下. 

代碼優化的含義: 

代碼優化的目標當然是體積小和速度快,但是在通常的情況下二者就象魚和熊掌一樣不能得兼,我們通常尋找的是這二者的折中,究竟應該偏向何方,那就得具體看我們的實際需要. 

但有些常識是我們應該牢記的,下面就結合我們最常遇到的具體情況來漫談一下: 

1.寄存器清0 
        我絕對不想再看到下面的寫法: 
        1)      mov eax, 00000000h                    ;5 bytes 

        看起來上面的寫法很符合邏輯,但你應當意識到還有更加優化的寫法: 
        2)      sub eax, eax                          ;2 bytes 
        3)      xor eax, eax                          ;2 bytes 

        看看后面的字節數你就應該理解為什么要這么作了,除此之外,在速度上也沒有損失,他們一樣快,但你喜歡xor還是sub呢?我是比較喜歡xor,原因很簡單,因為我數學不好.... 

        不過Microsoft比較喜歡sub....我們知道windows運行的慢....(呵呵,當然是玩笑這并不是真正原因X-D!) 

2.測試寄存器是否為0 
        我也不希望看到下面的代碼: 
        1)      cmp eax, 00000000h                    ;5 bytes 
                je _label_                            ;2/6 bytes (short/near) 

        [* 注意很多指令針對eax作了優化,你要盡可能多地實用eax,比如CMP EAX, 12345678h (5 bytes) 
        如果你使用其他寄存器,就是6bytes *] 
        
        讓我們看看,簡單的比較指令居然要用7/11 bytes,No No No,試試下面的寫法: 
        2)      or eax, eax                          ;2 bytes 
                je _label_                            ;2/6 (short/near) 

        3)      test eax, eax                        ;2 bytes 
                je _label_                            ;2/6 (short/near) 

        呵呵,只有4/8 bytes,看看我們可節省多少字節啊3/4字節...那么接下來的問題是你喜歡OR還是TEST呢,就我個人而言,比較喜歡TEST,因為test不改變任何寄存器,并不向任何寄存器寫入內容,這通常能在pentium機上取得更快的執行速度. 
        
        別高興的太早,因為還有更值得我們高興的事情,假如你要判斷的的是eax寄存器,那么看看下面的,是不是更有啟發? 
        4)      xchg eax, ecx                        ;1 byte 
                jecxz _label_                        ;2 bytes 
        在短跳轉的情況下我們比2)和3)又節省了1字節.oh....___... 

3.測試寄存器是否為0FFFFFFFFh 
        一些API返回-1,因此如何測試這個值呢?看你可能又要這樣: 
        1)      cmp eax, 0ffffffffh                  ;5 bytes 
                je _label_                            ;2/6 bytes 
        hey,不要這樣,寫代碼的時候想一想,于是有了下面的寫法: 
        2)      inc eax                              ;1 byte 
                je _label_                            ;2/6 bytes 
                dec eax                              ;1 byte 

        可以節省3 bytes并且執行速度會更快. 

4.置寄存器為0FFFFFFFFh 
        看看假如你是Api的作者,如何返回-1?這樣嗎? 
        1)      mov eax, 0ffffffffh                  ;5 bytes 

        看了上面的不會再這么XXX了吧?看看下面的: 
        2)      xor eax, eax / sub eax, eax          ;2 bytes 
                dec eax                              ;1 byte 
        節省一個字!還有寫法: 
        3)      stc                                  ;1 byte 
                sbb eax, eax                          ;2 bytes 
        這有時還可以優化掉1 byte: 
                jnc _label_ 
                sbb eax, eax                          ;2 bytes only! 
      _label_: ... 

      我們為什么用asm呢?這就是原因. 

5.寄存器清0并移入低字數值 
        1)      xor eax, eax                          ;2 bytes 
                mov ax, word ptr [esi+xx]            ;4 bytes 
        ????--->不會吧,這可能是最多初學者的寫法了,我當然原來也是,看了benny的文章之后我決定改寫

為: 
        2)      movzx eax, word ptr [esi+xx]          ;4 bytes 
        收獲2 bytes! 

        下面的 
        3)      xor eax, eax                          ;2 bytes 
                mov al, byte ptr [esi+xx]            ;3 bytes 

        就相應改為: 
        4)      movzx eax, byte ptr [esi+xx]          ;4 bytes 

        我們應當盡可能利用movzx 
        5)      xor eax, eax                          ;2 bytes 
                mov ax, bx                            ;3 bytes 

        因為執行速度不慢并通常能節省字節... 
        6)      movzx eax, bx                        ;3 bytes 

6.關于push,下面是著重代碼體積的優化,因為寄存器操作總要比內存操作要快. 

        1)      mov eax, 50h                          ;5 bytes 

        這樣就小了1 word 

        2)      push 50h                              ;2 bytes 
                pop eax                              ;1 byte 
        
        當操作數只有1字節時候,push只有2 bytes,否則就是5 bytes,記住! 
        下一個問題,向堆棧中壓入7個0 

        3)      push 0                                ;2 bytes 
                push 0                                ;2 bytes 
                push 0                                ;2 bytes 
                push 0                                ;2 bytes 
                push 0                                ;2 bytes 
                push 0                                ;2 bytes 
                push 0                                ;2 bytes 

      占用14字節,顯然不能滿意,優化一下 
        4)      xor eax, eax                          ;2 bytes 
                push eax                              ;1 byte 
                push eax                              ;1 byte 
                push eax                              ;1 byte 
                push eax                              ;1 byte 
                push eax                              ;1 byte 
                push eax                              ;1 byte 
                push eax                              ;1 byte 

        可以更緊湊,但會慢一點的形式如下: 

        5)      push 7                                ;2 bytes 
                pop ecx                              ;1 byte 
      _label_:  push 0                                ;2 bytes 
                loop _label_                          ;2 bytes 

        可以節省7字節.... 

        有時候你可能會從將一個值從一個內存地址轉移到另外內存地址,并且要保存所有寄存器: 

        6)      push eax                              ;1 byte 
                mov eax, [ebp + xxxx]                  ;6 bytes 
                mov [ebp + xxxx], eax                  ;6 bytes 
                pop eax                                ;1 byte 

        試試push,pop 

        7)      push dword ptr [ebp + xxxx]            ;6 bytes 
                pop dword ptr [ebp + xxxx]            ;6 bytes 
7.乘法 
    
        當eax已經放入被乘數,要乘28h,如何來寫? 
        1)      mov ecx, 28h                          ;5 bytes 
                mul ecx                              ;2 bytes 

      好一點的寫法如下: 

        2)      push 28h                              ;2 bytes 
                pop ecx                              ;1 byte 
                mul ecx                              ;2 bytes 

        哇這個更好:: 

        3)      imul eax, eax, 28h                    ;3 bytes 

        intel在新CPU中提供新的指令并不是擺設,需要你的使用. 

8.字符串操作 


        你如何從內存取得一個字節呢? 
        速度快的方案: 
        1)      mov al/ax/eax, [esi]                  ;2/3/2 bytes 
                inc esi                              ;1 byte 

        代碼小的方案: 
        2)      lodsb/w/d                            ;1 byte 

        我比較喜歡lod因為他小,雖然速度慢了點. 
        
        如何到達字符串尾呢? 
      JQwerty's method: 

        9)      lea esi, [ebp + asciiz]              ;6 bytes 
      s_check: lodsb                                ;1 byte 
                test al, al                          ;2 bytes 
                jne s_check                          ;2 bytes 

        Super's method: 

        10)    lea edi, [ebp + asciiz]              ;6 bytes 
                xor al, al                            ;2 bytes 
      s_check: scasb                                ;1 byte 
                jne s_check                          ;2 byte 

      選擇哪一個?Super的在386以下的更快,JQwerty的在486以及pentium上更快,體積一樣,選擇由你. 

9.復雜一點的... 

        假設你有一個DWORD表,ebx指向表的開始,ecx是指針,你想給每個doword加1,看看如何作: 
        1)      pushad                                ;1 byte 
                imul ecx, ecx, 4                      ;3 bytes 
                add ebx, ecx                          ;2 bytes 
                inc dword ptr [ebx]                  ;2 bytes 
                popad                                ;1 byte 

        可以優化一點,但是好像沒人用: 

        2)      inc dword ptr [ebx+4*ecx]            ;3 bytes 

        一條指令就節省6字節,而且速度更快,更易讀,但好像沒有什么人用?...why? 
        還可以有立即數: 
        3)      pushad                                ;1 byte 
                imul ecx, ecx, 4                      ;3 bytes 
                add ebx, ecx                          ;2 bytes 
                add ebx, 1000h                        ;6 bytes 
                inc dwor ptr [ebx]                    ;2 bytes 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合成人在线| 日韩免费成人网| 国产成人亚洲综合a∨婷婷| 免费看日韩精品| 免费看欧美美女黄的网站| 日本欧美一区二区在线观看| 午夜视频一区在线观看| 亚洲国产成人porn| 日韩1区2区3区| 另类人妖一区二区av| 激情久久五月天| 成人性色生活片| 97se亚洲国产综合自在线不卡| 91美女视频网站| 欧美伊人久久大香线蕉综合69| 欧美三级日韩三级| 日韩精品一区二区三区四区 | 91丨九色丨蝌蚪富婆spa| 99热在这里有精品免费| 91久久久免费一区二区| 91精品国产综合久久久久久| 精品国产凹凸成av人导航| 国产日韩欧美精品电影三级在线| 国产精品视频在线看| 亚洲一区二区四区蜜桃| 久久99精品久久久久久国产越南| 国产成人综合视频| 欧洲精品视频在线观看| 日韩免费成人网| 亚洲精品国产精品乱码不99| 青青草97国产精品免费观看无弹窗版| 老司机午夜精品| 97久久超碰国产精品电影| 欧美人妖巨大在线| 国产精品每日更新| 蜜桃视频在线观看一区二区| 成人精品一区二区三区四区 | 精品欧美一区二区在线观看| 亚洲国产岛国毛片在线| 天天影视涩香欲综合网| 成人小视频免费在线观看| 欧美精品一二三| 中文字幕一区三区| 美女一区二区久久| 欧美在线观看视频在线| 国产欧美精品一区二区色综合| 亚洲国产va精品久久久不卡综合| 国产精品中文字幕日韩精品| 欧美日韩另类国产亚洲欧美一级| 欧美国产一区二区在线观看| 日韩av在线播放中文字幕| 99久久精品国产一区| 精品国产乱码久久久久久久久| 亚洲激情男女视频| 成av人片一区二区| 2023国产精品| 免费日韩伦理电影| 欧美日韩国产高清一区二区| 国产精品麻豆欧美日韩ww| 激情深爱一区二区| 欧美一区二区精品| 亚洲成人激情社区| 色噜噜狠狠成人网p站| 国产精品女主播在线观看| 国产在线一区观看| 欧美成人一区二区三区片免费| 性久久久久久久久久久久| 91片黄在线观看| 自拍偷拍国产精品| 一本大道久久a久久精二百| 国产精品毛片大码女人| 成人av免费网站| 中文无字幕一区二区三区| 国产成人在线视频播放| 欧美激情中文字幕一区二区| 国产一区二区不卡| 久久精品人人爽人人爽| 国产成人精品三级麻豆| 国产精品妹子av| jvid福利写真一区二区三区| 国产精品婷婷午夜在线观看| 成人一二三区视频| 国产精品护士白丝一区av| 91在线视频免费观看| 亚洲黄色尤物视频| 欧美巨大另类极品videosbest | 成人美女视频在线观看18| 国产精品私人影院| jizz一区二区| 亚洲女女做受ⅹxx高潮| 欧美日韩精品是欧美日韩精品| 午夜影院在线观看欧美| 日韩一级在线观看| 激情图片小说一区| 亚洲色图欧洲色图| 欧美群妇大交群中文字幕| 久久精品久久久精品美女| 国产亚洲成aⅴ人片在线观看| 91香蕉视频mp4| 日韩精品午夜视频| 久久九九久精品国产免费直播| 亚洲欧美日韩一区二区三区在线观看| 欧美亚洲国产一区二区三区| 91伊人久久大香线蕉| 国产成人精品三级麻豆| 国产高清久久久久| 精品写真视频在线观看| 六月婷婷色综合| 美女视频第一区二区三区免费观看网站| 一区二区三区在线观看视频| 亚洲欧美综合在线精品| 国产精品国产成人国产三级| 欧美极品aⅴ影院| 国产亚洲欧美一区在线观看| 久久蜜桃av一区二区天堂| 欧美精品一区二区三区很污很色的| 欧美精品色一区二区三区| 欧美日韩另类一区| 91精品国产日韩91久久久久久| 欧美精品亚洲二区| 日韩精品自拍偷拍| 精品福利一区二区三区免费视频| 日韩欧美成人午夜| 精品国产免费久久| 一区二区视频免费在线观看| 亚洲视频你懂的| 亚洲在线一区二区三区| 亚洲成a人片在线不卡一二三区 | 91在线免费播放| 91美女片黄在线| 欧美日韩高清一区| 日韩三级.com| 欧美激情综合在线| 一级日本不卡的影视| 午夜精品久久久久久久久久久| 日日夜夜精品视频天天综合网| 日本不卡1234视频| 韩国中文字幕2020精品| 成人国产亚洲欧美成人综合网| 色综合色综合色综合| 欧美日韩精品电影| 久久综合国产精品| 成人欧美一区二区三区1314 | 免费在线观看一区| 国产乱码精品一区二区三区忘忧草 | 裸体一区二区三区| 亚洲电影一级黄| 亚洲午夜免费电影| 亚洲综合999| 亚洲小说春色综合另类电影| 亚洲婷婷综合久久一本伊一区| 国产日韩欧美一区二区三区乱码| 日韩视频免费观看高清完整版在线观看 | 香蕉成人伊视频在线观看| 一二三四区精品视频| 一区二区三区 在线观看视频| 亚洲另类在线视频| 亚洲一区二区3| 天堂av在线一区| 青青青爽久久午夜综合久久午夜| 日韩av一区二区在线影视| 日韩国产在线一| 卡一卡二国产精品| 国产精品影视在线| 成人av在线电影| 91视频在线观看免费| 欧美三级中文字幕| 91精品国产91综合久久蜜臀| 精品久久免费看| 国产亚洲欧洲一区高清在线观看| 国产精品乱码人人做人人爱| 18成人在线观看| 亚洲高清三级视频| 黄色资源网久久资源365| 国产精品一区二区黑丝| 99久久精品免费| 91精品欧美一区二区三区综合在 | 成人福利视频在线| 精品日韩一区二区三区免费视频| 亚洲免费大片在线观看| 国产suv一区二区三区88区| 欧美伦理视频网站| 亚洲宅男天堂在线观看无病毒| 成人高清免费在线播放| 2024国产精品视频| 免费高清成人在线| 欧美二区三区的天堂| 亚洲国产视频一区| 一本大道久久a久久综合婷婷| 国产精品网站在线观看| 国产精品资源在线看| 久久青草国产手机看片福利盒子| 日韩av在线播放中文字幕| 在线不卡一区二区| 丝袜美腿成人在线| 欧美一区永久视频免费观看| eeuss鲁一区二区三区| 国产欧美日韩在线| 岛国精品在线播放| 国产精品丝袜久久久久久app|