- 計算機系統平臺
- 王曉英 曹騰飛 孟永偉 黃建強
- 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與其他處理機協同工作時,該指令可避免破壞有用信息。
- Puppet實戰
- Linux從零開始學(視頻教學版)
- Ansible權威指南
- 精解Windows 8
- Windows Phone 7.5 Data Cookbook
- Linux操作系統應用編程
- 高性能Linux服務器構建實戰:系統安全、故障排查、自動化運維與集群架構
- Windows Server 2019 Administration Fundamentals
- Linux系統安全基礎:二進制代碼安全性分析基礎與實踐
- NetDevOps入門與實踐
- AWS SysOps Cookbook
- Windows網絡編程(第2版)
- Linux系統管理初學者指南:基于CentOS 7.6
- 電腦辦公(Windows10+Office2016)從新手到高手
- Xamarin Mobile Application Development for Android