微機原理與接口技術筆記(一)


8088/8086 CPU特點

  • 采用並行流水線工作方式
    • 通過設置指令預取隊列實現
  • 對內存進行分段管理
    • 分為4個段並設置地址段寄存器,實現對1MB空間的尋址
  • 支持協處理器

最小模式過程

img

  • 8088送ALE給地址鎖存器,地址不會改變

  • img

  • 地址線和數據線

    • \(AD_0-AD_7\):低八位地址和低八位數據信號分時復用.傳送地址時信號為單向,傳送數據時為雙向.
    • \(A_{16}-A_{19}\):高4位地址信號,與狀態信號分時復用
    • \(A_8-A_{15}\):8位地址信號
  • WR 寫信號

  • RD 讀信號

  • IO/M 訪問內存/訪問接口

  • DEN 低電平有效,允許讀寫操作

  • DT/R 傳送方向控制

  • READY 時鍾周期,相當於CLK

  • 第三個周期Ready是高電平,就表示工作結束,進行第四個周期,如果是低電平,就要插入一個等待周期

  • 中斷請求響應

    • INTR 可屏蔽中斷請求輸入端
    • NMI 非屏蔽中斷請求輸入端

INTA 中斷響應輸出端

  • 總線保持信號

    • HOLD 總線保持請求信號輸入端,CPU以外的其他設備要求占用總線時,向CPU發出請求
    • HLDA,CPU對HOLD的響應信號
  • 執行單元EU

img

  • 總線接口單元BIU
    • 從內存中取指令到指令預取隊列
    • 負責與內存或者IO接口的數據傳送
    • 在執行轉移程序時,BIU使指令預取隊列復位,從指定的新地址取指令,並立即傳給執行單元執行.

img

  • MN/MX 1-最大模式,0-最小模式

8088 內部寄存器

8個通用寄存器

  • 數據寄存器

    • AX 累加器
    • BX 基址寄存器
    • CX 計數寄存器(循環 串操作)
    • DX 數據寄存器
  • 地址指針寄存器

    • SP 堆棧指針寄存器,棧頂
    • BP 訪問存放在內存單元的偏移地址
  • BX指向的數據段,BP指向的堆棧段

  • 變址寄存器

    • SI 源
    • DI 目標
  • IP PC

  • FLAGS

    • C 進位
    • F 溢出 兩個符號數,看兩個進位是否相同就可以判斷
    • Z 為0時為1
    • S 運算結果最高位為1時
    • P 1的個數為偶數時為1
    • A bit3向bit4有進位時為1
    • T 單步工作
    • IF 中斷允許標志位,為1時可以相應可屏蔽中斷請求
    • D 串操作時確定方向
  • 段寄存器(存放段基地址)

    • CS 代碼段 存放指令代碼
    • DS 數據段 存放數據
    • ES 附加段 存放數據
    • SS 堆棧段 暫時不用但是要保存的數據

實地址尋址

  • 物理地址=段基地址*16+偏移地址

  • 一個內存單元在同一時刻可以屬於兩個不同類型的段.

  • 堆棧段

  • 該看p23

  • 8位寄存器中存放的均為運算的數據

  • AX CX一定是數據,BX,DX可能是地址

匯編

MOV

  • MOV指令不影響標志位

  • 兩操作數長度相同

  • 源操作數 寄存器 存儲器 立即數 目的操作數 寄存器 存儲器

  • 不允許同時為存儲器

  • 兩操作數不能同時為段寄存器

  • 源操作數是立即數時,目標操作數不能是段寄存器

  • IP和CS不作為目標操作數,FLAGS不作為操作數

  • 不能用立即尋址給段寄存器賦值

  • MOV DX,09H(√)DX高八位是0,低八位是9

  • 將 * 的ASCII碼送入內存數據1000H開始的100個單元中

MOV DI,1000H
MOV CX,64H//常數100
MOV AL,2AH
AGAIN:MOV [DI],AL
	  INC DI
	  DEC CX
	  JNZ AGAIN//CX不為0就跳轉
	  HLT

堆棧

  • 先進先出
  • push先SP--,再存數,pop先取數到AL,再SP++
  • 以字為單位,一定是16位,沒有8位
  • 操作數可以是寄存器和存儲器,但不能是立即數,但操作指令不能是立即數ddddddddddddd

底下是高地址,上面是低地址,然后先壓低地址,再壓高地址

交換指令

  • 沒有源操作數和目的操作數,一個立即數也不能有
  • 不允許使用段寄存器

查表指令

  • 用BX表示首地址,AL表示位移量
  • BX+AL所指單元送AL
  • 相當於AL是數組首地址,BX是下標,進行一次iloc訪問

字符擴展指令

  • 符號位擴展到高位,無符號數補0,隱含的操作數AX、DX

  • CBW 字節到字

    • AL內容擴展到AX
    • 最高位為1,AH=FFH
    • 最高位為0,AH=00H
  • CWD 字到雙字

    • AX內容擴展到DX,AX
    • 最高位1,DX=FFFFH
    • 最高位0,DX=0000H

LEA指令

  • 源操作數必須是存儲器,目的操作數通常是間址寄存器

  • 將變量的16位偏移地址寫入到目標寄存器

  • MOV讀取的內容,LEA讀取的地址

  • 將數據段中首地址為MEM1的50個字節的數據傳送到同一邏輯段首地址為MEM2的區域存放,編寫相應的程序段。

  • LEA SI,MEM1
    LEA DI,MEM2
    MOV CL,50
    NEXT:MOV AL,[SI]
    	 MOV [DI],AL//兩個存儲器中間不能直接傳,需要通過寄存器
    	 INC SI
    	 INC DI
    	 JNZ NEXT
    	 HLT
    

LDS、LES

  • 將一個32位的遠地址指針寫入目標寄存器
  • LDS:將源操作數的偏移地址送目標寄存器
  • LES:將源操作數的偏移地址送目標寄存器,將源操作數的段地址送給ES

標志傳送指令

  • LAHF:將FLAGS低八位裝入AH
  • SAHF:AH裝入FLAGS的低八位
  • PUSHF:stack<-Flags
  • POPF Flags<-stack
  • PUSHA 所有的Rc16入棧 POPA
  • Rc16:AX,CX,DX,BX,SP,BP,SI,DI

I/O端口

  • IO接口中用於存儲數據,可以直接被CPU訪問的寄存器.

IN acc,PORT 從端口地址讀入數據到累加器
OUT PORT,acc 將累加器的值輸出到端口中,acc只能是AL/AX

8位時,直接給出8位地址,16位時,端口地址由DX指定.

算術運算類指令

  • ADD

  • ADC 帶進位加法 d<-d+s+C

  • INC,DEC將操作數視為無符號數,會影響標志位,但是不影響進位標志C

  • 無符號進位標志看C,有符號看O

  • 在內存的First和Secontd開始的區域中分別 存放着2F365H和 5E024 H兩個數,要求求 其和,並存入Third中。

  • 注意字長是32位,加完一次后需要再加2

    MOV AX,First
    ADD AX,Second
    MOV Third,AX
    MOV AX,First+2//要考慮進位,使用ADC
    ADC AX,Second+2
    MOV Third+2,AX
    
  • 求內存數據段中M1為首和M2為首的兩個20字節數之和,並將結果寫入M2為首的區域.

//按字節
LEA SI,M1
LEA DI,M2
MOV CX,20
CLC//make CF = 0
NEXT:
	MOV AL,[SI]
	ADC [DI],AL// [DI]+Al+CF->[DI]
	INC SI
	INC DI
	DEC CX
	JNZ NEXT
	HLT//暫停
//按字2
LEA SI,M1
LEA DI,M2
MOV CX,10
CLC//make CF = 0
NEXT:
	MOV AX,[SI]
	ADC [DI],AX// [DI]+Al+CF->[DI]
	ADD SI,2
	ADD DI,2
	DEC CX
	JNZ NEXT
	HLT//暫停
  • SBB \(OPRD1-OPRD2-CF->OPRD1\)

  • NEG \(0-OPRD->OPRD\),執行后除非操作數為0,否則CF都是1.
    80H或者8000H執行后結果不變,但是OF置1(溢出),其他情況下均置0.就是各位取反+1

  • CMP僅影響標志位

    • 在減法中,小的減大的表示有借位,C=1;
    • 無符號數 CF=0 AX>=BX, CF=1,AX<BX CF=0,ZF=1,AX=BX
    • 有符號數 OF SF相同時,AX>=BX,否則AX<BX
    • 20個數中找最大數
LEA BX,MAX
LEA SI,BUF
MOV CL,20
MOV AL,[SI]
NEXT:
	INC SI
	CMP AL,[SI]
	JNC GOON //CF=0轉移
	XCHG [SI],AL
GOON:DEC CL
	JNZ NEXT//如果不為0就跳轉
	MOV [BX],AL
	HLT

乘除運算指令

乘法指令隱含了存放被乘數的AL或AX,以及存放結果的AX或AX DX.

無符號乘法的操作數不能是立即數

除法

  • OPRD字節數,執行AX/OPRD
  • AL=商,AH=余數
  • OPRD雙字節數
  • DXAX/OPRD
  • AX=商,DX=余數

INC,DEC的執行不會影響CF,其他算術類指令會影響狀態標志位

  • 乘法運算中,乘積是乘數的雙倍字長
  • 除法要求被除數是除數的雙倍字長

邏輯運算指令

  • 除了"非",其余指令的執行都會影響除AF外的標志

  • 無論運算結果如何,都會使CFOF清零

  • AND AL,0FH 實現掩碼

  • AND AX,AX 使得CFOF清零

  • 從地址為3F8H端口讀入一個字節數,如果該數bit1位為1,則可從38FH端口將DATA為首地址的1個字輸出,否則不能進行數據傳送

    MOV DX,3F8H
    WATT:IN AL,DX
    	 AND Al,02H
    	 JZ WATT
    	 MOV DX,38FH
    	 MOV AX,DATA
    	 OUT DX,AX
    
  • OR 使得某些位為1

  • 非運算對標志位無影響

  • XOR AX,AX 清零

  • TEST OPRD1,OPRD2,執行與運算,demo結果不寫回

  • 從地址為3F8H端口讀入一個字節數,如果該數bit1位 bit3位和bit5位同時為1,則可從38FH端口將DATA為首地址的1個字輸出,否則不能進行數據傳送

    LEA SI,DATA
    MOV DX,3F8H
    WATT:IN AL,DX
      AND AL,2AH
      XOR AL,2AH//0010 1010,如果這些位都是1,那么XOR后一定為0
      JNZ WATT
      
      MOV DX,38FH
      MOV AX,[SI]
      OUT DX,AX
    

移位操作指令

  • 當目標操作數為存儲器操作數時,需要說明其字長,移動的位數只能是1或者是CL

  • 算術左移邏輯左移:最高位移到CF,最低位為0

  • 邏輯右移:最低位->CF,最高位0

  • 算術右移:最低位->CF,最高位變符號位

  • 循環移位可以戴震進位也可以不帶CF

  • 循環指令左右 對於某些狀態進行測試

    • 高位和低位的交換
    • 與非循環移位組成32位或者更長字數的移位

    11

22

LEA SI,MI
LEA DI,M2
MOV CH,4
NEXT:MOV AL,[SI]
	 MOV BL,AL
	 AND AL,0FH
	 OR AL,30H
	 MOV [DI],AL
	 INC DI
	 MOV AL,BL//還原
	 MOV CL,4
	 SHR AL,CL
	 OR AL,30H
	 MOV [DI],AL
	 INC DI
	 INC SI
	 DEC CH
	 JNZ NEXT
	 HLT

串操作指令

  • 要求兩個操作數都在存儲器,針對數據塊和存儲器的操作

  • 串所在的區域 串的首地址 串的長度 方向

  • 源串一般在數據段,偏移地址SI指定

  • 目標串必須在附加段,由DI指定

  • 串的長度由CX指定

  • 操作方向DF=0增地址,DF=1減地址

  • REP CX!=0時,REP后的指令將繼續重復執行

  • REPE CX!=0且ZF=1,重復執行

  • REPNE CX!=0且ZF=0,重復指令

  • MOVS

  • img

  • 增地址

    • 串傳送 指針指向串尾+1
    • 串比較:指針指向結束位+1
  • 減地址

    • 串尾-1
    • 結束位-1
  • 串掃描指令 用於在指定存儲區域中尋找某個關鍵字

  • SCAS OPRD

  • 1570601639977

  • MOV DI,2000H
    MOV BX,DI
    MOV CX,0AH
    MOV AL,'A'
    CLD//將DF清零,為增方向
    REPNZ SCASB
    JZ FOUND
    MOV DI,0
    JMP DONE
    FOUND:DEC DI//注意停下的時候還在+1的位置
    	  MOV DATA2,DI
    	  INC DI
    	  SUB DI,BX
    DONE:
    	MOV DATA1,DI
    	HLT
    	  
    
  • LODS OPRD

  • AL<-[DS:SI]

  • AX<-[DS:SI]

  • 將某個區域的數據串依次裝入累加器,以便顯示或輸出到接口,

  • 串存儲指令
    STOS OPRD

    AL -> [ES:DI]

    AX -> [ES:DI]
    用於將內存中的某個區域置成相同的值

  • 注意事項

    • 需要定義附加段
    • 需要設置數據的操作方向
    • 源串和目標串的指針分別為SI和DI
    • 傳送類指令前加無條件重復前綴
    • 串比較類指令前加條件重復前綴,但前綴不影響ZF狀態


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM