• <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

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數據加載中……

            linux匯編指令之數據傳輸指令mov

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

            指令                               動作                                        描述

            MOV SD                    D<-S                                        傳送

            Movb                          傳送字節

            Movw                          傳送字

            Movl                           傳送雙字

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

            Movsbw                      傳送做了符號擴展字節到字

            Movsbl                        傳送做了符號擴展字節到雙字

            Movswl                       傳送做了符號擴展字到雙字

            MOVZ SD                 D<-S(零擴展)                           傳送擴展字節

            Movzbw                      傳送做了符號擴展字節到字

            Movzbl                        傳送做了符號擴展字節到雙字

            Movzwl                        傳送做了符號擴展字到雙字

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

                                                                                          M[R[%esp]]<-S

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

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

             

                                

            MovsMovz都是將較小的數值復制較大的數據位置中。符號擴展的目標位置的高位都是源數值的高位填充,零擴展的目標位置的高位全部用零填充。

             

            Mov指令組合(5)

            Movl $0x2050,%eax                立即數----寄存器      4字節

            Movw %bp,%sp                    寄存器---寄存器      2字節

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

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

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

             

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

            Mov     %dh,%al                %eax=234567ab

            Movsbl   %dh,%eax              %eax=fffffffab

            Movzbl   %dh,%eax              %eax=000000ab

             

            Push1把數據壓棧,popl是把數據出棧

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

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

            兩者區別pushl指令編碼是1個字節,上面兩條指令是6個字節

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

            Esp總是指向棧頂的指針,ebp是存取棧頂的指針

             

            int change(int* xp,int y)

            {

             int x = *xp;

             *xp   = y;

             

             return x;

            }

            這個函數的匯編代碼如下:

            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

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

             

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

            国产 亚洲 欧美 另类 久久| 久久精品人人做人人爽电影| 久久亚洲视频| 伊人久久精品影院| 亚洲精品国产字幕久久不卡| 久久精品国产亚洲av高清漫画| 成人久久综合网| 久久露脸国产精品| 久久久久高潮毛片免费全部播放| 久久久久一区二区三区| 区久久AAA片69亚洲| 久久久久无码精品国产| 国产精品成人99久久久久| 国产精品久久久久免费a∨| 久久精品国产亚洲AV嫖农村妇女| 久久精品无码专区免费 | 色综合久久中文色婷婷| 久久久久亚洲AV无码去区首| 久久亚洲欧美国产精品| 香蕉99久久国产综合精品宅男自| 久久国产精品无码HDAV| 精品多毛少妇人妻AV免费久久| 欧美777精品久久久久网| 精品一久久香蕉国产线看播放| 久久大香萑太香蕉av| 亚洲国产精品一区二区久久| 无码人妻久久一区二区三区 | 久久精品麻豆日日躁夜夜躁| 亚洲欧美另类日本久久国产真实乱对白| 久久精品国产99久久无毒不卡| 区久久AAA片69亚洲| 色综合久久天天综线观看| 99精品伊人久久久大香线蕉| 国产成人久久激情91| 性做久久久久久久| 要久久爱在线免费观看| 久久久91人妻无码精品蜜桃HD| 国产女人aaa级久久久级| 国产69精品久久久久99尤物| 四虎国产精品免费久久5151| 99久久99久久精品国产片果冻|