乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      80386ASM程序設(shè)計基礎(chǔ)(四)

       壞壞 2006-12-09
      算術(shù)運算指令,邏輯運算指令,移位指令
         AA.算術(shù)運算指令
         A.加減法運算ADD,ADC,INC,SUB,SBB,DEC,CMP,NEG
         a.ADD,和8086功能,用法相同,不過支持32位操作,下面的語句都是合法的。
         ADD  ESI,EDI
         ADD  EAX,DWORD  PTR  [1000H]
         b.ADC,帶進位的加法指令,即OPRDS+OPRDD+CF,其中OPRDS代表源操作數(shù),OPRDD代表目的操作,CF代表進位標(biāo)志位,功能和用法與8086相同,支持32位操作。
         c.SUB,和8086相同,支持32位操作。
         d.SBB,帶進位的減法指令,即OPRDD-OPRDS-CF,其中OPRDS代表源操作數(shù),OPRDD代表目的操作數(shù),CF代表進位標(biāo)志位,功能和用法與8086相同,支持32位操作。
         e.DEC,減1操作,功能和用法與8086相同,支持32位操作。
         f.CMP,比較操作,功能和用法與8086相同,支持32位操作。
         g.NEG,求補操作,功能和用法與8086相同,支持32位操作。
         h.INC  加1操作,功能和用法與8086相同,支持32位操作。
        
         B.乘除法指令MUL,DIV,IMUL,IDIV
         a.MUL,無符號數(shù)乘法指令,和8086功能用法一樣,即指令中只給出一個操作,被乘數(shù)已默認(rèn),如果指令給出的操作數(shù)是32位的話,被乘數(shù)默認(rèn)為EAX,那么乘積將存放在EDX:EAX中,其中EDX存放高32位,EAX存放低32位,如果此時EDX=0,即高32位為0的話,那么OF=0,CF=0,否則被置1。如果指令給出的操數(shù)作是16位的話,被乘數(shù)默認(rèn)為AX那么乘積將放在DX:AX中,其中DX中將存放高16位,AX中存放低16位。如果指令給出的操作數(shù)是8位的話,被乘數(shù)默認(rèn)為AL,那么乘積將放在AX,AH中存放高8位,AL中存放低8位。
        b.DIV,無符號數(shù)的除法指令,和8086一樣,指令給出一個操作數(shù),被除數(shù)已默認(rèn)。如果指令中給出的操作數(shù)為32,那么被除數(shù)將是EDX:EAX, 最終的商將存放在EAX, 余數(shù)將存放在EDX中。如果指令給出操作數(shù)為16位,那么被除數(shù)為EAX,最終得到的商放在AX,余數(shù)放在EAX的高16位。如果指令中給出的操作數(shù)為8位,那么被除數(shù)是16位,最終得到的商將放在AL中,余數(shù)放在AH中。
        c.IMUL,有符號數(shù)的乘法指令,除了具有8086的用法外,有新的形式:
          c1.IMUL DST,SRC;將源操作數(shù)SRC與目的操作DST相乘,并將結(jié)果送往DST。
          c2.IMUL DST,SRC1,SRC2;將源操作數(shù)SRC1與源操作數(shù)SRC2相乘,并將結(jié)果送往DST。
          使用這種形式必須遵守的規(guī)則,形式c1指令中目的操作數(shù)必須是16位或32位通寄存器,源操作數(shù)的長度必須與目的操作的長度一樣(8位立即數(shù)除外,即00H-FFH或80H-7FH),源操作數(shù)可以是通用寄存器,也可以是存儲單元或立即數(shù)。形式c2指令中的源操作數(shù)SRC1可以是通用寄存器也可以是存儲單元,源操作數(shù)SRC2必須是立即數(shù),DST必須是16位或32位通用寄存器。呵呵,對于這些規(guī)則無需去問為什么,這是硬件的特性決定的,如果一定要問為什么,那只能問INTEL公司的硬件工程師了:)。同時,有一點要注意的是:這兩種形式的指令,目的寄存器的長度與源操作數(shù)長度一樣(8位立即數(shù)除外),這樣的話,該指令事實上對有符號數(shù)和無符號數(shù)是一樣的,因為乘積的低位部分均存儲在目的寄存器中,而高位部分在這兩種形式的指令中不予以存儲。
        d.IDIV,有符號數(shù)的除法指令,用法和8086相同,不過支持32位操作。  

        C.符號擴展指令CBW,CWD,CWDE,CDQ
        a.CBW,前面已介紹,在第三篇。
        b.CWD,前面已介紹,在第三篇。
        c.CWDE,是80386新增的指令。格式:CWDE。功能:將AX的符號位擴展到EAX的高16位中。
        d.CDQ,是80386新增的指令。格式:CDQ。功能,將EAX的符號位擴展到EDX中。
        e.以上四條指令均不影響標(biāo)志位。
        f.舉例說明:
        ;If AX=1234H,EAX=99991234H
        CBW;After processing the instruction,AX=1234,DX=0000H
        CDQ;After processing the instruction,EAX=99991234H,EDX=FFFFFFFFH

        BB.邏輯運算指令和移位指令NOT,AND,OR,XOR,TEST,SAL,SAR,SHL,SHR,ROL,ROR,RCL,RCR,SHLD,SHRD
        a.NOT,AND,OR,XOR,TEST這些指令的功能和用法與8086完全相同,不過它們支持32位操作。
        b.TEST,測試指令,該指令測試的結(jié)果并不回送到目的操作數(shù)和源操數(shù)。之所以要使用這條的指令,主要是因為根據(jù)TEST指令得到的結(jié)果,進行程序的條件轉(zhuǎn)移。
        c.SAL,算術(shù)左移,功能和8086一樣,但在8086中,如果在移位的位數(shù)超過1位,那么一定要移位的位數(shù)放在CX寄存器中。在80386中,可以不用這樣做,其它的移位指令也一樣。除了這一點以外,用法和8086一樣,當(dāng)然也支持32位操作。以下的語句均是合法的。
        SHL AL,5;這在8086中是非法,但在80386中是合法的
        SHL WORD PTR [SI],3
        d.SAR,算術(shù)右移,將操作數(shù)右移指定的位數(shù),但左邊的符號位保持不變,移出的最低位進入CF標(biāo)志位。
        e.SHL,邏輯左移,用法和功能與SAL一樣。
        f.SHR,邏輯右移,將操作右移指定的位數(shù),同時每移一位,左邊用0補充,移出的最低位進入CF標(biāo)志位。
        g.說明:在80386中,實際移位的位數(shù)是指令中移位位數(shù)的低5位,也就是說移位位數(shù)的范圍在0-31或0-1FH,CF標(biāo)志位總是保留著目的操作數(shù)最后被移出位的值。當(dāng)移位位數(shù)大于操作數(shù)的長度時,CF被置0。如果移位位數(shù)為1,移位前后的結(jié)果的符號位都是一樣,那么很明顯的是該操作數(shù)經(jīng)移位后沒有移出,此時OF=0。這四條指令的移位示意圖(我畫的是16位操作數(shù)的移位示意圖,8位和32依此類推),SAL,SHL相當(dāng)于乘法;SAR,SHR相當(dāng)于除法。
        SAL:
        |-------------------------------------------------------------------------------------------|
        |CF|<-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|
        |-- ----------------------------------------------------------------------------------------|
        SHL:
        |-------------------------------------------------------------------------------------------|
        |CF|<-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|
        |--- ---------------------------------------------------------------------------------------|
        SAR:
          |--------------------------------------------------------------------------------------------|
        |-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|->|CF||
        | |---|----------------------------------------------------------------------------------------|
        |     ^
        |-----|最高位保持不變
        SHR:
           |--------------------------------------------------------------------------------------------|
        0->|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|->|CF||
           |--------------------------------------------------------------------------------------------|
        h.ROL,循環(huán)左移,支持32位操作數(shù),用法和8086一樣。
        i.ROR,循環(huán)右移,支持32位操作數(shù),用法和8086一樣。
        j.RCL,帶進位的循環(huán)左移,支持32位操作數(shù),用法和8086一樣。
        k.RCR,帶進位的循環(huán)右移,支持32位操作數(shù),用法和8086一樣。
        l.ROL,ROR,RCL,RCR的移位示意圖(仍然以16位操作數(shù)來畫,8位/32位依次類推):
        ROL:
         |--------------------------------------------------------------------------------------------------|
         |<-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|<--------|
         |--------------------------------------------------------------------------------------------------|
         |--------------------------------------------------------------------------------------------------| 
        ROR:
         |-------------------------------------------------------------------------------------------|
         |->|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|->|
         |-------------------------------------------------------------------------------------------|
         |-------------------------------------------------------------------------------------------|
       RCL:
         |-------------------------------------------------------------------------------------------------|
         |<-|CF|<-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|<-|
         |-------------------------------------------------------------------------------------------------|
         |-------------------------------------------------------------------------------------------------|  
        RCR:
         |-------------------------------------------------------------------------------------------------|
         |->|CF|<-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|->|
         |---- --------------------------------------------------------------------------------------------|
         |-------------------------------------------------------------------------------------------------|
        m.SHLD,80386新增的雙精度左位指令,指令格式:SHLD OPRD1,OPRD2,M
        n.SHRD,80386新增的雙精度右移指令,指令格式:SHRD,OPRD1,OPRD2,M
        o.m,n這兩條指令的使用規(guī)則是:源操作數(shù)OPRD1可以是16位或32位通用寄存器或者16位存儲單元或者32位存儲單元,源操作數(shù)OPRD2必須是16位或32位通寄存器,M表示移位次數(shù),可以是CL寄存器,也可以是8位立即數(shù)。功能:SHLD是將源操作數(shù)OPRD1移M位,空出的位用OPRD2高端的M位來填補,源操作數(shù)OPRD2的內(nèi)容不變,最后移出的位放在CF中;SHRD將源操作數(shù)OPRD1移M位,空出的位用OPRD2低端M位來填補,源操作數(shù)OPRD2保持不變,最后移出的位放在CF中,對于這兩條指令,當(dāng)移位位數(shù)僅為1的話,移出和移后的符號位不變的話,那么OF=0,如果符號位不一樣的話,那OF=1。
        p.這兩條指令是80386新增的指令,舉兩個簡單的例子加以說明:
        p1.SHLD:
        MOV AX,8321H
        MOV DX,5678H
        SHLD AX,DX,1
        SHLD AX,DX,2
        分析一下該指令的詳細執(zhí)行過程(用示意圖, 第一個圖畫的就是AX的內(nèi)容):
        AX=8321h
        |-------------------------------|
        |1|0|0|0|0|0|1|1|0|0|1|0|0|0|0|1|  
        |-------------------------------|
        根據(jù)指令SHLD AX,DX,1,先左移一位,得到AX=0642H:
        |-------------------------------|
        |0|0|0|0|0|1|1|0|0|1|0|0|0|0|1|0|    CF=1   
        |-------------------------------|
        經(jīng)過上一步的移位后,AX的最后一位(即bit0)空出來,其值為0;根據(jù)指令的用法將用DX的第15位填充,填充后AX的內(nèi)容為:
        |-------------------------------|
        |0|0|0|0|0|1|1|0|0|1|0|0|0|0|1|0|   
        |-------------------------------|
        同時由于移位后AX的符號位與移位前AX的符號位不同,所以在移位過程中產(chǎn)生了溢出,OF=1,最后結(jié)果AX=0642H。
        同理,SHLD AX,DX,2,執(zhí)行完這條指令后,最后結(jié)果為AX=0644H
        p2.SHRD:
        MOV EAX,12345678H
        MOV EDX,99994599H
        SHRD AX,DX,1
        SHRD AX,DX,2
        分析一下該指令的詳細執(zhí)行過程(用示意圖,第一個圖畫的是EAX的內(nèi)容):
        EAX=12345678H
        |---------------------------------------------------------------|
        |0|0|0|1|0|0|1|0|0|0|1|1|0|1|0|0|0|1|0|1|0|1|1|0|0|1|1|1|1|0|0|0|
        |---------------------------------------------------------------|
        根據(jù)指令SHRD AX,DX,1,將AX右移一位得到EAX=091A2B3EH:
        |---------------------------------------------------------------|
        |0|0|0|0|1|0|0|1|0|0|0|1|1|0|1|0|0|0|1|0|1|0|1|1|0|0|1|1|1|1|1|0|
        |---------------------------------------------------------------|
        經(jīng)過上一步的移位后,EAX的最高位(第31位)空出來用0填充,根據(jù)指令的用法,最EDX的第0位來填充,填充后EAX的內(nèi)容為:
        |---------------------------------------------------------------|
        |1|0|0|0|1|0|0|1|0|0|0|1|1|0|1|0|0|0|1|0|0|1|1|0|0|1|1|1|1|0|0|0|
        |---------------------------------------------------------------|
        即EAX=891A2B3EH,CF=0,OF=0
        同理,指令SHRD AX,DX,2,執(zhí)行完這條件指令后,最后結(jié)果為EAX=048D159C,CF=0,OF=0

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多