8086最小模式原理總結

一、8086芯片引腳定義


引腳功能簡單描述:

因爲本篇文章的目的是理解8086系統的原理,所以只討論與程序設計相關的功能,其他方面只是簡單略過。

AD0-AD15 : 地址/數據複用線

A16/S3-A19/S6:高四位地址線和狀態輸出複用

ALE:地址鎖存使能

bhe:低爲讀取一個字,高爲讀取一個字節

rd:總線讀操作控制線

wr:總線寫操作控制線

M/io:intel平臺中,存儲器和io分開編址,此控制線來確定訪問的是存儲器還是io口

DT/dr:在讀寫操作時,控制數據的流向。

den:數據傳輸使能


NMI,INTR:前者接不可屏蔽中斷源,後者接可屏蔽中斷源

inta:中斷響應

ready:指示外部設備是否完成指定的操作

MN/max:最小最大模式選擇,本文只考慮最小模式

HOLD/HOLDA:向cpu請求總線控制權和cpu響應控制線


CLK:接時鐘信號

RESET:復位信號輸入

GND: 接地線

VCC:接5v電源

test:暫不考慮

二、最小系統簡略概述

2.1、簡略圖如下:


2.2、8086讀存儲器時序圖如下:

2.3、上圖讀時序解析

2.3.1、在T1階段將地址鎖存在8282中,爲什麼要鎖存?因爲在整個讀操作過程中,地址總線上都要保持cpu要訪問的地址信息,而20條地址線在T1階段後要傳輸狀態和數據信息,無法保持地址信息,所以需要將地址信息鎖存在8282中,bhe也被鎖存在了8282中,也可以認爲bhe也是地址信息的一部分。

2.3.2、T2到T4的過程中,地址中的數據被傳送到了8086中,若外部設備較慢則需要加入幾個Tw以等待外部設備完成讀操作。

2.3.3、bhe和內存對齊的問題,bhe爲低時表示讀取一個字(16bit)爲高時讀取一個字節,bhe和AD0的不同組合會導致cpu的不同行爲。

2.3.3.1、當代碼從一個偶地址(假設爲100)讀取一個字時,cpu可以通過讓bhe=0,然後直接讀取此地址的值就可以了。bhe=0,addr-100。

2.3.3.2、當代碼從一個偶地址(假設爲100)讀取一個字節時,同上例,bhe=1,addr=100。

2.3.3.3、當代碼從一個奇地址(假設爲101)讀取一個字節時,bhe=1,addr=101

2.3.3.4、當代碼從一個奇地址(假設爲101)讀取一個字時,此時一個總線訪問不能滿足要求,需要兩次操作,第一次 bhe=1,addr=101,第二次bhe=1,addr=102,然後再結合(可能不同cpu組合的方式不同,例如也可以讀取兩個字進行運算出最後結果)。這也就是變量存儲要進行內存對齊的原因。(具體內存對齊有另外文章詳解)


三、8086系統中的段

段的概念本身不復雜,可是由於歷史原因段被用在不同的場合,導致段的概念模糊容易混淆。

3.1、段的由來

在8086系統中,地址線是20根,所以能訪問的地址範圍是1MB,而8086cpu的字長是16bit(數據線是16bit,內部寄存器也是16bit),所以地址信息無法直接cpu處理,所以就把一個1MB的物理尋址空間分成段,cpu用段地址和偏移量來訪問存儲器中的某一地址,段地址存儲在段寄存器中,偏移量可以有多種實現(可以是立即數,寄存器中具體間尋址方式)

這種分段機制是由於字長和物理尋址空間的不匹配產生的,只是cpu訪問存儲器的一種方式,這個段只存在與訪問過程中,對於存儲器來說是透明的,cpu內部有一個加法器實現把段地址和偏移量來組成實際的20bit的物理地址。

3.2、代碼中的段

這也許是一種巧合,代碼也需要用段來分割,代碼由指令和數據組成,把指令和數據放到不同的段裏有很多好處,例如可以賦予不同的段不同的讀寫權限(代碼段可以設置爲只讀),也可以把不同模塊的代碼放在不同的段裏,方便維護和擴展(靜態鏈接,動態鏈接),例如資源也可以單獨放在一個數據段裏供各個模塊之間進行共享。

這種分段機制和3.1當中提到的cpu爲了用16bit的字長去實現訪問1MB的存儲空間的分段機制不謀而合(但確實是兩種分段機制,不能混淆),我們可以把指令和數據分成若干段,然後用段寄存器去存儲這些段的首地址,就可以用各種偏移量的尋址方式去訪問這些段了。

3.3、8086中提供的段寄存器有4個,cs,ds,es,ss,cs要存儲指令段的地址(因爲cpu在reset以後會首先訪問cs段裏的數據,並把其當成指令執行),ss一般是棧段(也可以爲數據段),ds,es爲數據段,由此可見,cpu能同時處理的有四個段,如果代碼中有超過4個段,則需要在代碼中進行切換。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章