青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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ù)是無(wú)符號(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)志寄存器//由裝入值來(lái)確定標(biāo)志位值

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

PUSHF/PUSHFD                      標(biāo)志進(jìn)棧//由裝入值來(lái)確定標(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)志出棧//由裝入值來(lái)確定標(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位 可以用來(lái)表示帶符號(hào)數(shù)溢出,CF位則可以用來(lái)表示無(wú)符號(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說(shuō)明帶符號(hào) 數(shù)的減法溢出,結(jié)果錯(cuò)誤。

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

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

 

3 乘法指令

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

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

執(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是 說(shuō)明溢出的。其它標(biāo)志位無(wú)定義。

4   除法指令

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

執(zhí) 行操作:(商和余數(shù)均為無(wú)符號(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ì)所有條件碼均無(wú)定義

執(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è)問(wèn)題,除法指令要求字節(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)志位無(wú)定義,影響其它位

執(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)志位無(wú)定義,影響其它位
執(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)志位無(wú)定義

執(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, 則跳過(guò)第②步,執(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)志位無(wú)定義

執(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, 則跳過(guò)第②步,執(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位無(wú)定義

執(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位無(wú)定義

執(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位無(wú)定義

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

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

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

執(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位無(wú)定義

(DST)←(DST)⊕(SRC)

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

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

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

執(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ì)其它位無(wú)定義

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

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

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

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

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

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

執(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)志位無(wú)影響

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

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

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

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

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

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

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

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

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

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

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

移位指令常用來(lái)乘以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í)有效,否則無(wú)定義                

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的 值來(lái)取代。

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

       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只 提供給匯編程序做類型檢查用,并且不允許用其他尋址方式來(lái)確定操作數(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) 容。指令允許使用段跨越前綴來(lá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        無(wú)條件轉(zhuǎn)移指令

JMP(jump)                              無(wú)條件轉(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è)無(wú) 符號(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è) 無(wú)符號(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來(lái)表示轉(zhuǎn)向地址與當(dāng)前IP(或EIP)值的差。由于位移量只有8位,所以轉(zhuǎn)向地址必須在該循環(huán)指令的下一條指令地址的-128~+127字節(jié)范圍內(nèi)。

 

6        子程序

子程序相當(dāng)于高 級(jí)語(yǔ)言中的“過(guò)程”,(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ǔ)器尋址方式來(lái)取得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ì)算出來(lái)的常數(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è)置的中斷指令等。外部中斷則主要用來(lái)處理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ù)模式下,中斷例行程序的入口通過(guò)中斷描 述符表找到找到中斷描述符來(lái)取得的。由于每個(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)志位由堆棧中取出來(lái)的值設(shè) 置

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

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

(4)IRETD(return from interrupt)  從 中斷返回 //標(biāo)志位由堆棧中取出來(lái)的值設(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)           無(wú)操作指令

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

(2)HLThalt                   停機(jī)

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

(3)WAIT (wait)                    等待

該 指令使處理機(jī)處于空轉(zhuǎn)狀態(tài),它也可以用來(lá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)合,用來(lái)維持總線的鎖存信號(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ù)必須用寄存器,用來(lái)存放當(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ù)用來(lái)存放數(shù)組的上下界。當(dāng)操作數(shù)長(zhǎng)度為16位時(shí),使用相繼的兩個(gè)16位字存放下界和上界,下界存放在低地址所指定的字單元中,上界存放在高地址所指 定的字單元中。當(dāng)操作數(shù)為32位時(shí),使用相繼的兩個(gè)雙字來(lái)存放下界和上界。

 

(7)ENTER   建立堆棧幀指令

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

格式:ENTER   imm16,imm8

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

該指令完成 以下操作:

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

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

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

 

(8)LEAVE   釋放堆棧幀指令

LEAVE指令在程序中位于退出過(guò)程的RET指令之前,用來(lái)釋放由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 閱讀(1758) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Assembly

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


<2009年5月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

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

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)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲人体偷拍| 亚洲美女尤物影院| 欧美成人日本| 欧美国产视频在线观看| 中文亚洲欧美| 午夜久久tv| 在线看欧美日韩| 亚洲九九爱视频| 国产精品视频自拍| 久久夜色精品一区| 欧美大片专区| 午夜精品久久99蜜桃的功能介绍| 欧美一区二区免费观在线| 在线观看一区二区精品视频| 亚洲激情啪啪| 国产欧美韩国高清| 欧美韩国一区| 国产精品毛片一区二区三区| 美日韩精品免费观看视频| 欧美精品在线视频| 久久精彩视频| 欧美精品国产精品日韩精品| 欧美一级在线视频| 免费人成网站在线观看欧美高清| 亚洲一区二区高清| 久久精品一区中文字幕| 一本色道久久| 欧美在线观看你懂的| 日韩午夜在线播放| 欧美亚洲自偷自偷| 99在线|亚洲一区二区| 亚洲欧美日韩直播| 亚洲巨乳在线| 欧美在线www| 亚洲图片欧美一区| 久久麻豆一区二区| 亚洲欧美日韩国产中文 | 亚洲婷婷在线| 久久久久久久综合色一本| 中文在线不卡视频| 久久久欧美精品| 亚洲中午字幕| 欧美凹凸一区二区三区视频| 欧美一区免费视频| 欧美精品偷拍| 免费成人av| 国产精品日韩一区| 亚洲激精日韩激精欧美精品| 国产一区二区三区奇米久涩 | 亚洲国产视频一区| 国产网站欧美日韩免费精品在线观看| 亚洲激情综合| 在线日本高清免费不卡| 亚洲一区二区三区高清不卡| 亚洲理伦在线| 久久久久国内| 欧美中文字幕视频| 欧美四级在线观看| 亚洲国产一区二区三区高清| 精品51国产黑色丝袜高跟鞋| 亚洲永久在线观看| 一区二区三区|亚洲午夜| 看欧美日韩国产| 久久久av水蜜桃| 国产精品久久久久秋霞鲁丝 | 国语对白精品一区二区| 亚洲性视频网站| 一区二区高清| 欧美成人首页| 欧美高清在线精品一区| 狠狠爱综合网| 欧美一区二区三区视频| 午夜精品久久久久久久男人的天堂| 欧美激情 亚洲a∨综合| 欧美国产一区在线| 韩国一区二区三区美女美女秀| 亚洲一区二区三区国产| 亚洲一区免费| 欧美日韩一区二区视频在线观看| 亚洲国产日日夜夜| 最新国产乱人伦偷精品免费网站| 久久精品视频网| 久久久噜噜噜久久中文字免| 国产伦精品一区二区三区照片91| 亚洲特黄一级片| 亚洲午夜精品久久久久久app| 欧美精品色综合| 91久久久在线| 99re6热只有精品免费观看| 欧美高清视频www夜色资源网| 欧美黑人一区二区三区| 亚洲国产高清视频| 噜噜噜久久亚洲精品国产品小说| 久热精品在线视频| 激情综合亚洲| 久久蜜桃资源一区二区老牛| 狂野欧美激情性xxxx| 黄网站免费久久| 久久久国产一区二区| 麻豆成人精品| 亚洲高清视频的网址| 女人香蕉久久**毛片精品| 亚洲成人资源| 99国产精品久久久久久久久久 | 国产精品系列在线| 午夜精品久久久久久久99热浪潮| 久久av二区| 国产一区91| 久久久久综合| 亚洲国产成人在线视频| 99精品视频免费在线观看| 欧美日韩国产色综合一二三四 | 好吊妞**欧美| 狂野欧美一区| 亚洲国产精品va在看黑人| 99精品热视频| 一区二区视频免费在线观看 | 欧美高清视频一区| 91久久精品久久国产性色也91| 免费看av成人| 亚洲狼人精品一区二区三区| 亚洲自拍另类| 国产亚洲福利| 美女脱光内衣内裤视频久久影院| 亚洲国产另类 国产精品国产免费| 99re6这里只有精品| 国产精品99一区| 性欧美xxxx大乳国产app| 久久婷婷综合激情| 亚洲精品久久久久| 欧美日韩一区二区国产| 午夜精品福利一区二区三区av| 久久亚洲私人国产精品va| 亚洲欧洲美洲综合色网| 欧美日韩综合视频网址| 亚洲欧美国产日韩中文字幕| 老司机67194精品线观看| 亚洲精品一区二区三区av| 欧美三级中文字幕在线观看| 亚洲欧美日韩爽爽影院| 欧美成人国产va精品日本一级| 99精品视频一区| 国产免费成人av| 久久永久免费| 亚洲最新中文字幕| 久久久91精品国产一区二区三区| 亚洲激情国产精品| 国产精品扒开腿做爽爽爽视频| 欧美在线观看视频在线| 亚洲精美视频| 欧美一区二区三区久久精品茉莉花 | 一区二区三区日韩欧美精品| 国产精品亚洲片夜色在线| 久久这里有精品15一区二区三区| 日韩亚洲欧美精品| 久久男人资源视频| 9国产精品视频| 国产一区二区三区观看 | 欧美日韩精品中文字幕| 欧美一区二区精品久久911| 亚洲国产高清一区| 欧美一级专区| 亚洲麻豆av| 韩国在线一区| 欧美午夜国产| 美女在线一区二区| 亚洲欧美成人网| 亚洲黄色av一区| 久久久久www| 亚洲一品av免费观看| 亚洲高清不卡在线| 国产精品综合久久久| 欧美激情自拍| 久久九九热免费视频| 亚洲天堂视频在线观看| 欧美激情视频在线免费观看 欧美视频免费一 | 久久国产精品久久久| 日韩视频在线观看| 国产在线拍偷自揄拍精品| 欧美日韩国产影片| 久久综合九色综合网站| 亚洲欧美在线观看| 日韩视频永久免费| 欧美电影美腿模特1979在线看| 欧美一区三区三区高中清蜜桃| 99精品热6080yy久久 | 久久香蕉国产线看观看av| 亚洲一区三区电影在线观看| 亚洲国产精品黑人久久久 | 欧美日韩视频专区在线播放 | 欧美日韩国产成人在线观看| 久久久噜噜噜久久中文字免| 亚洲影院色无极综合| 亚洲精选视频在线| 欧美国产日韩一二三区| 久久久久99精品国产片| 午夜日韩在线观看| 一本一本a久久| 亚洲欧洲一区二区在线观看| 狠色狠色综合久久|