• <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                                                      傳送//不影響標(biāo)志位

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

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

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

            MOVSX (move with sign-extended)      帶符號(hào)擴(kuò)展傳送//不影響標(biāo)志位

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

            MOVZXmove with zero-extended    帶零擴(kuò)展傳送//不影響標(biāo)志位

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

            PUSH (push onto the stack)         進(jìn)棧//不 影響標(biāo)志位

            push    reg    mem          data   segreg

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

            pop    reg    mem     segreg

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

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

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

            PUSHA/PUSHAD(push all registers)   所有寄存器進(jìn)棧//不影響標(biāo)志位  

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

            PUSHAD:32位, 進(jìn)棧次序同PUSHA

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

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

            POPAD:32位, 進(jìn)棧次序同POPA.

            XCHGexchange                交換//不影響標(biāo)志

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

             

            2   累加器專用傳送指令

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

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

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

            XLATtranslate                換碼//不影響標(biāo)志位

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

             

            3   地址傳送指令

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

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

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

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

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

            LDS(load DS with pointer)              指針?biāo)图拇嫫骱虳S//不影響標(biāo)志位

            LES(load ES with pointer)              指針?biāo)图拇嫫骱虴S//不影響標(biāo)志位 

            LFS(load FS with pointer)               指針?biāo)图拇嫫骱虵S//不影響標(biāo)志位

            LGS(load GS with pointer)              指針?biāo)图拇嫫骱虶S//不影響標(biāo)志位

            LSS(load SS with pointer)               指針?biāo)图拇嫫骱蚐S//不影響標(biāo)志位

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

             

            4   標(biāo)志寄存器傳送指令

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

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

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

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

            PUSHF/PUSHFD                      標(biāo)志進(jìn)棧//由裝入值來確定標(biāo)志位值

            執(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)      標(biāo)志出棧//由裝入值來確定標(biāo)志位值

            執(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)換為字//不影響標(biāo)志位

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

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

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

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

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

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

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

             

                                             

            算術(shù)指令

            1 加法指令

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

            ADC(add with carry)         帶進(jìn)位加法//影響條件標(biāo)志位

            注:ADC這 條指令里,其中CF為進(jìn)位位的值。

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

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

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

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

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

            2 減法指令

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

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

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

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

            NEG(negate)                                 求補(bǔ)  //影響條件標(biāo)志位

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

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

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

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

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

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

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

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

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

            減 法的CF值反映無符號(hào)運(yùn)算中的借位情況,因此當(dāng)作無符號(hào)數(shù)運(yùn)算時(shí),若減數(shù)>被減數(shù),此時(shí)有借位,則CF=1;否則 CF=0。即有進(jìn)位時(shí)CF=0,無進(jìn)位時(shí)CF=1。

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

             

            3 乘法指令

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

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

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

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

            對(duì)于80286及其后繼機(jī)型,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ù)長(zhǎng)度相同

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

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

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

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

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

            對(duì) 于IMUL指令,如果乘積的高一半是低一半的符號(hào)擴(kuò)展,則CF和OF均為0,否則就為1。

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

            4   除法指令

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

            執(zhí) 行操作:(商和余數(shù)均為無符號(hào)數(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)               帶符號(hào)數(shù)除法//對(duì)所有條件碼均無定義

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

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

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

             

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

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

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

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

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

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

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

             

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

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

                                                                                     外,其余標(biāo)志位無定義

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

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

            放在AL寄存器。

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

            ②如AL寄 存器的低4位在十六進(jìn)制數(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標(biāo)志外,其余標(biāo)志位無定義

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

             

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

            在AL寄存器。

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

            ②如AL寄 存器的低4位在十六進(jìn)制數(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指 令,把兩個(gè)非壓縮的BCD碼相乘(此時(shí)要求其高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中存放個(gè)位數(shù),而且要求AH和AL中 的高4位均為0。 除數(shù)是一位非壓縮的BCD數(shù),同樣要求高4位 為0。在把這兩個(gè)數(shù)用DIV指 令相除以前,必須先用AAD指令把AX中 的被除數(shù)調(diào)整成二進(jìn)制數(shù),并存放在AL寄存器里。因此,AAD指 令執(zhí)行如上。

             

                                                                    邏輯指令

            邏輯運(yùn)算指令

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

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

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

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

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

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

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

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

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

            (DST)←(DST)⊕(SRC)

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

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

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

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

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

             

            2                  位 測(cè)試并修改指令

            BTbit test                         位測(cè)試//影響CF值,對(duì)其它位無定義

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

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

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

            BTR bit test and reset              位測(cè)試并置0//影響CF值,對(duì)其它位無定義

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

            BTC bit test and complement        位測(cè)試并變反//影響CF值,對(duì)其它位無定義

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

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

             

            3              位掃描指令

            BSF bit scan forward               正向位掃描//影響ZF位,其他標(biāo)志位無影響

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

            BSR bit scan reverse                反向位掃描//影響ZF位,其他標(biāo)志位無影響

            與BSF指 令唯一區(qū)別是BSR指令檢索從高位向低位,而BSF檢 索從低位開始第一個(gè)出現(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。 當(dāng)然其它機(jī)型可以直接把CNT寫成用8位 立即數(shù)指定范圍從1到31的 移位次數(shù)。

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

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

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

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

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

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

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

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

            移位指令常用來乘以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è)置,OF當(dāng)CNT=1時(shí)有效,否則無定義                

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

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

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

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

             

             


                  CF     OPR                           OPR         CF

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

             

             

             


                  CF     OPR                           OPR          CF

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

             

            3.雙精度移位指令

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

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

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

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

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

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

                   DST

            DST



             

             

             

            T

                                              0                                       0

              CF                                                                         CF

               

                   REG

                  REG

                                            0  0                                      0

                

                          雙精度左移                                   雙精度右移

             

                                        串處理指令

            特性:

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

                    字節(jié)

                    字

                  雙字

            方向(DF)

                向前(DF=0)

                        向后(DF=1)

            串長(zhǎng)度

                        1

                     重復(fù)REP(Count Reg)次

            源串((source-index))

            目的串((destination-index))

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

            在附加段中






             REP重 復(fù)串操作直到計(jì)數(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)重復(fù)(1)~(3)

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

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

             

            1     MOVS                            串傳送指令// 不影響標(biāo)志位

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

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

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

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

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

            ④建立方向標(biāo)志

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

             

            2     STOS                             存入串指令//不影響標(biāo)志位

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

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

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

             

            3    LODS                          從串取指令//不影響標(biāo)志位

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

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

             

            4    INS                             串輸入指令//不影響標(biāo)志位

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

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

             

            5    OUT                                 串輸出指令//不影響標(biāo)志位

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

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

             

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

            1.REPE/REPZ                     當(dāng)相等/為0時(shí)重復(fù)操作    

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

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

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

            2.  REPNE/REPNZ                 當(dāng)不相等//不為0時(shí)重 復(fù)串操作

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

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

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

            CMPS   SRC,DST             CMPSB           CMPSW            CMPSD

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

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

            SCAS   DST                   SCASB              SCASW         SCASD

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

             

                                                  控制轉(zhuǎn)移指令

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

                    2段間轉(zhuǎn)移:要轉(zhuǎn)到另一個(gè)段去執(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位 位移量是由目標(biāo)地址 OPR確 定。轉(zhuǎn)移的目標(biāo)地址在匯編格式中可直接使用符號(hào)地址,而在機(jī)器執(zhí)行時(shí)則是當(dāng)前的IP或EIP的 值(即JMP指 令的下一條指令的地址)與 指令中指定的8位 位移量之和。位移量既可表示向前又可表示向后移,是一個(gè)帶符號(hào)數(shù)。所以這種格式只允許在-128到+127字節(jié)范圍內(nèi)轉(zhuǎn)移

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

             

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

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

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

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

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

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

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

            格式:JS    OPR                            測(cè)試條件:SF=1

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

            格式:JNS   OPR                            測(cè)試條件:SF=0

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

            格式:JO    OPR                             測(cè)試條件:OF=1

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

            格式:JNO  OPR                              測(cè)試條件:OF=0

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

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

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

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

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

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

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

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

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

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

             

            2 比較兩個(gè)無 符號(hào)數(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)

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

             

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

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

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

             

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

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

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

             

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

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

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

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

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

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

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

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

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

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

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

            格式:JCXZ     OPR                                      測(cè)試條件:CX= 0

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

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

             

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

            格式:SETcc  DST

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

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

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

            測(cè)試條件: ZF = 1

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

            測(cè)試條件:ZF = 0

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

            測(cè)試條件:SF = 1

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

            測(cè)試條件:SF = 0

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

            測(cè)試條件:OF = 1

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

            測(cè)試條件:OF = 0

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

            測(cè)試條件:PF = 1

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

            測(cè)試條件:PF = 0

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

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

            測(cè)試條件:CF = 1

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

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

            測(cè)試條件:CF = 0

            2.比較兩個(gè) 無符號(hào)數(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)

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

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

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

            測(cè)試條件:CFZF=1

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

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

            測(cè)試條件:CFZF=0

             

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

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

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

            測(cè)試條件:  SFOF = 1

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

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

            測(cè)試條件:   SFOF = 0

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

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

            測(cè)試條件:SFOF)∨ZF=1

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

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

            測(cè)試條件:SFOF)∨ZF=0

             

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

            使用相對(duì)尋址方式

            (1)LOOP                          循環(huán)

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

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

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

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

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

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

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

            ② 檢查是否滿足測(cè)試條件,如滿足且操作數(shù)長(zhǎng)度為16位,則(IP)←(IP)+D8的符號(hào)擴(kuò)展;如滿足且操作數(shù)長(zhǎng)度為32位,則(EIP)←(EIP)+D8的符號(hào)擴(kuò)展;

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

             

            6        子程序

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

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

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

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

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

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

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

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

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

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

                                                      或(EIP)←(EA)AND0000FFFFH

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

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

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

             

            ⑶段直接遠(yuǎn)調(diào)用

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

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

            當(dāng)操作長(zhǎng)度為32位時(shí),        Push(CS)              Push(EIP)

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

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

            ⑷段間接遠(yuǎn)調(diào)用

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

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

            當(dāng)操作長(zhǎng)度為32位時(shí),        Push(CS)              Push(EIP)

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

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

             

            2.RET 返回指令                               //不影 響標(biāo)志位

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

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

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

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

                      當(dāng)操作數(shù)長(zhǎng) 度為32位時(shí),(EIP)←POP()

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

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

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

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

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

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

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

                                              (CS)←POP()

                      當(dāng)操作數(shù)長(zhǎng) 度為32位時(shí),(EIP)←POP()

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

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

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

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

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

             

            7        中斷                        

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

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

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

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

             

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

            格式:INT  TYPE 或 INT

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

                      IF←0

                      TF←0

                      AC←0

                      PUSH(CS)

                      PUSH(IP)

                     (IP)←(TYPE * 4)

                     (CS)←(TYPE * 4+2)

            其中TYPE為類型號(hào),它可以是常數(shù)或表達(dá)式,其 值必須在0~255范圍內(nèi),格式中的INT是一個(gè)字節(jié)的中斷指令,它隱含的類型 號(hào)為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)   從中斷返回//標(biāo)志位由堆棧中取出來的值設(shè) 置

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

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

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

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

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

             

                             處理機(jī)控制和雜項(xiàng)操作指令

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

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

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

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

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

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

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

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

            2.  其它處 理機(jī)控制與雜項(xiàng)操作指令    //以下指令不影響條件碼

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

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

            (2)HLThalt                   停機(jī)

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

            (3)WAIT (wait)                    等待

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

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

            (4)ESC (escape)                   換碼    

            格式:   ESC   op,reg/mem

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

            (5)LOCK (lock)                       封鎖

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

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

             

            (7)ENTER   建立堆棧幀指令

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

            格式:ENTER   imm16,imm8

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

            該指令完成 以下操作:

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

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

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

             

            (8)LEAVE   釋放堆棧幀指令

            LEAVE指令在程序中位于退出過程的RET指令之前,用來釋放由ENTER指令建立的堆棧幀存儲(chǔ)區(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 閱讀(1731) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Assembly

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(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

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲午夜精品久久久久久浪潮| 久久综合偷偷噜噜噜色| 国产精品一区二区久久精品涩爱| 成人亚洲欧美久久久久| 狠狠色丁香婷综合久久| 精品人妻久久久久久888| 久久人妻少妇嫩草AV蜜桃| 久久国产成人| 国产午夜精品理论片久久| 一本一道久久精品综合| 久久午夜电影网| 久久国产精品视频| 久久精品国产清自在天天线| 国产精品欧美久久久久无广告 | 国产一久久香蕉国产线看观看| 久久精品卫校国产小美女| 久久精品国产色蜜蜜麻豆| 亚洲AV无码久久| www性久久久com| 国产99久久久国产精免费| 久久av高潮av无码av喷吹| 久久精品无码专区免费| 99久久这里只精品国产免费 | 久久久久人妻一区二区三区| 久久久亚洲裙底偷窥综合| 久久久久久精品成人免费图片| 久久精品国产色蜜蜜麻豆| 精品久久久久中文字幕日本| 久久99精品久久久久久| 国内精品久久久久久中文字幕| 少妇久久久久久被弄到高潮| 午夜精品久久久久久99热| 国产精品久久一区二区三区| 久久伊人色| 久久久久免费看成人影片| 丁香久久婷婷国产午夜视频| 久久国产免费直播| 91性高湖久久久久| 久久99久国产麻精品66| 91久久精品国产成人久久| 精品久久人人爽天天玩人人妻|