• <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>
            posts - 297,  comments - 15,  trackbacks - 0

            原創(chuàng)  自己整理的指令 收藏

            1   通用數(shù)據(jù)傳送指令

            MOV(move                                                      傳送//不影響標志位

            MOV mem/reg1, mem/reg2(兩 個操作數(shù)必有一個是寄存器,且這種方式不允許指定段寄存器) 

            reg, data(data為 立即數(shù)) ac, mem(ac為 累加器)mem, ac  segreg, mem/reg(不允許用CS寄 存器

            mem/reg, segreg     mem/reg, data(這 種方式目的操作數(shù)只用存儲器尋址方式而不用寄存器方式)

            MOVSX (move with sign-extended)      帶符號擴展傳送//不影響標志位

            MOVSX  reg1, reg2   reg, mem (原 操作數(shù)是帶符號數(shù),所以做符號擴展)

            MOVZXmove with zero-extended    帶零擴展傳送//不影響標志位

            MOVSX  reg1, reg2  reg, mem (原 操作數(shù)是無符號整數(shù)所以做零擴展,不管原操作熟符號位是否為1)

            PUSH (push onto the stack)         進棧//不 影響標志位

            push    reg    mem          data   segreg

            POP (pop from the stack)               出棧//不影響標志位

            pop    reg    mem     segreg

            其中段地址存放于SS寄存器中。       SP(16位)或ESP(32位)的內(nèi)容在任何時候都指向當前棧頂。

            堆棧的存取在16位指令中必須以字為單位(不允許字節(jié)堆棧),在32位指令中必須以雙字為單位。

            8086不允許PUSH指令使用立即數(shù)尋址方式,286及后繼機型允許立即數(shù)進棧。

            PUSHA/PUSHAD(push all registers)   所有寄存器進棧//不影響標志位  

            PUSHA:進 棧次序:AX,CX,DX,BX,指令執(zhí)行前的SP,BP,SI,DI.指 令執(zhí)行后(sp)←(SP)-16仍指向棧頂

            PUSHAD:32位, 進棧次序同PUSHA

            POPA/POPAD(pop all registers)       所有寄存器出棧//不影響標志位

            POPA(16位)出 棧次序:DI,SI,BP,SP,BX,DX,CX,AX. 指 令執(zhí)行后(sp)←(SP)+16仍指向棧頂

            POPAD:32位, 進棧次序同POPA.

            XCHGexchange                交換//不影響標志

            執(zhí) 行操作 (OPR1)←→(OPR2)這 兩個操作數(shù)必有一個在寄存器中,不允許使用段寄存器。該指令可用于除立即數(shù)外的任何尋址方式。

             

            2   累加器專用傳送指令

            IN(input)                          輸入//不影響標志位

            OUT(output)                    輸出//不影響標志位

            這 兩個指令只限于累加器EAX,AX,AL。IN指 令完成從I/O到CPU的 信息傳送,而OUT指 令完成從CPU到I/O信 息傳送。CPU只 能用累加器接受或發(fā)送信息。

            XLATtranslate                換碼//不影響標志位

            在 使用這條指令前應(yīng)先建立一個字節(jié)表格,其首地址提前存入BX/EBX,需要轉(zhuǎn)換代碼應(yīng)該是相對于表格首地址的位移量也提前存放在AL中, 表格內(nèi)容則是所要換取的代碼,指令執(zhí)行完后就可在AL中得到轉(zhuǎn)換后的代碼。32位:(

             

            3   地址傳送指令

            LEA(load effective addresss)            有效地址送寄存器//不影響標志位  

            目 的操作數(shù):可用于16位或32位寄存器,但不能使用段寄存器。源操作數(shù):除立即數(shù)和寄存器外的任一種存儲器尋址方式。

            注意1LEA   BX[BX+SI+0F62H]這里BX寄 存器得到的是有效地址而不是該存儲單元內(nèi)容。如果是MOV  BX[BX+SI+0F62H],則BX中得到是偏移地址為ⅹⅹⅹ那個單元內(nèi)容而不是其偏移地址。

            注意2 : 比較  LEA  BX, LIST  MOV  BX, OFFSET  LIST

             這兩條指令功能上相同,且MOV指令速度快,但OFFSET只能與簡單的符號地址相連,而 不能和諸如LIST[SI][SI]等復雜操作數(shù)相連。   

            LDS(load DS with pointer)              指針送寄存器和DS//不影響標志位

            LES(load ES with pointer)              指針送寄存器和ES//不影響標志位 

            LFS(load FS with pointer)               指針送寄存器和FS//不影響標志位

            LGS(load GS with pointer)              指針送寄存器和GS//不影響標志位

            LSS(load SS with pointer)               指針送寄存器和SS//不影響標志位

            該 組指令的源操作只能用存儲器尋址方式。目的寄存器不允許使用段寄存器。

             

            4   標志寄存器傳送指令

            LAHF(load AH with flags)               標志送AH//不影響標志位

            執(zhí) 行操作:(AH)←(FLAGS低 字節(jié))

            SAHF(store AH into flags)               AH送標志寄存器//由裝入值來確定標志位值

            執(zhí) 行操作:(FLAGS低 字節(jié))←(AH)

            PUSHF/PUSHFD                      標志進棧//由裝入值來確定標志位值

            執(zhí) 行操作: PUSHF      (SP)←(SP)-2         ( (SP)+1), (SP) )←(FLAGS)

            PUSHFD (ESP)←(ESP)-4 ( (ESP+3), (ESP+2), (ESP+1), (ESP) ) ←(EFLAGS AND OFCFFFFH)(清VM和RF 位)

            POPF/POPFD(pop the flags or eflags)      標志出棧//由裝入值來確定標志位值

            執(zhí) 行操作:POPF      (FLAGS)←( (SP)+1),  (SP) )                         (SP)←(SP)+2

                                                 POPFD    (EFLAGS)←((ESP)+3,(ESP+2),(ESP+1),(ESP))           (ESP)←(ESP)+4

            POPFD指 令不影響VM,RF,IOPL,VIF和VIP的 值。

             

             類型轉(zhuǎn)換指令

            CBW(convert byte to word)                   字節(jié)轉(zhuǎn)換為字//不影響標志位

            執(zhí) 行操作:AL的內(nèi)容擴展到AH,形 成AX中的字。即如果(AL)的 最高有效位為0,則(AH)=0;如 果為1(AH)=OFFH

            CWD/CWDE(convert word to double word)     字轉(zhuǎn)換為雙字//不影響標志位

            執(zhí) 行操作:AX的內(nèi)容擴展到DX,形 成DX:AX的雙字。即若(AX)的 最高有效位為0,(DX)=0;若為1,(DX)=0FFFFH

            CDQ(convert double to quad)           雙字轉(zhuǎn)換為4字//不影響標志位

            執(zhí) 行操作:EAX的 內(nèi)容擴展到EDX,形 成EDX:EAX中 的4字。

            BSWAP(byte swap)               字節(jié)交換//不影響標志位

            BSWAP  EAX。 字節(jié)次序變反,具體為1,4字 節(jié)互換,2,3字 節(jié)互換。該指令只能用于486及其后繼機型。

             

                                             

            算術(shù)指令

            1 加法指令

            ADD(add)                           加法//影響條件標志位

            ADC(add with carry)         帶進位加法//影響條件標志位

            注:ADC這 條指令里,其中CF為進位位的值。

            INC(increment)           加1//影響條件標志位(除了CF標志)

            (上 3條)可 做字或字節(jié)運算。OF位 可以用來表示帶符號數(shù)溢出,CF位則可以用來表示無符號數(shù)的溢出。

            XADD(exchange and add)       交換并相加//影響條件標志位

            該 指令源操作數(shù)只能用寄存器尋址方式,目的操作數(shù)可用寄存器或任一種存儲器尋址方式。

            執(zhí) 行操作:TEMP←(SRC)+(DST)                                   (SRC)←(DST)        (DST)←TEMP

            2 減法指令

            SUB(subtract)                                  減法//影響條件標志位

            SBB(subtract with borrow)                   帶借位減法//影響條件標志位

            執(zhí) 行操作:(DST)←(DST)-(SRC)-CF

            DEC(decrement)                            減1//影響條件標志位(除了CF標志)

            NEG(negate)                                 求補  //影響條件標志位

            執(zhí) 行操作:(OPR)←-(OPR)亦 即把操作數(shù)按位求反后末位加1,因而執(zhí)行可表示為(OPR)←0FFFFH-(OPR)+1

            只 有當操作數(shù)為0時,求補運算結(jié)果使CF=0,其他情況均為1。

            CMP(compare)                              比較//影響條件標志位

            (OPR1)-(OPR2),不 保存結(jié)果,只是根據(jù)結(jié)果設(shè)置條件標志位。其后往往跟著條件轉(zhuǎn)移指令。

            CMPXCHG(compare and exchange)              比較并交換 //影響條件標志位  

            該 指令只能用于486及 其后繼機型。SRC只 能用8,16,或32位寄存器。DST則可用寄存器或任何一種存儲器尋址方式。執(zhí)行操作:累加器和DST比 較                                    

            CMPXCHG8B(compare and exchange 8 byte)     比較并交換8字節(jié) //影響ZF標志位  

            該 指令只能用于Pentium及 其后繼機型。源操作數(shù)存放于EDX,EAX中64位字,目的操作數(shù)可用存儲器尋址方式確定一個64位 字。執(zhí)行操作EDX,EAX和DST相 比較。

            注:條件碼。OF標志位同加法指令,這里若兩個數(shù)符號相反而結(jié)果的符號與減數(shù)相同,則OF=1;除上述情況外OF=0。OF=1說明帶符號 數(shù)的減法溢出,結(jié)果錯誤。

            減 法的CF值反映無符號運算中的借位情況,因此當作無符號數(shù)運算時,若減數(shù)>被減數(shù),此時有借位,則CF=1;否則 CF=0。即有進位時CF=0,無進位時CF=1。

            另 外注意8086中處理雙字的方法(也適用于386及其后繼機型中對4字的處理)。

             

            3 乘法指令

            MUL(unsigned multiple)          無符號數(shù)乘法//對除CFOF以外的條件碼位無定義

            IMUL(signed  multiple)          帶符號數(shù)乘法//對除CFOF以外的條件碼位無定義

            執(zhí)行操作:  字節(jié)操作數(shù): (AX)←(AL)*(SRC),字操作數(shù)和雙字操作數(shù)操作同字節(jié)操作數(shù)。

            目的操作數(shù)必須是累加器(累加器為隱含),字運算為AX,字節(jié)運算為AL。兩個8位數(shù)相乘得到16位數(shù)存放在AX中,兩個16 位數(shù)相乘得到32位數(shù)存放在DX,AX中,其中DX存放高位字,AX存放低位字。386以后可做雙字運算。

            對于80286及其后繼機型,IMUL除上述單操作數(shù)指令(累加器為隱 含),還有雙操作數(shù)和三操作數(shù)。如:

            IMUL REG,SRC            IMUL REG,SRC,IMM

            IMUL  REG,SRC 執(zhí)行操作: 

            字操作數(shù):(REG16)←(REG16)*(SRC)          雙字操作數(shù):(REG32)←(REG32)*(SRC)

            其中目的操作數(shù)必須是16位或32位寄存器;源操作數(shù)可用任一種尋址方式取得和目的操作數(shù)長度相同

            的數(shù);但如源操作數(shù)為立即數(shù)時,除相應(yīng)地用16位或32位立即數(shù)外,指令中也可指定8位立即數(shù),在運算時機器會自動把該數(shù)符號 擴展成與目的操作數(shù)長度相同的數(shù)。

            IMUL REG,SRC,IMM  執(zhí)行操作:

            字 操作數(shù):(REG16)←(SRC)*IMM       雙字操作數(shù):(REG32)← (SRC)*IMM

            目 的和源操作數(shù)同上,IMM表示立即數(shù),可以為8,16,32,運算時必須和目的操作數(shù)長度一致。

            注:條件碼。對 于MUL指令,如果乘積的高一半為0,即字節(jié)操作的(AH)或字操作的(DX)或雙字操作的(EDX)為0,則CF和OF均為0;否則CF和OF均為1。

            對 于IMUL指令,如果乘積的高一半是低一半的符號擴展,則CF和OF均為0,否則就為1。

            機 器規(guī)定:16位 操作數(shù)相乘得到的乘積在16位之內(nèi)或32位操作數(shù)相乘得到的乘積在32位 之內(nèi)時,OF和CF位 置0, 否則置1, 這時的OF位 為1是 說明溢出的。其它標志位無定義。

            4   除法指令

            DIV(unsigned divide)              無符號數(shù)除法//對所有條件碼均無定義

            執(zhí) 行操作:(商和余數(shù)均為無符號數(shù))

                     字節(jié)操作:16位 被除數(shù)在AX中,8位 除數(shù)為源操作數(shù),結(jié)果的8位商在AL中,8位 余數(shù)在AH中。表示為:(AL)←(AX)/(SRC)的 商      (AH)←(AX)/(SRC)的 余數(shù)

                     字操作:32位 被除數(shù)在DX,AX中。 其中DX為高位字;16位 除數(shù)為源操作數(shù),結(jié)果的16位商在AX中,16位 余數(shù)在DX中。表示為:   (AX)←(DX,AX)/(SRC)的 商         (DX)←(DX,AX)/(SRC)的 余數(shù)

                     雙字操作:64位 被除數(shù)在EDX,EAX中。 其中EDX為高位雙字;32位 除數(shù)為源操作數(shù),結(jié)果的32位商在AX中,32位 余數(shù)在EDX中。表示為:(EAX)←(EDX,EAX)/(SRC)的 商  (EDX)←(EDX,EAX)/(SRC)的 余數(shù)

            IDIV(signed divide)               帶符號數(shù)除法//對所有條件碼均無定義

            執(zhí) 行操作:同DIV,但操作數(shù)必須是帶符號數(shù),商和余數(shù)也都是帶符號數(shù),且余數(shù)的符號和 被除數(shù)的符號相同。

            除 法指令尋址方式同乘法指令。由于除法指令的字節(jié)操作要求被除數(shù)為16位, 字操作要求被除數(shù)為32位,雙字操作要求被除數(shù)為64位, 因此往往需要用符號擴展方法取得除法指令所需的被除數(shù)格式。

            另 外需注意一個問題,除法指令要求字節(jié)操作時商為8位,字操作時商為16位, 雙字操作時商為32位。如果字節(jié)操作時,被除數(shù)的高8位 絕對值≥除數(shù)絕對值;或者字操作時,被除數(shù)的高16位絕對值≥除數(shù)絕對值;或者雙字操作時,被除數(shù)高32位 絕對值≥除數(shù)絕對值,則商就會產(chǎn)生溢出。

             

            十進制調(diào)整指令

            1 .壓縮的BCD碼調(diào)整指令

            DAA(decimal adjust for addition) 加法的十進制調(diào)整指令//OF標志位無定義,影響其它位

            執(zhí) 行操作:(AL)←把AL中 的和調(diào)整到壓縮的BCD格式,這條指令之前必須執(zhí)行ADD或ADC指 令,加法指令必須把兩個壓縮的BCD碼相加,并把結(jié)果存放在AL寄 存器中。

                     本指令調(diào)整方法:如果AF標 志(輔助進位位)為1, 或者ALa存器的低4位 是16進制的A~F, 則使AL寄存器的內(nèi)容加06H, 且將AF位置1; 如果CF標志為1, 或者AL寄存器的高4位 是16進制的A~F, 則AL寄存器內(nèi)容加60H, 并將CF位置1。                   

            DAS(decimaladjust for subtraction)減法十進制調(diào)整指令//對OF標志位無定義,影響其它位
            執(zhí) 行操作:(AL)←把AL中 的差調(diào)整到壓縮的BCD格式。執(zhí)行這條指令前必須先執(zhí)行SUB或SBB指 令,

            減法指令必須把兩個BCD碼 相減,并把結(jié)果存放在AL寄存器中。本指令調(diào)整方法同DAA指 令。

             

            2 .非壓縮的BCD碼調(diào)整指令

            AAAASCII adjust for addition            加法的ASCII調(diào)整指令//除影響AFCF標 志

                                                                                     外,其余標志位無定義

            執(zhí)行操作:(AL)←把AL中的和調(diào)整到非壓縮的BCD格 式    (AH)←(AH)+ADC生 的進位值

            執(zhí)行這條指令前必須先執(zhí)行ADD或ADC指 令,加法指令必須把兩個非壓縮的BCD碼相加,并把結(jié)果存

            放在AL寄存器。

            本指令的調(diào)整步驟:①如AL寄存器的底4位 在0~9之 間,且AF位 為0, 則跳過第②步,執(zhí)行第③步;

            ②如AL寄 存器的低4位在十六進制數(shù)A~F之 間或AF為1, 則AL寄存器的內(nèi)容加6,AH寄 存器的內(nèi)容加1,

            并將AF位置1;

            ③清除AL的 高4位

            ④AF的值送CF位

            AAS(ASCII adjust for subtraction)             減法的ASCII調(diào) 整指令//除影響AFCF標志外,其余標志位無定義

            執(zhí)行操作:(AL)←把AL中的差調(diào)整到非壓縮的BCD格 式    (AH)←(AH)- 調(diào)整產(chǎn)生的借位值

             

            執(zhí)行這條指令前必須先執(zhí)行SUB或SBB指 令,減法指令必須把兩個非壓縮的BCD碼相減,并把結(jié)果存放                                                                                           

            在AL寄存器。

            本指令的調(diào)整步驟:①如AL寄存器的底4位 在0~9之 間,且AF位 為0, 則跳過第②步,執(zhí)行第③步;

            ②如AL寄 存器的低4位在十六進制數(shù)A~F之 間或AF為1, 則AL寄存器的內(nèi)容減6,AH寄 存器的內(nèi)容減1,

            并將AF位置1;

            ③清除AL的 高4位

            ④AF的值送CF位

            AAM(ASCII adjust for multiplication) 乘法的ASCII調(diào)整指令//根據(jù)AL寄存器的內(nèi)容設(shè)置條件

                                                           SFZFPF,但OFCFAF位無定義

            執(zhí)行操作:(AX)← 把AL中的積調(diào)整到非壓縮的BCD碼。

            在執(zhí)行這條指令之前,必須先執(zhí)行MUL指 令,把兩個非壓縮的BCD碼相乘(此時要求其高4位 為0),結(jié)果

            放在AL寄存器中。

            本指令調(diào)整方法:把AL寄 存器的內(nèi)容除以0AH,商放在AH寄 存器中。

            AAD(ASCII adjust for division)     除法的ASCII調(diào) 整指令//根據(jù)AL寄 存器的內(nèi)容設(shè)置條件                                               SFZFPF,但OFCFAF位無定義

            執(zhí) 行操作:(AH)←10*(AH)+(AL)             (AH)←0

            如 果被除數(shù)是存放在AX寄存器中的二位非壓縮BCD數(shù),AH中 存放十位數(shù),AL中存放個位數(shù),而且要求AH和AL中 的高4位均為0。 除數(shù)是一位非壓縮的BCD數(shù),同樣要求高4位 為0。在把這兩個數(shù)用DIV指 令相除以前,必須先用AAD指令把AX中 的被除數(shù)調(diào)整成二進制數(shù),并存放在AL寄存器里。因此,AAD指 令執(zhí)行如上。

             

                                                                    邏輯指令

            邏輯運算指令

            ANDand                      邏輯與//使CFOF0AF位無定義

            執(zhí) 行操作:(DST)←(DST)∧(SRC)

            用AND指 令可以使操作數(shù)的某些位被屏蔽。只需要把AND指令的源操作數(shù)設(shè)置成一個立即數(shù),并 把需要屏蔽的位設(shè)為0,這 樣指令執(zhí)行的結(jié)果就可以把操作數(shù)的相應(yīng)位置0,其他各位保持不變.

            OR (or)                           邏輯或//使CFOF0AF位無定義

            執(zhí) 行操作:(DST)←(DST)∨(SRC)

            用OR指 令可以使操作數(shù)的某些位置1,其他位保持不變.只需把OR指 令的源操作數(shù)設(shè)置為一個立即數(shù),并把需要置1的位設(shè)為1,就 可達到目的.

            NOT (not)                         邏輯非//不影響標志位

            執(zhí) 行操作:(OPR)←(OPR)

            XOR (exclusive or )                  異或//使CFOF0AF位無定義

            (DST)←(DST)⊕(SRC)

            要 使操作數(shù)的某些位變反,可 以用XOR指 令,只 要把源操作數(shù)的立即數(shù)字段的相應(yīng)位置成1就可以達到目的.

            XOR指 令還可以測試某一操作數(shù)是否與另一確定的操作數(shù)相等.這種操作在檢查地址是否匹配時常用.

            TEST( test)                         測試//使CFOF0AF位無定義

            執(zhí) 行操作:(OPR1)∧(OPR2)

            用 途:要測試操作數(shù)的某些位是否為0,可 用TEST指令,同 樣把TEST指令的源操作數(shù)設(shè)置成一個立即數(shù),其 中需要測試的位應(yīng)設(shè)為1.要測試操作數(shù)的某位是否為1,可 先把該操作數(shù)求反,然后用TEST指 令測試.這里常用于條件轉(zhuǎn)移.

             

            2                  位 測試并修改指令

            BTbit test                         位測試//影響CF值,對其它位無定義

            執(zhí) 行操作:把目的操作數(shù)中由源操作數(shù)所指定位的值送往標志位CF。

            BTSbit test and set)                 位測試并置1//影響CF值,對其它位無定義

            執(zhí) 行操作:把目的操作數(shù)中由源操作數(shù)所指定位的值送往標志位CF, 并將目的操作數(shù)中的該位置1。

            BTR bit test and reset              位測試并置0//影響CF值,對其它位無定義

            執(zhí) 行操作:把目的操作數(shù)中由源操作數(shù)所指定位的值送往標志位CF, 并將目的操作數(shù)中的該位置0。

            BTC bit test and complement        位測試并變反//影響CF值,對其它位無定義

            執(zhí) 行操作:把目的操作數(shù)中由源操作數(shù)所指定位的值送往標志位CF, 并將目的操作數(shù)中的該位變反。

            本組指令中 的SRC可以使用寄存器方式或立即數(shù)方式,即可以在指令中用8位 立即數(shù)直接指出目的操作數(shù)所要測試位的位位置。也可以用任一字寄存器或雙字寄存器的內(nèi)容給出同一個值。目的操作數(shù)則可用除立即數(shù)外的任一種尋址方式指定一 個字或雙字。由于目的操作數(shù)的字節(jié)最大為32位,所以位位置的范圍應(yīng)是0~31。

             

            3              位掃描指令

            BSF bit scan forward               正向位掃描//影響ZF位,其他標志位無影響

            執(zhí) 行操作:指令從位0開始自右向左掃描源操作數(shù),目的是檢索第一個為1的 位。如遇到第一個為1的位則將ZF位 置0,并把該位的位位置裝入目的寄存器中;如源操作數(shù)為0, 則將ZF位置1, 目的寄存器無定義。

            BSR bit scan reverse                反向位掃描//影響ZF位,其他標志位無影響

            與BSF指 令唯一區(qū)別是BSR指令檢索從高位向低位,而BSF檢 索從低位開始第一個出現(xiàn)的1。

             

            4             移位指令

            1.移位指令

            SHL shift logical left                 邏輯左移//根據(jù)移位后的結(jié)果設(shè)置SFZFPF的值

            格 式:SHL   OPR,CNT     

            其 中OPR用除立即數(shù)外的任何尋址方式。移位次數(shù)由CNT決 定。在8086中可以是1或CL。 若移位次數(shù)大于1,可在該移位指令前把移位次數(shù)置于CL寄 存器,而移位指令中的CNT寫為CL。 當然其它機型可以直接把CNT寫成用8位 立即數(shù)指定范圍從1到31的 移位次數(shù)。

            邏 輯移位指令適用于無符號數(shù)運算。其中SHL用來乘以2。

            SAL  (shift arithmetic left)         算術(shù)左移//根據(jù)移位后的結(jié)果設(shè)置SFZFPF的值

            格 式同上。算術(shù)指令適用于帶符號數(shù)運算。SAL用來乘以2。

            SHR  (shift logical right)          邏輯右移//根據(jù)移位后的結(jié)果設(shè)置SFZFPF的值

            格 式同上。邏輯移位指令適用于無符號數(shù)運算。其中SHR用 來除以2。

            SAR  (shift arithmetic right)       算術(shù)左移//根據(jù)移位后的結(jié)果設(shè)置SFZFPF的值

            格 式同上。算術(shù)指令適用于帶符號數(shù)運算。SAR用來除以2。

            這 里最高有效位右移,同時再用它自身值填入。

            移位指令常用來乘以2或除以2的操作。

             

             

             


             CF         OPR                   OPR           CF                 OPR          CF

            (1)邏輯及算術(shù)左移               (2)邏輯右移                        (3)算術(shù)右移

             

            2.循環(huán)移位指令

            ROL  (rotate left)      循環(huán)左移//CF根 據(jù)各條指令規(guī)定設(shè)置,OFCNT=1時有效,否則無定義                

            ROR  (rotate right)                循環(huán)右移//同上

            RCL  ( rotate left through carry)     帶進位循環(huán)左移//同上

            RCR  (rotate right through carry )    帶進位循環(huán)右移//同上

            以 上2組 指令都可以作字或字節(jié)操作,386及后繼機型還可以做雙字操作。

             

             


                  CF     OPR                           OPR         CF

            循環(huán)左移                       循環(huán)右移       

             

             

             


                  CF     OPR                           OPR          CF

                    帶進位循環(huán)左移                    帶進位循環(huán)右移

             

            3.雙精度移位指令

            SHLD (shift left double )         雙精度左移//當移位次數(shù)為0時, 不影響標志位;否則        

                                                    根據(jù)移位后的結(jié)果設(shè)置SFZFPFCF

            SHRD (shift right double )               雙 精度右移//同上

            格式:  SHLD(SHRD)     DST,REG,CNT

            DST可 以用除立即數(shù)以外任一種尋址方式指定字或雙字操作數(shù)。源操作數(shù)只能使用寄存器方式指定與目的操作數(shù)相同長度的字或雙字。CNT為 移位次數(shù),可以是一個8位 立即數(shù),也可是CL, 其內(nèi)容存放移位計數(shù)值,范圍從1到31,大于31則 自動取模32的 值來取代。

            這組指令在邊界不對準的位串傳送中很有用。如所要傳送的位串的第一個位的位位置 不在字節(jié)地址的邊界上時,就可以用這組指令來處理。

                   DST

            DST



             

             

             

            T

                                              0                                       0

              CF                                                                         CF

               

                   REG

                  REG

                                            0  0                                      0

                

                          雙精度左移                                   雙精度右移

             

                                        串處理指令

            特性:

            數(shù)據(jù)類型

                    字節(jié)

                    字

                  雙字

            方向(DF)

                向前(DF=0)

                        向后(DF=1)

            串長度

                        1

                     重復REP(Count Reg)次

            源串((source-index))

            目的串((destination-index))

            在數(shù)據(jù)段中(可用段跨越前綴 修改)

            在附加段中






             REP重 復串操作直到計數(shù)器寄存器count reg的內(nèi)容為0為止。格式:REP   string  primitive

            其 中string  primitive可為MOVS,STOS,LODS,INS和OUTS指 令。執(zhí)行操作:(1)如(count reg)=0,則 退出ERP, 否則往下執(zhí)行  (2)(count reg)←(count reg-1)   (3)執(zhí) 行其后的串指令   (4)重復(1)~(3)

            CLDclear direction flag該指令使DF=0, 在執(zhí)行串處理指令時可使地址自動增量

            STD set direction flag該指令使DF=0,在執(zhí)行串處理指令時可使地址自動減量

             

            1     MOVS                            串傳送指令// 不影響標志位

            MOVS DST,SRC   MOVSB(字節(jié))  MOVSW(字) MOVSD(386及后繼機型可用)
            MOVS尋址方式是隱含的。所以這種格式中的DST和SRC只 提供給匯編程序做類型檢查用,并且不允許用其他尋址方式來確定操作數(shù)。

            在執(zhí)行操作前有如下準備工作:

            ①把存放在數(shù)據(jù)段中的源串首地址(如反向傳送則是末地址)放入源變址寄存器

            ②把將要存放數(shù)據(jù)串的附加段中的目的串首地址(或反向傳送時的末地址)放入目的變 址寄存器中;

            ③把數(shù)據(jù)串長度放入計數(shù)寄存器中

            ④建立方向標志

            功 能:把由源變址寄存器指向的數(shù)據(jù)段中的一個字(或雙字,或字節(jié))傳送到由目的變址寄存器指向的附加段中的一個字(或雙字,或字節(jié))中去。同時根據(jù)方向標志 及數(shù)據(jù)格式(或雙字,或字節(jié))對源變址寄存器和目的變址寄存器進行修改。

             

            2     STOS                             存入串指令//不影響標志位

            STOS  DST      STOSB(字節(jié))    STOSW(字)    STOSD(雙字)386及 后繼機型可用

            該 指令把AL,AX或EAX的 內(nèi)容存入由目的變址寄存器指向的附加段的某單元中,并根據(jù)DF的值及數(shù)據(jù)類型修改目的變址寄存器的內(nèi)容。當它與REP聯(lián) 用時,可把AL、AX或EAX的 內(nèi)容存入一個長度為(count reg)的緩沖區(qū)中。

            STOS在 初始化某一緩沖區(qū)時很有用。

             

            3    LODS                          從串取指令//不影響標志位

            LODS  SRC    LODSB(字節(jié))     LODSW(字)      LODSD(雙字)

            該 指令把由源變址寄存器指向的數(shù)據(jù)段中某單元的內(nèi)容送到AL、AX、EAX中,并根據(jù)方向標志和數(shù)據(jù)類型修改源變址寄存器的內(nèi) 容。指令允許使用段跨越前綴來指定非數(shù)據(jù)段的存儲區(qū)。

             

            4    INS                             串輸入指令//不影響標志位

            INS  DST,DX     INSB(字節(jié))         INSW(字)         INSD(雙字)

            把 段口號在DX寄 存器中的I/O空 間的字、字節(jié)、雙字傳送到附加段中的由目的變址寄存器所指向的存儲單元中,并根據(jù)DF的值和數(shù)據(jù)類型修改目的變址寄存器的內(nèi)容。

             

            5    OUT                                 串輸出指令//不影響標志位

            OUTS DX,SRC       OUTSB(字節(jié))        OUTSW(字)            OUTSD(雙字)

            該 指令把由源變址寄存器所指向的存儲器中的字節(jié)、字或雙字傳送到端口號在DX寄存器中的I/O端 口中去,并根據(jù)DF的 值和數(shù)據(jù)類型修改目的變址寄存器的內(nèi)容。

             

            6      REPE/REPZREPNE/REPNZ聯(lián)合工作的CMPSSCAS指令

            1.REPE/REPZ                     當相等/為0時重復操作    

            格 式:REPE(或REPZ)           string  primitive(可 為CMPS或SCAS)

            執(zhí) 行操作:①如(count reg)=0或ZF=0(即 某次比較的結(jié)果兩個操作數(shù)不等)時退出,否則往下執(zhí)行。

            ②(count reg)←(count reg)-1      ③執(zhí)行其后的串指令          ④重復①~③

            2.  REPNE/REPNZ                 當不相等//不為0時重 復串操作

            格式:REPNE(或REPNZ)           string  primitive(可 為CMPS或SCAS)

            執(zhí)行操作:只要兩數(shù)比較的結(jié)果不相等,就可繼續(xù)執(zhí)行串處理指令,如某次兩數(shù)比較相等或(count reg)= 0 時,就可結(jié)束操作。退出條件為(count reg)=0或ZF=1外,其它與REPE完全相同。

            3. CMPS                        串比較指令//根據(jù)結(jié)果設(shè)置條件碼

            CMPS   SRC,DST             CMPSB           CMPSW            CMPSD

            執(zhí)行操作:指令把由源變址寄存器指向的數(shù)據(jù)段中的一個字節(jié)、字或雙字與由目的變址寄存器所指向的附加段中的一個字節(jié)、字或雙字 相減,但不保存結(jié)果,只根據(jù)結(jié)果設(shè)置條件碼。指令的其它特性和MOVS指令的規(guī)定相同。

            4.SCAS                         串掃描指令//根據(jù)結(jié)果設(shè)置條件碼

            SCAS   DST                   SCASB              SCASW         SCASD

            執(zhí)行操作:指令把AL、AX或EAX的內(nèi)容與由目的變址寄存器指向的在附加段中的一個字節(jié)、字或雙字進行比較,并不保存結(jié)果,只根據(jù)結(jié)果設(shè)置條 件碼。指令的其他特性和MOVS的規(guī)定相同。

             

                                                  控制轉(zhuǎn)移指令

                     1段內(nèi)轉(zhuǎn)移:指同一段的范圍內(nèi)進行轉(zhuǎn)移,此 時只需修改IP或EIP,用新轉(zhuǎn)移目標地址去替轉(zhuǎn)移分為:

                    2段間轉(zhuǎn)移:要轉(zhuǎn)到另一個段去執(zhí)行程序, 要修改IP(EIP)和CS寄存器內(nèi)容。段地址+偏移地址 

            1        無條件轉(zhuǎn)移指令

            JMP(jump)                              無條件轉(zhuǎn)移指令//不影響條件碼

            (1)段內(nèi)直接短轉(zhuǎn)移                       JMP      SHORT     OPR

            執(zhí)行操作:(IP)←(IP)+8位 位移     如果操作數(shù)16位,則還需(EIP)←(EIP) AND 0000FFFFH 

            8位 位移量是由目標地址 OPR確 定。轉(zhuǎn)移的目標地址在匯編格式中可直接使用符號地址,而在機器執(zhí)行時則是當前的IP或EIP的 值(即JMP指 令的下一條指令的地址)與 指令中指定的8位 位移量之和。位移量既可表示向前又可表示向后移,是一個帶符號數(shù)。所以這種格式只允許在-128到+127字節(jié)范圍內(nèi)轉(zhuǎn)移

            (2)段內(nèi)直接近轉(zhuǎn)移                       JMP   NEAR   PTR    OPR

            執(zhí)行操作:(IP)←(IP)+16位 位移     80386及后繼機型為:(EIP)←(EIP)+32位位移量

            如果操作數(shù)16位,則還需(EIP)←(EIP) AND 0000FFFFH 

            同樣采用相對尋址8086及其它機型的實模式下段長為64K,所以16位 位移量可以轉(zhuǎn)移到段內(nèi)的任一個位置。在386及后繼機型的保護模式下,段的大小可達4G32位 位移量可以轉(zhuǎn)到段內(nèi)任何位置。

            (3)段內(nèi)間接近轉(zhuǎn)移                       JMP   WORD   PTR   OPR

            執(zhí)行操作:(IP)←(EA),386及 后繼機型則為:(EIP)←(EA)。如果操作數(shù)16位,則還需(EIP)←(EIP) AND 0000FFFFH

            其 中有效地址EA值 由OP R尋 址方式確定。它可以使用除立即數(shù)方式以外的任一種尋址方式。如果指定是寄存器,則把寄存器的內(nèi)容送到IP或EIP寄 存器中;如果指定是存儲器中的一個字或雙字,則把該存儲單元的內(nèi)容送到IP或EIP寄存器中去。

            (4)段間直接遠轉(zhuǎn)移                       JMP    FAR    PTR    OPR

            直接      執(zhí)行操作:(IP)← OPR的 段內(nèi)偏移地址             (CS)← OPR所 在段的段地址

            尋址       386及 后繼機型為:(EIP)← OPR的段內(nèi)偏移地址    (CS)← OPR所在段的段地址

            (5)段間間接遠轉(zhuǎn)移                       JMP    DWORD   PTR    OPR

            執(zhí)行操作:     (IP)←(EA)   (CS)←(EA+2)      操作數(shù)16位,則還需

            386及 后繼機型     (EIP)←(EA)  (CS)←(EA+4)      ( EIP)←(EIP) AND 0000FFFFH

            其 中有效地址EA值 由OP R尋 址方式確定。它可以使用除立即數(shù)方式以外的任一種尋址方式。根據(jù)尋址方式求出EA后, 把指定存儲單元的字內(nèi)容送到IP或EIP寄存器,并把下一個字內(nèi)容送到CS寄 存器。

            2        條件轉(zhuǎn)移指令                  //所有條件轉(zhuǎn)移指令都不影響條件碼

            條件轉(zhuǎn)移指令使用了相對尋址方式,它只可用JMP中 的短轉(zhuǎn)移和近轉(zhuǎn)移兩種格式。(在8086和80286中 只提供短轉(zhuǎn)移格式,目標地址應(yīng)在本條轉(zhuǎn)移指令下一條指令地址的            

            -128~+127個字節(jié)范圍之內(nèi)。80386以 后除短轉(zhuǎn)移外還提供近轉(zhuǎn)移,這樣就可到達段內(nèi)任何位置。)但條件轉(zhuǎn)移不提供段間遠轉(zhuǎn)移格式。滿足測試條件 時,IP或EIP與8位、16位或32位位移量相加得到轉(zhuǎn)向地址;如不滿足測試條件,則IP或EIP不變。

             

            1 根據(jù)單個條 件標志的設(shè)置情況轉(zhuǎn)移。

            適用于 測試某一次運算的結(jié)果并根據(jù)其不同特征產(chǎn)生分支作不同處理。

            (1)JZ(或JE)(jump if zero,or equal)              結(jié)果為零(或相等)則轉(zhuǎn)移

            格式:JZ(或JE) OPR                      測試條件ZF=1

            (2)JNZ(或JNE)(jump if not zero,or not equal)    結(jié)果不為零(或不相等)則轉(zhuǎn)移

            格式:JNZ(或JNE) OPR                   測試條件:ZF=0

            (3)JS(jump if sign)                            結(jié)果為負則跳轉(zhuǎn)

            格式:JS    OPR                            測試條件:SF=1

            (4)JNS(jump if not sign)                        結(jié)果為正則跳轉(zhuǎn)

            格式:JNS   OPR                            測試條件:SF=0

            (5)JO(jump if overflow)                          溢出則轉(zhuǎn)移

            格式:JO    OPR                             測試條件:OF=1

            (6)JNO(jump if not overflow)                      不溢出則轉(zhuǎn)移

            格式:JNO  OPR                              測試條件:OF=0

            (7)JP(或JPE) (jump if parity,or parity even)         奇偶位為1則跳轉(zhuǎn)

            格式:JP(或JPE) OPR                        測試條件:PF=1

            (8)JNP(或JPO) (jump if not parity,or parity odd)     奇偶位為0則跳轉(zhuǎn)

            格式:JNP(或JPO) OPR                       測試條件:PF=0

            (9)JB(或JNAE, 或JC)(jump if below,or not above or equal,or carry)

                                      低于,或者不高于或者等于,或進位為1則轉(zhuǎn)移

            格式:JB(或JNAE,或JC) OPR                 測試條件:CF=1

            (10)JNB(或JAE, 或JNC)(jump if not below,or above or equal,or not carry)

                                  不低于,或者高于或等于,或進位為零則轉(zhuǎn)移

            格式:JNB(或JAE, 或JNC) OPR                測試條件:CF=0

             

            2 比較兩個無 符號數(shù),并根據(jù)比較結(jié)果轉(zhuǎn)移。

            (1) JB(或JNAE, 或JC)(jump if below,or not above or equal,or carry)

            (2) JNB(或JAE, 或JNC)(jump if not below,or above or equal,or not carry)

            以上兩個 指令同上面第一組(9)(10)完全相 同

             

            (3) JBE(或JNA) (jump if below or equal,or not above)

                                     低于或等于,或不高于則轉(zhuǎn)移

            格式:JBE(或JNA) OPR                         測試條件:CFZF=1

             

            (4)JNBE(或JA)(jump if not below or equal,or above)

                                     不低于或等于,或高于則轉(zhuǎn)移

            格式:JNBE(或JA)  OPR                         測試條件:CFZF=1

             

            3                    比較兩個帶符號數(shù),并根據(jù)比較結(jié)果轉(zhuǎn)移

            (1) JL(或JNGE)(jump if less,or not greater or equal)小于,或者不大于或等于則跳轉(zhuǎn)

            格式:JL(JNGE)   OPR                             測試條件:SFOF=1

            (2)JNL(或JGE)(jump if not less,or greater or equal)不小于或者大于或等于則轉(zhuǎn)移

            格:JNL(或JGE OPR                             測試條件:SFOF=0

            (3)JLE(或JNG)(jump if less or equal,or not greater)小于或等于,或者不大于則轉(zhuǎn)移

            格式JLE(或JNG OPR                            測試條件:SFOF)∨ZF = 1

            (4)JNLE(或JG)(jump if not less or equal,or greater)不小于或等于,或大于則轉(zhuǎn)移

            格式:JNLE(或JG)  OPR                           測試條件:SFOF)∨ZF =0

            4                    測試CX或ECX的值為0則轉(zhuǎn)移指 令             

            (1)JCXZ(jump if CX register is zero)             CX寄存器的內(nèi)容為零則轉(zhuǎn)移

            格式:JCXZ     OPR                                      測試條件:CX= 0

            (2)JECXZ(jump if ECX register is zero)        ECX寄存器的寄存器內(nèi)容為零則轉(zhuǎn)移

            格式:JECXZ   OPR(386J及后繼機型可用)                 測試條件:E X= 0   

             

            條件設(shè)置指令本組指令只在386及后繼機型才提供)

            格式:SETcc  DST

            執(zhí)行操作:DST可使用寄存器或任一種存儲器尋址方式,但只能指定一個字節(jié)單元。指令根據(jù)所指定的條件碼情況,如滿足條件則把目的字節(jié)置為1;如不滿足條件則把目的字節(jié)置為0。條件設(shè)置可分為3組:

            1.根據(jù)單個 條件標志的值把目的字節(jié)置1。

            (1)SETZ(或SETE)(set byte if zero,or equal)       結(jié)果為零(或相等)則目的字節(jié)置1

            測試條件: ZF = 1

            (2)SETNZ(或SETNE)(set byte if not zero,or not equal)結(jié)果不為零或不相等則目的字節(jié)置1 

            測試條件:ZF = 0

            (3)SETS(set byte if sign)                       結(jié)果為負則目的字節(jié)置為1

            測試條件:SF = 1

            (4)SETNS(Set byte if not sign)                   結(jié)果為正則目的字節(jié)置為1

            測試條件:SF = 0

            (5)SETO(set byte if overflow)                    溢出則目的字節(jié)置1

            測試條件:OF = 1

            (6)SETNO(set byte if not overflow)              不溢出則目的字節(jié)置1

            測試條件:OF = 0

            (7)SETP(或SETPE)(set byte if parity,or parity even)奇偶位為1則目的字節(jié)置1

            測試條件:PF = 1

            (8)SETNP(或SETB,或SETNAE) (set byte if parity,or parity odd) 奇偶位為0則目的字節(jié)置1

            測試條件:PF = 0

            (9)SETC(或SETB,或SETNAE) (set byte if carry,or below,or not above or equal)   

                                       進位位為1,或低于,或不高于或等于則目的字節(jié)置1

            測試條件:CF = 1

            (10)SETNC(或SETNB,或SETAE) (set byte if carry,or below,or not above or equal)

                                   進位位為1,或不低于,或高于或等于則目 的字節(jié)置

            測試條件:CF = 0

            2.比較兩個 無符號數(shù),并根據(jù)比較結(jié)果把目的字節(jié)置1。

            (1)SETC(或SETB,或SETNAE) (set byte if carry,or below,or not above or equal)  

            (2)SETNC(或SETNB,或SETAE) (set byte if carry,or below,or not above or equal)

            以上兩個 指令同上面第一組(9)(10)完全相 同

            (3)SETBE(或SETNA)(set byte if below or equal,or not above)

                                                    低于或等于,或不高于則目的字節(jié)置1

            測試條件:CFZF=1

            (4)SETNBE(或SETA) (set byte if not below or equal,or above)

                                                   不低于或等于,或高于則目的字節(jié)置1

            測試條件:CFZF=0

             

            3.比較兩個 帶符號數(shù),并根據(jù)比較結(jié)果把目的字節(jié)置1。

            (1)SETL(SETNGE)(set byte if less,or not greater or equal)

                                                  小于,或不大于或等于則目的字節(jié)置1

            測試條件:  SFOF = 1

            (2)SETNL (SETGE)(set byte if not less,or greater or equal)

                                                  不小于,或大于或等于則目的字節(jié)置1

            測試條件:   SFOF = 0

            (3)SETLE(SETNG) (set byte if less or equal,or not greater)

                                                  小于或等于,或不大于則目的字節(jié)置1

            測試條件:SFOF)∨ZF=1

            (4)SETNLE(SETG)(set byte if not less or equal,or greater)

                                                  不小于或等于,或大于則目的字節(jié)置1

            測試條件:SFOF)∨ZF=0

             

            5        循環(huán)指令                         //循環(huán)指令不影響條件碼

            使用相對尋址方式

            (1)LOOP                          循環(huán)

            格式:LOOP   OPR                      測試條件:(count Reg)≠0

            (2)LOOPZ/LOOPE                  當為零或相等時循環(huán)指令

            格式:LOOPZ(或LOOPE) OPR          測試條件:ZF=1且(count Reg)≠0

            (3)LOOPNZ/LOOPNE               當不為零或不相等時循環(huán)指令

            格式:LOOPNZ(或LOOPNE)   OPR     測試條件:ZF=0且(count Reg)≠0

            其中第二和第三條指令提供了提前結(jié) 束循環(huán)的可能性。

            這 三條指令執(zhí)行步驟:①(count Reg)←(count Reg)-1

            ② 檢查是否滿足測試條件,如滿足且操作數(shù)長度為16位,則(IP)←(IP)+D8的符號擴展;如滿足且操作數(shù)長度為32位,則(EIP)←(EIP)+D8的符號擴展;

            上 面OPR必須指定一個表示轉(zhuǎn)向地址的標號(符 號地址),而在機器指令里則用8位位移量D8來表示轉(zhuǎn)向地址與當前IP(或EIP)值的差。由于位移量只有8位,所以轉(zhuǎn)向地址必須在該循環(huán)指令的下一條指令地址的-128~+127字節(jié)范圍內(nèi)。

             

            6        子程序

            子程序相當于高 級語言中的“過程”,(procedure)。程序中可以由調(diào)用程序(或稱主程序)調(diào)用這些子程序,而 在子程序執(zhí)行完后又返回調(diào)用程序繼續(xù)執(zhí)行。

            1.      CALL 調(diào)用指令                     //不影響標志位

            ⑴段內(nèi)直接調(diào)用

            執(zhí)行操作:當 操作長度為16位時,Push(IP)      (IP)←(IP)+D16

                                                      或(EIP)←( (EIP)+D16 )AND0000FFFFH

                     操作數(shù)長度 為32位時,Push(EIP)     (EIP)←(EIP)+D32

            指 令中DST給 出轉(zhuǎn)向地址(即子程序的入口地址,亦即子程序的第一條指令的地址),D16即為機器指令

            中 的位移量,它是轉(zhuǎn)向地址和返回地址之間的差值。

            ⑵段內(nèi)間接調(diào)用

            執(zhí)行操作:當 操作長度為16位時,Push(IP)      (IP)←(EA)

                                                      或(EIP)←(EA)AND0000FFFFH

                     操作數(shù)長度 為32位時,Push(EIP)     (EIP)←(EA)

            指 令中的DST可 使用寄存器尋址方式或任一種存儲器尋址方式,由指定的寄存器或存儲單元的內(nèi)容給出轉(zhuǎn)向地址。當操作長度為16位 時,則有效地址EA應(yīng) 為16位; 操作數(shù)長度為32位 時,EA應(yīng) 為32位。

            以上兩種 方式均為近調(diào)用,轉(zhuǎn)向地址中只包含其偏移地址部分,段地址是保持不變的。

             

            ⑶段直接調(diào)用

            執(zhí)行操作:當 操作長度為16位時,         Push(CS)               Push(IP)

                (IP)←DST指定的偏移地 址           (CS)←DST指定的段地址                               

            當操作長度為32位時,        Push(CS)              Push(EIP)

                 (EIP)←DST指定的偏移地 址             (CS)←DST指定的段地址       

            由 于調(diào)用程序和子程序不在同一段內(nèi),因此返回的地址的保存以及轉(zhuǎn)向地址的設(shè)置都必須把段地址考慮在內(nèi)。

            ⑷段間接調(diào)用

            執(zhí)行操作:當 操作長度為16位時,         Push(CS)               Push(IP)

                (IP)←(EA)           (CS)←(EA+2)                              

            當操作長度為32位時,        Push(CS)              Push(EIP)

                 (EIP)←(EA)            (CS)←(EA+4)  

            其 中EA是 由DST的 尋址方式確定的有效地址,這里可用任一種存儲器尋址方式來取得EA值。

             

            2.RET 返回指令                               //不影 響標志位

            RET指 令放在子程序的末尾,它使子程序在功能完成后返回調(diào)用程序繼續(xù)執(zhí)行,而返回地址是調(diào)用程序調(diào)用子程序(或稱轉(zhuǎn)子)時存放在堆棧中的,因此RET指令的操作是返回地址出棧送IP或EIP寄存器(段內(nèi)或段間)和CS寄存器(段間)。

            (1)段內(nèi)近返回               格式:RET

            執(zhí)行操作:當 操作數(shù)長度為16時,(IP)←POP()

                                386及后繼機型:(EIP)←(EIP)AND0000FFFFH

                      當操作數(shù)長 度為32位時,(EIP)←POP()

            (2)段內(nèi)帶立即數(shù)近返回       格式:RET    EXP

            執(zhí)行操作:在 執(zhí)行完與(1)的RET完全相同的操 作后,還需要修改堆棧指針:

                          (SP或ESP)←(SP或ESP)+D16

            其中EXP是一個表達式,根據(jù)它的值計算出來的常數(shù)成為機器指令中的位移量D16。這種指令允許返回地址出棧后修改堆棧的指針,這就便于調(diào)用程序在用CALL指令調(diào)用子程序以前把子程序所需要的參數(shù)入棧,以便子程序運行時使用這些參數(shù)。 當子程序返回后,這些參數(shù)已不在有用,就可以修改指針使其指向參數(shù)入棧以前的值。

            (3)段間遠返回               格式:RET

            執(zhí)行操作:當 操作數(shù)長度為16時,(IP)←POP()

                                386及后繼機型:(EIP)←(EIP)AND0000FFFFH

                                              (CS)←POP()

                      當操作數(shù)長 度為32位時,(EIP)←POP()

                                              (CS)←POP()(32位數(shù)出棧、高16位廢除)

             (4)段間 帶立即數(shù)遠返回       格式:RET    EXP

            執(zhí)行操作:在 執(zhí)行完與(3)的RET完全相同的操 作后,還需要修改堆棧指針:

                          (SP或ESP)←(SP或ESP)+D16

            這里EXP的含義及使用情況與帶立即數(shù)返回指令相同。

             

            7        中斷                        

            中斷分為內(nèi)部中斷和外部中斷兩類。內(nèi)部中斷包括像除法運算中所遇到需要除以0時

            產(chǎn)生的中斷,或者程序中為了做某些 處理而設(shè)置的中斷指令等。外部中斷則主要用來處理I/O設(shè)備與CPU之間的通信。

                   當CPU響應(yīng)一次中斷時,也要和調(diào)用子程序時類似地把(IP)或(EIP)和(CS)保存入棧。除此之外,為了能全面地保存現(xiàn)場信息,以便在中斷處理結(jié)束時返回 現(xiàn)場,還需要把反映現(xiàn)場狀態(tài)的(FLAGS)或(EFLAGS)保存入棧,然后才能轉(zhuǎn)到中斷例行程序去執(zhí)行。返回同理要恢復(FLAGS)或(EFLAGS)。

            中 斷例行程序入口地址稱為中斷向量。在80X86中,在實模式下工作時,存儲器的最低地址區(qū)的1024個字節(jié)(地址從00000H到003FFH)為中斷向量區(qū),其中存放著256種類型中斷例行程序的入口地址 (中斷向量)。由于每個中斷向量占有4個字節(jié)單元,所以中斷指令中指定的類型號N需要乘以4才能取得所指定類型的中斷向量。在保護模式下,中斷例行程序的入口通過中斷描 述符表找到找到中斷描述符來取得的。由于每個描述符為8字節(jié)長,所以類型號應(yīng)乘以8才能取得所指定類型的中斷描述符。

             

            (1)INT (interrupt)            中斷//不影響除IFTFAC以外的標志位

            格式:INT  TYPE 或 INT

            執(zhí)行操作:PUSH(FLAGS)

                      IF←0

                      TF←0

                      AC←0

                      PUSH(CS)

                      PUSH(IP)

                     (IP)←(TYPE * 4)

                     (CS)←(TYPE * 4+2)

            其中TYPE為類型號,它可以是常數(shù)或表達式,其 值必須在0~255范圍內(nèi),格式中的INT是一個字節(jié)的中斷指令,它隱含的類型 號為3。

            (2)INTO(interrupt if overflow)            如溢出則中斷//同上

            格式:INTO

            執(zhí)行操作:若OF = 1,則:PUSH(FLAGS)

                                    IF←0

                                    TF←0

                                    AC←0

            PUSH(CS)

                                    PUSH(IP)

                                   (IP)←(10H)

                                   (CS)←(12H)

            (3)IRET(return from interrupt)   從中斷返回//標志位由堆棧中取出來的值設(shè) 置

            格式:IRET                  適用于操作數(shù)長度為16位的情況

            執(zhí)行操作:(IP)←POP()      (CS)←POP()     (FLAGS)←POP()

            (4)IRETD(return from interrupt)  從 中斷返回 //標志位由堆棧中取出來的值設(shè)置

            格式:IRETD                 適用于操作數(shù)長度為32位的情況

            執(zhí)行操作:(IP)←POP()     (CS)←POP()      (EFLAGS)←POP()

             

                             處理機控制和雜項操作指令

            1.  標志處 理指令                   //只影響本指令指定的標志,而不影 響其他標志位

            ·CLC(clear carry)                  進位位置置零指令     CF←0

            ·CMC (complement carry)              進位位求反指令      CF←CF

            ·STC (set carry)                     進位位置1指令      CF←1

            ·CLD (clear direction)               方向標志位置0指令  DF←0

            ·STD (set direction)                 方向標志位置1指令  DF←1

            ·CLI (clear interrupt)               中斷標志置0指令    IF←0

            ·STI (set interrupt)                 中斷標志置1指令    IF←1

            2.  其它處 理機控制與雜項操作指令    //以下指令不影響條件碼

            (1)NOP(no operation)           無操作指令

            該 指令不執(zhí)行任何操作,其機器碼占有一個字節(jié)單元,在調(diào)試程序時往往用這條指令占有一定的存儲單元,以便在正式運行時用其他指令取代。

            (2)HLThalt                   停機

            該 指令可使機器暫停工作,使處理機處于停機狀態(tài)以等待一次外部中斷的到來,中斷結(jié)束后繼續(xù)執(zhí)行下面.

            (3)WAIT (wait)                    等待

            該 指令使處理機處于空轉(zhuǎn)狀態(tài),它也可以用來等待外部中斷發(fā)生,但中斷結(jié)束后仍返回WAIT指 令繼續(xù)等待。

            它 也可以與ESC指令配合等待協(xié)處理機的執(zhí)行結(jié)果。

            (4)ESC (escape)                   換碼    

            格式:   ESC   op,reg/mem

            這 條指令在使用協(xié)處理機時,可以指定由協(xié)處理器執(zhí)行的指令。指令的第一個操作數(shù)即指定其操作碼,第二個操作數(shù)即指定其操作數(shù)。自486起, 浮點協(xié)處理器已裝入CPU芯片,系統(tǒng)可以直接支持協(xié)處理器指令,因此ESC指 令已成為未定義指令,如遇到程序中的ESC指令將引起一次異常處理。

            (5)LOCK (lock)                       封鎖

            該 指令是一種前綴,它可以與其它指令聯(lián)合,用來維持總線的鎖存信號直到與其聯(lián)合的指令執(zhí)行完為止。當CPU與 其它協(xié)處理機協(xié)同工作時,該指令可避免破壞有用信息。

            LOCK前 綴可與下列指令聯(lián)用:

            BTS,BTR,BTC     mem,reg/imm

            XCHG       reg,mem

            XCHG       mem,reg

            ADD,OR,ADC,SBB,AND,SUB,XOR    mem,reg/imm

            NOT,NEG,INC,DEC    mem

            CMPXCHG,XADD

            (6)BOUND(bound)               界限

            格式:BOUND    reg,mem

            執(zhí)行操作:BOUND指令檢查給出的數(shù)組下標是否在規(guī)定 的上下界之內(nèi)。如在上下界之內(nèi),則執(zhí)行下一條指令;如超出了上下界范圍,則產(chǎn)生中斷5。如發(fā)生中斷,則中斷返回時返回地址仍指向BOUND指令,而不是其下一條指令。   指令中第一個操作數(shù)必須用寄存器,用來存放當前數(shù)組下標。當操作數(shù)長度為16位時,使用16位寄存器;而當操作數(shù)長度為32位時,則使用32位寄存器。第二個操作數(shù)必須使用存儲 器方式,該操作數(shù)用來存放數(shù)組的上下界。當操作數(shù)長度為16位時,使用相繼的兩個16位字存放下界和上界,下界存放在低地址所指定的字單元中,上界存放在高地址所指 定的字單元中。當操作數(shù)為32位時,使用相繼的兩個雙字來存放下界和上界。

             

            (7)ENTER   建立堆棧幀指令

            ENTER指令用于過程調(diào)用時為便于過程間傳 遞參數(shù)而建立堆棧幀所用。

            格式:ENTER   imm16,imm8

            執(zhí)行操作:指令中給出地兩個操作數(shù)均 為立即數(shù)。第一個操作數(shù)為16位立即數(shù),由其指定堆棧幀的大小,即其所占據(jù)的字節(jié)數(shù)。第二個操作數(shù)為8位立即數(shù),它給出過程的嵌套層數(shù),此數(shù)范圍應(yīng)為0~31。

            該指令完成 以下操作:

            ①PUSH(BP)或PUSH(EBP),以保存該寄存器的原始內(nèi)容。

            ②(BP)←(SP)或(EBP)←(ESP),使BP或EBP寄存器保存當前堆棧指針SP或ESP的內(nèi)容,以便在過程運行期間,以BP(或EBP)為基準訪問堆棧幀中存放的變量。

            ③(BP)←(SP)-imm16   或  (EBP)←(ESP)-imm16,這樣就建立了堆棧幀所占有的存儲空 間。

             

            (8)LEAVE   釋放堆棧幀指令

            LEAVE指令在程序中位于退出過程的RET指令之前,用來釋放由ENTER指令建立的堆棧幀存儲區(qū)。

            格式:LEAVE

            執(zhí)行操作:

            ①(SP)←(BP)或(ESP)←(ESP)

            ②(BP)←POP()或(EBP)←POP()

            from:
            http://blog.csdn.net/boyplayee/archive/2008/11/10/3266066.aspx

            posted on 2010-04-05 17:26 chatler 閱讀(1747) 評論(0)  編輯 收藏 引用 所屬分類: Assembly
            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個博客還是不錯,雖然做的東西和我不大相關(guān),覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久天天躁狠狠躁夜夜2020一| 久久人人爽人人爽人人片AV不| 久久免费精品一区二区| 久久精品www| 久久精品亚洲欧美日韩久久| 久久精品国产男包| 高清免费久久午夜精品| 久久久噜噜噜久久| 久久狠狠高潮亚洲精品| 国内精品久久久久久麻豆| 亚洲精品乱码久久久久久久久久久久| 国产欧美一区二区久久| 一级做a爰片久久毛片看看| 99久久精品免费| 久久亚洲日韩精品一区二区三区| 久久精品亚洲男人的天堂| 久久夜色精品国产噜噜麻豆| 人人狠狠综合久久亚洲| 91久久精品国产成人久久| 欧美黑人又粗又大久久久| 久久久久久久久久久精品尤物| 麻豆精品久久久一区二区| 久久夜色精品国产噜噜亚洲AV| 欧美伊人久久大香线蕉综合| 久久久久久国产精品免费免费| 国产精品久久亚洲不卡动漫| 亚洲国产精品久久久天堂| 久久久久亚洲AV成人网人人网站| 国内精品久久久久久久亚洲| 久久久久一区二区三区| 久久久久久a亚洲欧洲aⅴ | 九九精品99久久久香蕉| 国产精品久久久久久久人人看| 久久国产视屏| 午夜视频久久久久一区| 久久久久国色AV免费观看| 久久久中文字幕日本| 日本精品久久久久久久久免费| 久久国产视屏| 亚洲中文字幕无码一久久区| 伊人久久综合精品无码AV专区|