• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養(yǎng)德,非澹薄無以明志,非寧靜無以致遠(yuǎn)。
            隨筆 - 398, 文章 - 0, 評論 - 196, 引用 - 0
            數(shù)據(jù)加載中……

            linux匯編指令之?dāng)?shù)據(jù)傳輸指令mov

            作用將源操作數(shù)的值復(fù)制到目的操作數(shù);這里規(guī)定源和目標(biāo)操作不能都指向存儲器位置,從一個存儲器位置復(fù)制到另一個存儲器位置需要兩條指令,第一條指令將源操作數(shù)加載到寄存器,第二條將寄存器的值寫到目標(biāo)位置

            指令                               動作                                        描述

            MOV SD                    D<-S                                        傳送

            Movb                          傳送字節(jié)

            Movw                          傳送字

            Movl                           傳送雙字

            MOVS SD                 D<-S(符號擴(kuò)展)                        傳送擴(kuò)展字節(jié)

            Movsbw                      傳送做了符號擴(kuò)展字節(jié)到字

            Movsbl                        傳送做了符號擴(kuò)展字節(jié)到雙字

            Movswl                       傳送做了符號擴(kuò)展字到雙字

            MOVZ SD                 D<-S(零擴(kuò)展)                           傳送擴(kuò)展字節(jié)

            Movzbw                      傳送做了符號擴(kuò)展字節(jié)到字

            Movzbl                        傳送做了符號擴(kuò)展字節(jié)到雙字

            Movzwl                        傳送做了符號擴(kuò)展字到雙字

            Push  S                       R[%esp]<-R[%esp]-4                 雙字壓棧

                                                                                          M[R[%esp]]<-S

            Popl D                         D<-M[R[%esp]];                        雙字出棧

                                                                                          R[%esp]<-R[%esp]+4

             

                                

            MovsMovz都是將較小的數(shù)值復(fù)制較大的數(shù)據(jù)位置中。符號擴(kuò)展的目標(biāo)位置的高位都是源數(shù)值的高位填充,零擴(kuò)展的目標(biāo)位置的高位全部用零填充。

             

            Mov指令組合(5)

            Movl $0x2050,%eax                立即數(shù)----寄存器      4字節(jié)

            Movw %bp,%sp                    寄存器---寄存器      2字節(jié)

            Movb (%edi,%ecx),%ah              存儲器---寄存器      1字節(jié)

            Movb $-17,(%esp)                  立即數(shù)---存儲器       1字節(jié)

            Movl %eax-12(%ebp)              寄存器---存儲器      4字節(jié)

             

            Movbmovsblmovzbl的差別:比如:%dh=ab%eax=23456789

            Mov     %dh,%al                %eax=234567ab

            Movsbl   %dh,%eax              %eax=fffffffab

            Movzbl   %dh,%eax              %eax=000000ab

             

            Push1把數(shù)據(jù)壓棧,popl是把數(shù)據(jù)出棧

            IA32的棧是向低地址增長,因此壓棧是減少棧指針(寄存器%esp)的值,并把數(shù)據(jù)放到存儲器中;
            出棧是從存儲器中讀
            (數(shù)據(jù)),并增加棧指針的值。

            Pushl %ebp等價以下指令:subl $4,%esp   movl %ebp,(%esp)

            兩者區(qū)別pushl指令編碼是1個字節(jié),上面兩條指令是6個字節(jié)

            Popl %edx等價以下指令:movl (%esp),%eax    addl $4,%esp

            Esp總是指向棧頂?shù)闹羔?/span>,ebp是存取棧頂?shù)闹羔?/span>

             

            int change(int* xp,int y)

            {

             int x = *xp;

             *xp   = y;

             

             return x;

            }

            這個函數(shù)的匯編代碼如下:

            change:

                     pushl         %ebp

                     movl %esp, %ebp

                     subl $16, %esp

                     movl 8(%ebp), %eax   取形參,第N個形參在棧上的位置為(N+1)*4+%ebp

                     movl (%eax), %eax     把形參指向的地址單元的值賦給%eax

                     movl %eax, -4(%ebp)

                     movl 8(%ebp), %edx

                     movl 12(%ebp), %eax

                     movl %eax, (%edx)

                     movl -4(%ebp), %eax

                     leave

                     ret

                     .size change, .-change

            從上面的代碼中我們可以看到指針的實(shí)質(zhì)就是地址,間接應(yīng)用不過就是將該指針放到一個寄存器,然后在存儲器中使用這個寄存器;
            局部變量通常保存在寄存器中,寄存器訪問比存儲器要快得多
            s

             

            上面是沒有優(yōu)化的匯編代碼,在編譯的時候加上-O2,匯編指令如下:

            change:

             7 | pushl|%ebp

             8 | movl| %esp, %ebp

             9 | movl| 8(%ebp), %edx

             10 | movl| 12(%ebp), %ecx

             11 | movl| (%edx), %eax

             12 | movl| %ecx, (%edx)

             13 | popl| %ebp

             14 | ret

             15 | .size|change, .-change

             16 | .p2align 4,,15

             

            開啟了-O2之后,gcc大量使用寄存器,極大的減少了多余的尋址操作

            posted on 2013-01-22 20:28 Benjamin 閱讀(3945) 評論(0)  編輯 收藏 引用 所屬分類: (反)匯編

            无码人妻久久一区二区三区蜜桃 | 久久人妻少妇嫩草AV蜜桃| 久久精品亚洲一区二区三区浴池 | 无码8090精品久久一区| 91久久精一区二区三区大全| 日韩亚洲国产综合久久久| 久久久人妻精品无码一区| 国产福利电影一区二区三区久久老子无码午夜伦不| 蜜臀av性久久久久蜜臀aⅴ| 狠狠色丁香婷婷久久综合 | 热久久视久久精品18| 久久婷婷五月综合色奶水99啪| 国产精品久久久久久久人人看| 久久91精品国产91| 久久精品中文无码资源站| 久久精品国产亚洲AV大全| 久久电影网一区| 香蕉久久夜色精品国产尤物| 亚洲人成精品久久久久| 国产亚洲欧美精品久久久| 国产精品亚洲综合专区片高清久久久| 色婷婷狠狠久久综合五月| 久久国产劲爆AV内射—百度| 狠狠色丁香久久婷婷综| 青青热久久国产久精品 | 国内精品免费久久影院| 亚洲国产日韩欧美久久| 久久只这里是精品66| 精品无码久久久久久尤物| 国产精品成人久久久久久久| 久久久国产99久久国产一| 色8久久人人97超碰香蕉987| 91亚洲国产成人久久精品| 亚洲精品高清一二区久久| 久久99国产精品二区不卡| 99久久精品国产综合一区| 成人午夜精品无码区久久| 国产精品gz久久久| 国产精品青草久久久久婷婷 | 人妻无码精品久久亚瑟影视| 99久久中文字幕|