官术网_书友最值得收藏!

  • 計算機系統平臺
  • 王曉英 曹騰飛 孟永偉 黃建強
  • 5705字
  • 2019-10-18 19:26:04

2.3 指令系統舉例

2.3.1 Intel 8086/8088指令系統

8086微處理器是由英特爾公司于1976年開始設計,1978年年中發布的Intel第一款16位微處理器,同時也是x86架構的開端。1979年,英特爾又推出了Intel 8088,8088在芯片的外部接口使用8位數據總線,使得8088成為8086的一個低成本的簡化產品。而最初的IBM PC使用8088微處理器。

8086/8088指令系統的指令按功能可分為六大類:傳送類指令、算術運算類指令、位操作類指令、串操作類指令、程序轉移類指令、處理器控制類指令。下面分別介紹這幾類指令。

1.數據傳送指令

(1)通用數據傳送指令

MOV(Move)傳送

PUSH(Push onto the stack)進棧

POP(Pop from the stack)出棧

XCHG(Exchange)交換

MOV傳送指令

格式為:MOV DST,SRC

執行的操作:(DST)←(SRC)

?PUSH進棧指令

格式為:PUSH SRC

執行的操作:(SP)←(SP)-2

((SP)+1,(SP))←(SRC)

?POP出棧指令

格式為:POP DST

執行的操作:(DST)←((SP+1),(SP))

(SP)←(SP)+2

?XCHG交換指令

格式為:XCHG OPR1,OPR2

執行的操作:(OPR1)?(OPR2)

(2)累加器專用傳送指令

IN(Input)輸入

OUT(Output)輸出

XLAT(Translate)換碼

這組指令只限于使用累加器AX或AL傳送信息。

?IN輸入指令

長格式為:IN AL,PORT(字節)

IN AX,PORT(字)

執行的操作:(AL)←(PORT)(字節)

(AX)←(PORT+1,PORT)(字)

短格式為:IN AL,DX(字節)

IN AX,DX(字)

執行的操作:AL←((DX))(字節)

AX←((DX)+1,DX)(字)

?OUT輸出指令

長格式為:OUT PORT,AL(字節)

OUT PORT,AX(字)

執行的操作:(PORT)←(AL)(字節)

(PORT+1 ,PORT)←(AX)(字)

短格式為:OUT DX,AL(字節)

OUT DX,AX(字)

執行的操作:((DX))←(AL)(字節)

((DX)+1,(DX))←AX(字)

IBM PC的外圍設備最多可有65536個I/O端口,端口(即外設的端口地址)為0000~FFFFH。其中前256個端口(0~FFH)可以直接在指令中指定,這就是長格式中的PORT,此時機器指令用兩個字節表示,第二個字節就是端口號。所以用長格式時可以在指令中直接指定端口號,但只限于前256個端口。當端口號≥256時,只能使用短格式,此時,必須先把端口號放到DX寄存器中(端口號可以從0000到0FFFFH),然后再用IN或OUT指令來傳送信息。

?XLAT換碼指令

格式為:XLAT OPR

或:XLAT

執行的操作:(AL)←((BX)+(AL))

(3)有效地址傳送寄存器指令

LEA(Load effective address)有效地址傳送寄存器

LDS(Load DS with Pointer)指針傳送寄存器和DS

LES(Load ES with Pointer)指針傳送寄存器和ES

?LEA有效地址傳送寄存器

格式為:LEA REG,SRC

執行的操作:(REG)←SRC

指令把源操作數的有效地址送到指定的寄存器中。

?LDS指針傳送寄存器和DS指令

格式為:LDS REG,SRC

執行的操作:(REG)←(SRC)

(DS)←(SRC+2)

把源操作數指定的4個相繼字節送到由指令指定的寄存器及DS寄存器中,該指令常

指定SI寄存器。

?LES指針傳送寄存器和ES指令

格式為:LES REG,SRC

執行的操作:(REG)←(SRC)

(ES)←(SRC+2)

把源操作數指定的4個相繼字節送到由指令指定的寄存器及ES寄存器中,該指令常

指定DI寄存器。

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

LAHF(Load AH with flags)標志傳送AH

SAHF(store AH into flags)AH傳送標志寄存器

PUSHF(push the flags)標志進棧

POPF(pop the flags)標志出棧

?LAHF標志傳送AH指令

格式為:LAHF

執行的操作:(AH)←(PSW的低字節)

?SAHF AH傳送標志寄存器指令

格式為:SAHF

執行的操作:(PSW的低字節)←(AH)

?PUSHF標志進棧指令

格式為:PUSHF

執行的操作:(SP)←(SP)-2

((SP)+1,(SP))←(PSW)

?POPF標志出棧指令

格式為:POPF

執行的操作:(PWS)←((SP)+1,(SP))

(SP)←(SP+2)

2.算術指令

(1)加法指令

ADD(add)加法

ADC(add with carry)帶進位加法

INC(increment)加1

?ADD加法指令

格式:ADD DST,SRC

執行的操作:(DST)←(SRC)+(DST)

?ADC帶進位加法指令

格式:ADC DST,SRC

執行的操作:(DST)←(SRC)+(DST)+CF

?INC加1指令

格式:INC OPR

執行的操作:(OPR)←(OPR)+1

(2)減法指令

SUB(subtract)減法

SBB(subtract with borrow)帶借位減法

DEC(Decrement)減1

NEG(Negate)求補

CMP(Compare)比較

?SUB減法指令

格式:SUB DST,SRC

執行的操作:(DST)←(DST)-(SRC)

?SBB帶借位減法指令

格式:SBB DST,SRC

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

?DEC減1指令

格式:DEC OPR

執行的操作:(OPR)←(OPR)-1

?NEG求補指令

格式:NEG OPR

執行的操作:(OPR)←~(OPR)

?CMP比較指令

格式:CMP OPR1,OPR2

執行的操作:(OPR1)-(OPR2)

該指令與SUB指令一樣執行減法操作,但不保存結果,只是根據結果設置相關的條件標志位。

(3)乘法指令

MUL(Unsigned Multiple)無符號數乘法

IMUL(Signed Multiple)帶符號數乘法

?MUL無符號數乘法指令

格式:MUL SRC

執行的操作:(AX)←(AL)*(SRC)(字節)

(DX,AX)←(AX)*(SRC)(字)

?IMUL帶符號數乘法指令

格式:IMUL SRC

執行的操作:與MUL相同,但必須是帶符號數,而MUL是無符號數。

(4)除法指令

DIV(Unsigned divide)無符號數除法

IDIV(Signed divide)帶符號數除法

CBW(Convert byte to word)字節轉換為字

CWD(Convert word to double word)字轉換為雙字

?DIV無符號數除法指令

格式:DIV SRC

執行的操作:

字節操作:(AL)←(AX)/(SRC)的商

(AH)←(AX)/(SRC)的余數

字操作:(AX)←(DX,AX)/(SRC)的商

(AX)←(DX,AX)/(SRC)的余數

?IDIV帶符號數除法指令

格式:DIV SRC

執行的操作:與DIV相同,但操作數必須是帶符號數,商和余數也均為帶符號數,且余數的符號與被除數的符號相同。

?CBW字節轉換為字指令

格式:CBW

執行的操作:AL的內容符號擴展到AH。即如果(AL)的最高有效位為0,則(AH)=00;如(AL)的最高有效位為1,則(AH)=0FFH。

?CWD字轉換為雙字指令

格式:CWD

執行的操作:AX的內容符號擴展到DX。即如(AX)的最高有效位為0,則(DX)=0;否則(DX)=0FFFFH。

這兩條指令都不影響條件碼。

3.邏輯指令

(1)邏輯運算指令

AND(and)邏輯與

OR(or)邏輯或

NOT(not)邏輯非

XOR(exclusive or)異或

TEST(test)測試

?AND邏輯與指令

格式:AND DST,SRC

執行的操作:(DST)←(DST)∧(SRC)

?OR邏輯或指令

格式:OR DST,SRC

執行的操作:(DST)←(DST)∨(SRC)

?NOT邏輯非指令

格式:NOT OPR

執行的操作:(OPR)←┓(OPR)

?XOR異或指令

格式:XOR DST,SRC

執行的操作:(DST)←(DST)⊕(SRC)

?TEST測試指令

格式:TEST OPR1,OPR2

執行的操作:(DST)∧(SRC)

兩個操作數相與的結果不保存,只根據其特征置條件碼。

(2)移位指令

SHL(shift logical left)邏輯左移

SAL(shift arithmetic left)算術左移

SHR(shift logical right)邏輯右移

SAR(shift arithmetic right)算術右移

ROL(rotate left)循環左移

ROR(rotate right)循環右移

RCL(rotate left through carry)帶進位循環左移

RCR(rotate right through carry)帶進位循環右移

格式:SHL OPR,CNT(其余的類似)

其中,OPR可以是除立即數以外的任何尋址方式。移位次數由CNT決定,CNT可以是1或CL。

循環移位指令可以改變操作數中所有位的位置;移位指令則常常用來做乘以2或除以2操作。其中算術移位指令適用于帶符號數運算,SAL用來乘2,SAR用來除以2;而邏輯移位指令則用于無符號數運算,SHL用來乘2,SHR用來除以2。

4.串處理指令

(1)與REP相配合工作的MOVS,STOS和LODS指令

?REP重復串操作直到(CX)=0為止

格式:REP StringPrimitive

其中,StringPrimitive可為MOVS、LODS或STOS指令。

執行的操作:

①如(CX)=0則退出REP,否則往下執行。

②(CX)←(CX)-1。

③執行其中的串操作。

④重復①~③。

?MOVS串傳送指令

格式(有三種):

MOVS DST,SRC

MOVS B(字節)

MOVS W(字)

其中第二、三種格式明確注明是傳送字節或字,第一種格式則應在操作數中表明是字還是字節操作,例如:

MOVS ES:BYTE PTR[DI],DS:[SI]

執行的操作:

①((DI))←((SI))。

②字節操作:

(SI)←(SI)+(或-)1,(DI)←(DI)+(或-)1

當方向標志DF=0時用“+”,當方向標志DF=1時用“-”。

③字操作:

(SI)←(SI)+(或-)2,(DI)←(DI)+(或-)2

當方向標志DF=0時用“+”,當方向標志DF=1時用“-”。

該指令不影響條件碼。

CLD(Clear direction flag)該指令使DF=0,在執行串操作指令時可使地址自動增量;

STD(Set direction flag)該指令使DF=1,在執行串操作指令時可使地址自動減量。

?STOS存入串指令

格式:STOS DST

STO SB(字節)

STOS W(字)

執行的操作:

字節操作:((DI))←(AL),(DI)←(DI)+/-1

字操作:((DI))←(AX),(DI)←(DI)+/-2

該指令把AL或AX的內容存入由(DI)指定的附加段的某單元中,并根據DF的值及數據類型修改DI的內容,當它與REP聯用時,可把AL或AX的內容存入一個長度為(CX)的緩沖區中。

?LODS從串取指令

格式:LODS SRC

LODS B

LODS W

執行的操作:

字節操作:(AL)←((SI)),(SI)←(SI)+/-1

字操作:(AX)←((SI)),(SI)←(SI)+/-2

該指令把由(SI)指定的數據段中某單元的內容送到AL或AX中,并根據方向標志及數據類型修改SI的內容。指令允許使用段跨越前綴來指定非數據段的存儲區。該指令也不影響條件碼。

一般地,該指令不和REP連用。有時緩沖區中的一串字符需要逐次取出來測試時,可使用該指令。

(2)與REPE/REPZ和REPNZ/REPNE聯合工作的CMPS和SCAS指令

?REPE/REPZ當相等/為零時重復串操作

格式:REPE(或REPZ)StringPrimitive

其中StringPrimitive可為CMPS或SCAS指令。

執行的操作:

①如(CX)=0或ZF=0(即某次比較的結果兩個操作數不等)時退出,否則往下執行。

②(CX)←(CX)-1。

③執行其后的串指令。

④重復①~③。

?REPNE/REPNZ當不相等/不為零時重復串操作

格式:REPNE(或REPNZ)StringPrimitive

其中StringPrimitive可為CMPS或SCAS指令。

執行的操作:

除退出條件(CX=0)或ZF=1外,其他操作與REPE完全相同。

?CMPS串比較指令

格式:CMP SRC,DST

CMPS B

CMPS W

執行的操作:

①((SI))-((DI))

②字節操作:(SI)←(SI)+/-1,(DI)←(DI)+/-1

字操作:(SI)←(SI)+/-2,(DI)←(DI)+/-2

指令把由(SI)指向的數據段中的一個字(或字節)與由(DI)指向的附加段中的一個字(或字節)相減,但不保存結果,只根據結果設置條件碼,指令的其他特性和MOVS指令的規定相同。

?SCAS串掃描指令

格式:SCAS DST

SCAS B

SCAS W

執行的操作:

字節操作:(AL)-((DI)),(DI)←(DI)+/-1

字操作:(AL)-((DI)),(DI)←(DI)+/-2

該指令把AL(或AX)的內容與由(DI)指定的在附加段中的一個字節(或字)進行比較,并不保存結果,只根據結果置條件碼。指令的其他特性和MOVS的規定相同。

5.控制轉移指令

(1)無條件轉移指令:JMP(jmp)跳轉指令

①段內直接短轉移

格式:JMP SHORT OPR

執行的操作:(IP)(或-)(IP)+8位位移量

②段內直接近轉移

格式:JMP NEAR PTR OPR

執行的操作:(IP)(或-)(IP)+16位位移量

③段內間接轉移

格式:JMP WORD PTR OPR

執行的操作:(IP)(或-)(EA)

④段間直接(遠)轉移

格式:JMP FAR PTR OPR

執行的操作:(IP)(或-)OPR的段內偏移地址

(CS)(或-)OPR所在段的段地址

⑤段間間接轉移

格式:JMP DWORD PTR OPR

執行的操作:(IP)(或-)(EA)

(CS)(或-)(EA+2)

(2)條件轉移指令

①根據單個條件標志的設置情況轉移

?JZ(或JE)(Jump if zero,or equal)結果為零(或相等)則轉移

格式:JE(或JZ)OPR

測試條件:ZF=1

?JNZ(或JNE)(Jump if not zero,or not equal)結果不為零(或不相等)則轉移

格式:JNZ(或JNE)OPR

測試條件:ZF=0

?JS(Jump if sign)結果為負則轉移

格式:JS OPR

測試條件:SF=1

?JNS(Jump if not sign)結果為正則轉移

格式:JNS OPR

測試條件:SF=0

?JO(Jump if overflow)溢出則轉移

格式:JO OPR

測試條件:OF=1

?JNO(Jump if not overflow)不溢出則轉移

格式:JNO OPR

測試條件:OF=0

?JP(或JPE)(Jump if parity,or parity even)奇偶位為1則轉移

格式:JP OPR

測試條件:PF=1

?JNP(或JPO)(Jump if not parity,or parity odd)奇偶位為0則轉移

格式:JNP(或JPO)OPR

測試條件:PF=0

?JB(或JNAE,JC)(Jump if below,or not above or equal,or carry)低于,或者不高于或等于,或進位位為1則轉移

格式:JB(或JNAE,JC)OPR

測試條件:CF=1

?JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry)不低于,或者高于或者等于,或進位位為0則轉移

格式:JNB(或JAE,JNC)OPR

測試條件:CF=0

②比較兩個無符號數,并根據比較的結果轉移

?JB(或JNAE,JC)低于,或者不高于或等于,或進位位為1則轉移

格式:CF=1

?JNB(或JAE,JNC)不低于,或者高于或者等于,或進位位為0則轉移

格式:CF=0

?JBE(或JNA)(Jump if below or equal,or not above)低于或等于,或不高于則轉移

格式:JBE(或JNA)OPR

測試條件:CF ? ZF=1

?JNBE(或JA)(Jump if not below or equal,or above)不低于或等于,或者高于則轉移

格式:JNBE(或JA)OPR

測試條件:CF ? ZF=0

③比較兩個帶符號數,并根據比較的結果轉移

?JL(或LNGE)(Jump if less,or not greater or equal)小于,或者不大于或者等于則轉移

格式:JL(或JNGE)OPR

測試條件:SF ? OF=1

?JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于則

轉移

格式:JNL(或JGE)OPR

測試條件:SF ? OF=0

?JLE(或JNG)(Jump if less or equal,or not greater)小于或等于,或者不大于則轉

格式:JLE(或JNG)OPR

測試條件:(SF ? OF) ? ZF=1

?JNLE(或JG)(Jump if not less or equal,or greater)不小于或等于,或者大于則轉移

格式:JNLE(或JG)OPR

測試條件:(SF ? OF) ? ZF=0

④測試CX的值為0則轉移指令

?JCXZ(Jump if CX register is zero)CX寄存器的內容為零則轉移

格式:JCXZ OPR

測試條件:(CX)=0

注:條件轉移全為8位短跳。

(3)循環指令

?LOOP循環指令

格式:LOOP OPR

測試條件:(CX)<>0

?LOOPZ/LOOPE當為零或相等時循環指令

格式:LOOPZ(或LOOPE)OPR

測試條件:(CX)<>0且ZF=1

?LOOPNZ/LOOPNE當不為零或不相等時循環指令

格式:LOOPNZ(或LOOPNE)OPR

測試條件:(CX)<>0且ZF=0

這三條指令的步驟是:

① (CX)←(CX)-1。

②檢查是否滿足測試條件,如滿足則(IP)←(IP)+D8的符號擴充。

(4)子程序

?CALL調用指令

?RET返回指令

(5)中斷

?INT指令

格式:INT TYPE

或INT

?INTO若溢出則中斷

?IRET從中斷返回指令

格式:IRET

6.處理機控制指令

(1)標志處理指令

?CLC進位位置0指令(Clear carry)CF←0

?CMC進位位求反指令(Complement carry)CF←CF

?STC進位位置1指令(Set carry)CF←1

?CLD方向標志置0指令(Clear direction)DF←0

?STD方向標志置1指令(Set direction)DF←1

?CLI中斷標志置0指令(Clear interrupt)IF←0

?STI中斷標志置1指令(Set interrupt)IF←0

(2)其他處理機控制指令

NOP(No Opreation)無操作

HLT(Halt)停機

WAIT(Wait)等待

ESC(Escape)換碼

LOCK(Lock)封鎖

這些指令可以控制處理機狀態,它們都不影響條件碼。

①NOP無操作指令

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

②HLT停機指令

該指令可使機器暫停工作,使處理機處于停機狀態以便等待一次外部中斷到來,中斷結束后可繼續執行下面的程序。

③WAIT等待指令

該指令使處理機處于空轉狀態,它也可以用來等待外部中斷的發生,但中斷結束后仍返回WAIT指令繼續執行。

④ESC換碼指令

格式ESC mem

其中mem指出一個存儲單元,ESC指令把該存儲單元的內容送到數據總線去。當然ESC指令不允許使用立即數和寄存器尋址方式。這條指令在使用協處理機(Coprocessor)執行某些操作時,可從存儲器取得指令或操作數。協處理機(如8087)則是為了提高速度而可以選配的硬件。

⑤LOCK封鎖指令

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

主站蜘蛛池模板: 梁河县| 彰化县| 南雄市| 镇巴县| 汶上县| 渝北区| 兴文县| 昭通市| 清河县| 额济纳旗| 勃利县| 博爱县| 孝昌县| 青岛市| 正阳县| 彭山县| 岳池县| 蕉岭县| 渝北区| 江川县| 苍梧县| 利川市| 明星| 叙永县| 临泽县| 新余市| 富阳市| 凉城县| 独山县| 杭州市| 宜昌市| 南木林县| 安阳县| 镇宁| 慈利县| 满洲里市| 南召县| 青神县| 翼城县| 醴陵市| 登封市|