第三章 8086指令結構

一、傳送指令編碼

         A通用。B累加器專用。C地址。D標誌spa

A:通用傳送指令指針

         ①:最基本的傳送指令 MOVorm

                  MOV 目的 源        #目的:OPRD1。源:OPRD2。blog

         實現:接口

                  MOV AX,4234H內存

                  MOV AX,BXci

                  MOV AL,[1000H]字符串

         注:①:能夠傳送16位的數據,也能夠傳送8位的數據ast

                  ②:不能在兩個內存單元之間直接傳送

                          MOV [BX],[1000H] 錯誤的

                  ③:CS和IP不能做爲目的操做數,可做爲源操做數

                          MOV CS,1000H  錯誤的

                  ④:不能將當即數直接傳送到段寄存器中

                  ⑤:段寄存器之間不能互相傳送

                          MOV DS,2000H  錯誤的

                          應該變爲兩句話傳輸   MOV AX,2000H

                                                                      MOV DS,AX

                          MOV ES,DS  錯誤的

                          變爲兩句話傳輸:MOV AX,DS

                                                             MOV ES,AX

         ②:堆棧操做指令:PUSH和POP

                  堆棧:一段內存區域,可用於保存中間數據,運算結果或某些寄存器的值,須要時能夠從堆棧中將數據取出,按照先進後出的原則使用數據

         注:微機把內存的一段區域做爲堆棧使用,即堆棧段SS,段內的物理地址由SS和SP決定,SP始終指向棧頂(棧頂是最底下)

                          PUSH OPRD(數據) 叫作壓棧

                          POP OPRD  叫作出棧

         對PUSH和POP的說明:

                  ①:堆棧操做老是按字運行的

                  ②:PUSH AX          AX爲1122H           

                  注:每進入一個字,SP要減2(SP-2)

         高字節放在較高地址,低字節放在較低地址

 

 

 

                                   彈出一個字的時候,SP要加二(SP+2)   #SP+2就是在回到所謂的棧底.

                  ③:CS能夠壓棧,可是不能出棧。

         ③:交換指令XCHG

                  XCHG 目的 源

                          寄存器 <-> 寄存器(雙向)

         或             寄存器 <--> 內存(雙向)

                  注:①:目的和源操做數,都不能是當即數或段寄存器,而且不能同時爲內存單元

                          XCHG [BX] [DI]  錯誤的 (同時都是內存單元,中括號表示內存單元)

                          ②:CS 和IP不能爲源操做數,目的操做數

                          ③:目的和源操做數,取值範圍要相同,同爲8位或16位

                                   XCHG BL,DL     對的(同時8位)

                                   XCHG AX,SI      對的(同時16位)

         ④:換碼指令XLAT:用於編碼制轉換

                  注:使累加器中的某個值轉換爲內存表格中對應的某個值,使用該指令前內存表的首地址,賦給BX,AL中存放表格某一項,與表格首地址的位移量,執行BX+AL獲得該表格中的一個地址,再將該地址所對應的值傳送到AL中

                  補充:使用XLAT換碼指令時,內存中必須有一個碼錶

         ⑤:輸入/輸出指令 IN、OUT

                  注:輸入指令用於CPU從外設端口接收數據,輸出指令用於CPU向外設端口發送數據

                  端口:CPU與外設之間經過接口進行數據交換,一個端口一般對應接口中的一個或幾個寄存器,每8位端口有一個地址叫作端口號,兩個相鄰的8位組成16位端口

                  端口數:最多爲65536個,端口號0000H~FFFFH

分類:直接輸入/輸出

                  前256端口直接輸出(2^8,00H~FFH)

                          IN 累加器,端口號

                          out 端口號,累加器

                  IN AL,50H         #510H是端口號

                  IN AX,70H        #AX裏存放的是70H與71H

                  OUT 44H,AL

直接輸入/輸出

                  IN 累加器,DX   

                  IN AX,DX                   #這兩句話完成

地址傳送指令

         LEA:取有效地址指令

                  LEA 目的,源

                  注:源操做數爲內存單元地址,目的操做數爲16位的寄存器

                  LEA AX,[2782H]

                  LEA BX,[BP+SI]

         LDS:取地址指針,放入DS中,和其它寄存器的指令

                  注:將四個字節的內存單元地址送到兩個目的寄存器中,其中後兩個字節爲段地址,送到DS中

         LES:取地址指針,放入ES和其餘寄存器的指令

                  LES DI,[2130H]

標誌傳送指令

                  LAHF:讀取標誌指令

                  SAHF:設置標誌指令

 2、算術運算指令

         加法

                  ADD:不帶進位的加法指令

                  ADC:帶進位的加法指令、

                  注:①:無符號和有符號加法,減法可使用同一個指令,無符號和有符號的乘法和除法,不能使用同一個指令

                          ②:無符號運算產生溢出指的是CF=1時會設置進位,對於多字節運算中使用,要利用進位向高字節傳遞數值

                  INC:增量加1

                  注:IAC通常用在循環中,修改指針或修改循環次數

         減法

                  SUB:不考慮錯位的減法指令

                          SUB BX,CX

                  SBB:考慮借位的減法的指令

                  DEC:減1

         乘法:無符號乘法指令和有符號乘法指令

                  無符號:MUL

                          1、①:MUL BL

                             ②:MUL CX

                          注:乘法隱含的一個操做數爲ALAX

                  僞指令

                          2MUL BYTE PTR[DI]

                             MUL WORD PTR[SI]

         有符號:IMUL

                          IMUL CL

                          IMUL CX

         除法

                  無符號:DIV

                  注:除法隱含的也是AXAL

                  DIV CL

                  DIV CX

                  DIV BYTE PTR[DI]

         有符號:IDIV

 

2、邏輯運算

         AND

         OR

         NOT

         XOR 異或

         TEST 檢測(相似於AND)

                  AND:在與運算中,與0運算就是置0,與1運算就是原值不變。

                  OR:與1運算爲1,與0運算不變。

                  XOR:①:取反功能。②:寄存器清0

         AND通常用於指定位數清零

         OR通常用於指定位置置1

         XOR通常用於某個寄存器清0

         TESE:用於測定指定寄存器中某個位置是0仍是1

3、位移指令

         ①:SAL:非循環算術左移指令

                  注:左移低位補0,高位進入CF標誌位

         ②:SHL:非循環邏輯左移指令

         ③:SAR:非循環算術右移指令

                  注:高位不變向前填充,低位進入CF標誌位

         ④:SHR:非循環邏輯右移指令

                  注:以0填充,低位進入CF標誌位

         ROL:不帶進位的循環左移指令

         ROR:不帶進位的右移指令

         RCL:帶進位的左移指令

         RCR:帶進位的右移指令

4、串操做指令

                  注:①串操做指令要經過重複前綴來實現串操做

                          ②:以SI做爲源操做數的指針寄存器,默認段爲DS段,以DI 做爲目的操做數的指針寄存器,默認段在ES

         [DS:SI]à[ES:DI]

                  注:將DS段,SI所指出的字節或字,傳送到ES段,DI所指的存儲單元,自動修改地址DISI

         字符串比較指令

                  CMPSB  CMPSW

                  注:REPE/REPZ(功能:找不一樣的字符)表示CX !=0且比較的字節相等(ZF=1)這個時候繼續比較,當ZF=0時,結束比較

                  REPNE/REPNZ(功能:找相同字符)表示CX !=0且比較的字符不等(ZF=0),這個時候繼續比較,當ZF=1時,結束比較

         字符串檢索指令

                  SCASB/SCASW

                  前綴:REPE/REPZ CX不等於0AL(AX)內容相等,表示ZF=1,繼續檢索(找不同)

                  前綴:REPNE/REPNZ CX不等於0且與AL(AX)內容不等,ZF=0.繼續檢索(找同樣)

         取字符串指令

                  LODSB/LODSW

         存字符串指令

                  STOSB/STOSW

                  注:取字符串指令,不使用前綴,存字符串指令,使用REP前綴表示可使一個字符串填充到內存單元中

         控制轉移指令

                  ①:段內直接轉移指令

                          JMP 1000H

                  ②:段內間接轉移指令

                          JMP CX

                          JMP[CX]

                  ③:段間直接轉移指令

                          JMP B000H:0100H

                  ④:段間間接轉移指令

                          JMP DW ORD PRT[BX+ SI]

                          CALL RET   子程序調用和返回指令

         條件轉移指令

                  注:知足條件時執行指定的目標,不知足條件時執行下一條指令,判斷條件根據CFSFOFPFZFCX

                  條件跳轉指令分爲有符號數的跳轉和無符號跳轉,有符號的叫大於、小於,無符號的叫高於、低於。

                  JE/JZ         等於/0 時跳轉(ZF=1)à這裏計算機判斷

                  JNE/JNZ   不爲0時轉移(ZF=0時判斷)

有符號的:

         JG/JNLE            大於/不小於等於

JNG/JLE            不大於/小於等於

JL/JNGE            小於/不大於等於

JNL/JGE            不小於/大於等於

無符號的:

         JB/JNAE           低於/不高於等於

         JNB/JAE            不低於/高於等於

         JA/JNBE            高於/不低於等於

         JNA/JBE           不高於/低於等於

JS     SF1時跳轉

JNS  SF0時轉移

JO    OF1時跳轉

JNO OF0時轉移

JP     PF1時跳轉

JNP  PF0時轉移

相關文章
相關標籤/搜索