• <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, 評(píng)論 - 196, 引用 - 0
            數(shù)據(jù)加載中……

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

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

            指令                               動(dòng)作                                        描述

            MOV S,D                    D<-S                                        傳送

            Movb                          傳送字節(jié)

            Movw                          傳送字

            Movl                           傳送雙字

            MOVS S,D                 D<-S(符號(hào)擴(kuò)展)                        傳送擴(kuò)展字節(jié)

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

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

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

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

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

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

            Movzwl                        傳送做了符號(hào)擴(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ù)位置中。符號(hào)擴(kuò)展的目標(biāo)位置的高位都是源數(shù)值的高位填充,零擴(kuò)展的目標(biāo)位置的高位全部用零填充。

             

            Mov指令組合(5)

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

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

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

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

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

             

            Movbmovsbl、movzbl的差別:比如:%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的棧是向低地址增長(zhǎng),因此壓棧是減少棧指針(寄存器%esp)的值,并把數(shù)據(jù)放到存儲(chǔ)器中;
            出棧是從存儲(chǔ)器中讀
            (數(shù)據(jù)),并增加棧指針的值。

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

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

            Popl %edx等價(jià)以下指令: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;

            }

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

            change:

                     pushl         %ebp

                     movl %esp, %ebp

                     subl $16, %esp

                     movl 8(%ebp), %eax   取形參,第N個(gè)形參在棧上的位置為(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)用不過就是將該指針放到一個(gè)寄存器,然后在存儲(chǔ)器中使用這個(gè)寄存器;
            局部變量通常保存在寄存器中,寄存器訪問比存儲(chǔ)器要快得多
            s

             

            上面是沒有優(yōu)化的匯編代碼,在編譯的時(shí)候加上-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) 評(píng)論(0)  編輯 收藏 引用 所屬分類: (反)匯編

            欧美亚洲国产精品久久高清| 国产精久久一区二区三区| 人妻丰满AV无码久久不卡| 日本精品久久久久中文字幕8 | 99久久综合狠狠综合久久止| 成人亚洲欧美久久久久| 伊人色综合久久天天人手人婷 | 日产精品久久久久久久性色| 精品无码人妻久久久久久| 久久亚洲AV成人无码国产| 久久久久国产一区二区三区| 久久99精品久久久久久动态图| 久久综合五月丁香久久激情| 久久婷婷国产麻豆91天堂| 久久精品国产99国产精品导航| 国产巨作麻豆欧美亚洲综合久久| 综合人妻久久一区二区精品| 综合久久给合久久狠狠狠97色 | 人人狠狠综合久久亚洲88| 亚洲国产精品无码久久| 久久99热这里只有精品66| 国产福利电影一区二区三区久久老子无码午夜伦不 | 亚洲色欲久久久久综合网| 精品久久久久久99人妻| 久久精品国产久精国产| 97精品国产91久久久久久| 久久久久99精品成人片欧美| 亚洲va久久久噜噜噜久久男同| 久久人人爽人人爽人人片AV高清| 亚洲精品乱码久久久久久蜜桃 | 久久免费的精品国产V∧| 久久偷看各类wc女厕嘘嘘| 少妇久久久久久被弄高潮| 精品人妻伦九区久久AAA片69| 精品久久久中文字幕人妻| 7777精品久久久大香线蕉| 久久精品无码一区二区无码| 97久久香蕉国产线看观看| 女人香蕉久久**毛片精品| 久久国产精品一区| 亚洲伊人久久综合影院|