微机基础
微機概述
微機的發展概況
微機發展
- 1946年美國賓夕法尼亞大學為了彈道設計的需要設計了世界上第一臺數字電子計算機ENIAC。
- 1971年,Intel研究制造了I4004微處理器芯片。該芯片能同時處理4位二進制數,集成了2300個晶體管,每秒可進行6萬次運算,成本約為200美元。它是世界上第一個微處理器芯片,以它為核心組成的MCS-4計算機,標志了世界第一臺微型計算機的誕生。
微機相關幾個的概念
- 什么是微機?
微機是以大規模、超大規模構成的微處理器作為核心,配以存儲器、輸入/輸出接口電路及系統總路線所制造出的計算機。 - 劃分階段的標志: 字長 和 微處理器型號
- 微機發展的特點
- 速度 越來越快
- 容量 越來越大
- 功能 越來越強
- 在微機的發展過程中,最為成功也最有影響力的是IBM PC系列微機
- 微機的體系結構:
馮.諾依曼建立的存儲程序概念——馮.諾依曼結構- 馮·諾依曼結構也稱普林斯頓結構,是一種將程序指令存儲器和數據存儲器合并在一起的存儲器結構。程序指令存儲地址和數據存儲地址指向同一個存儲器的不同物理位置,因此程序指令和數據的寬度相同,如英特爾公司的8086中央處理器的程序指令和數據都是16位寬。
- 數學家馮·諾依曼提出了計算機制造的三個基本原則,即采用二進制邏輯、程序存儲執行以及計算機由五個部分組成(運算器、控制器、存儲器、輸入設備、輸出設備),這套理論被稱為馮·諾依曼體系結構。(來源維基百科)
微機的分層存儲系統
存儲器可分為5層:
- 0層通常是CPU內部寄存器,離CPU最近,存取速度快,但數量有限.
- 1層存儲器是高速緩沖存儲器Cache
- 2層是主存儲器,通常由動態RAM(DRAM)組成
- 3層是大容量的虛擬存儲器(磁盤存儲器)
- 4層是外存儲器(光存儲介質等)
軟件系統的發展
常見操作系統:
- DOS
- Windows
- Linux
- UNIX/Xenix
- OS/2
- Netware
單片機
單片機是把CPU、一定容量的存儲器和必要的I/O接口電路集成在一個芯片上構成的具有計算機的完整功能的一種微機。
微機的應用
1.工業控制
2.事物處理
3.計算機輔助設計和輔助制造(CAD/CAM)
4.教學培訓
5.家庭娛樂和家政事務管理
6.科學和工程計算
7.人工智能
計算機中數的表示和編碼
計算機中的進位計數制
進位計數制的表示法
十進制表示法
十進制數是用0,1,2,…,8,9十個不同的符號來表示數值,它采用的是“逢十進一,借一當十”的原則。
二進制表示法
基數為10的記數制叫十進制;基數為2的記數制叫做二進制。
二進制數的計算規則是“逢二進一,借一當二”。
八進制表示法
八進制數是基數為八的計數制。八進制數主要采用0,1,2,…,7這八個阿拉伯數字。
八進制數的運算規則為“逢八進一,借一當八”。
八進制表示數值方法如下:
例:$$(467.6)_0=4 \times 8^2+6 \times 8^1+7 \times 8^0+6 \times 8^{-1}$$
十六進制表示法
基數為16,用0 – 9 、A – F 十五個字符來數值,逢十六進一。
各位的權值為 16^I
十六進制表示數值方法如下:
例:$$(56D.3)_H=5 \times 16^2+6 \times 16^1+13 \times 16^0+3 \times 16^{-1}$$
進位計數制之間的轉換
二 → 十
二進制數從低位到高位(即從右往左)計算,第0位的權值是2的0次方,第1位的權值是2的1次方,第2位的權值是2的2次方,依次遞增下去,把最后的結果相加的值就是十進制的值。
八 → 十
八進制數從低位到高位(即從右往左)計算,第0位的權值是8的0次方,第1位的權值是8的1次方,第2位的權值是8的2次方,依次遞增下去,把最后的結果相加的值就是十進制的值。
十六 → 十
十六進制數從低位到高位(即從右往左)計算,第0位的權值是16的0次方,第1位的權值是16的1次方,第2位的權值是16的2次方,依次遞增下去,把最后的結果相加的值就是十進制的值。
十 → 二
除2取余法,即每次將整數部分除以2,余數為該位權上的數,而商繼續除以2,余數又為上一個位權上的數,這個步驟一直持續下去,直到商為0為止,最后讀數時候,從最后一個余數讀起,一直到最前面的一個余數。
十 → 八
- 方法1
除8取余法,即每次將整數部分除以8,余數為該位權上的數,而商繼續除以8,余數又為上一個位權上的數,這個步驟一直持續下去,直到商為0為止,最后讀數時候,從最后一個余數起,一直到最前面的一個余數。 - 方法2
使用間接法,先將十進制轉換成二進制,然后將二進制又轉換成八進制。
十 → 十六
- 方法1
除16取余法,即每次將整數部分除以16,余數為該位權上的數,而商繼續除以16,余數又為上一個位權上的數,這個步驟一直持續下去,直到商為0為止,最后讀數時候,從最后一個余數起,一直到最前面的一個余數。 - 方法2
使用間接法,先將十進制轉換成二進制,然后將二進制又轉換成十六進制。
二 → 八
取三合一法,即從二進制的小數點為分界點,向左(向右)每三位取成一位,接著將這三位二進制按權相加,然后,按順序進行排列,小數點的位置不變,得到的數字就是我們所求的八進制數。如果向左(向右)取三位后,取到最高(最低)位時候,如果無法湊足三位,可以在小數點最左邊(最右邊),即整數的最高位(最低位)添0,湊足三位。
八 → 二
取一分三法,即將一位八進制數分解成三位二進制數,用三位二進制按權相加去湊這位八進制數,小數點位置照舊。
二 → 十六
取四合一法,即從二進制的小數點為分界點,向左(向右)每四位取成一位,接著將這四位二進制按權相加,然后,按順序進行排列,小數點的位置不變,得到的數字就是我們所求的十六進制數。如果向左(向右)取四位后,取到最高(最低)位時候,如果無法湊足四位,可以在小數點最左邊(最右邊),即整數的最高位(最低位)添0,湊足四位。
十六 → 二
取一分四法,即將一位十六進制數分解成四位二進制數,用四位二進制按權相加去湊這位十六進制數,小數點位置照舊。
十六 <-> 八
利用二進制實現轉換
計算機中常用的編碼
BCD碼
BCD碼(Binary-Coded Decimal?),用4位二進制數來表示1位十進制數中的0~9這10個數碼,是一種二進制的數字編碼形式,用二進制編碼的十進制代碼。BCD碼這種編碼形式利用了四個位元來儲存一個十進制的數碼,使二進制和十進制之間的轉換得以快捷的進行。
ASCII碼 -美國標準信息交換代碼
ASCII ((American Standard Code for Information Interchange): 美國信息交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是最通用的信息交換標準,并等同于國際標準ISO/IEC 646。ASCII第一次以規范標準的類型發表是在1967年,最后一次更新則是在1986年,到目前為止共定義了128個字符。
帶符號數的表示
數的表示
數的常用表示法:原碼、反碼、補碼
機器數和真值
- 機器數
一個數在計算機中的二進制表示形式, 叫做這個數的機器數。機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數為0, 負數為1。
比如,十進制中的數 +3 ,計算機字長為8位,轉換成二進制就是00000011。如果是 -3 ,就是 10000011 。那么,這里的 00000011 和 10000011 就是機器數。 - 真值
因為第一位是符號位,所以機器數的形式值就不等于真正的數值。例如上面的有符號數 10000011,其最高位1代表負,其真正數值是 -3 而不是形式值131(10000011轉換成十進制等于131)。所以,為區別起見,將帶符號位的機器數對應的真正數值稱為機器數的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
原碼
原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值. 比如如果是8位二進制:
[+1]原 = 0000 0001 [-1]原 = 1000 0001第一位是符號位. 因為第一位是符號位, 所以8位二進制數的取值范圍就是:
[1111 1111 , 0111 1111]即:
[-127 , 127]反碼
反碼的表示方法是:
- 正數的反碼是其本身
- 負數的反碼是在其原碼的基礎上, 符號位不變,其余各個位取反.
補碼
補碼的表示方法是:
- 正數的補碼就是其本身
- 負數的補碼是在其原碼的基礎上, 符號位不變, 其余各位取反,
最后+1. (即在反碼的基礎上+1)
為什么使用原碼反碼補碼
已知:計算機可以有三種編碼方式表示一個數. 對于正數因為三種編碼方式的結果都相同:
[+1] = [00000001]原 = [00000001]反 = [00000001]補對于復數:
[-1] = [10000001]原 = [11111110]反 = [11111111]補可見原碼, 反碼和補碼完全不同。
對于計算機, 加減乘除是最基礎的運算, 要設計的盡量簡單。于是人將符號位也參與運算。 根據運算法則減去一個正數等于加上一個負數, 即: 1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了。
計算十進制的表達式: 1-1=0
首先看原碼:
如果用原碼表示, 讓符號位也參與計算, 顯然對于減法來說, 結果是不正確的.這也就是為何計算機內部不使用原碼表示一個數.
為了解決原碼做減法的問題, 出現了反碼:
發現用反碼計算減法, 結果的真值部分是正確的. 而唯一的問題其實就出現在"0"這個特殊的數值上. 雖然人們理解上+0和-0是一樣的, 但是0帶符號是沒有任何意義的. 而且會有[0000 0000]原和[1000 0000]原兩個編碼表示0.
于是使用補碼, 解決了0的符號以及兩個編碼的問題:
這樣0用[0000 0000]表示, 而以前出現問題的-0則不存在了.而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]補 + [1000 0001]補 = [1000 0000]補(-1-127)的結果應該是-128, 在用補碼運算的結果中, [1000 0000]補 就是-128. 但是注意因為實際上是使用以前的-0的補碼來表示-128, 所以-128并沒有原碼和反碼表示.(對-128的補碼表示[1000 0000]補算出來的原碼是[0000 0000]原, 這是不正確的)
使用補碼, 不僅僅修復了0的符號以及存在兩個編碼的問題, 而且還能夠多表示一個最低數. 這就是為什么8位二進制, 使用原碼或反碼表示的范圍為[-127, +127], 而使用補碼表示的范圍為[-128, 127].
因為機器使用補碼, 所以對于編程中常用到的32位int類型, 可以表示范圍是: [-231, 231-1] 因為第一位表示的是符號位.而使用補碼表示時又可以多保存一個最小值.
微機的一般概念
計算機的基本組成和工作原理
計算機的基本組成:運算器、控制器、存儲器、以及輸入和輸出設備
微處理器(CPU)
CPU是大規模集成電路技術做成的芯片,芯片內集成有控制器、運算器和寄存器等相關部件,完成對計算機系統內各部件進行統一協調和控制。
包括:寄存器陣列(RS)、算術和邏輯運算單元(ALU)、控制器、內部總線及緩沖器
- 控制器:根據程序中的命令發出各種控制信號,使各部分協調工作以完成指令所要求的各種操作。
- 運算器:對信息進行加工、運算的部件,執行算術運算和邏輯運算。
存儲器
功能:存放程序和數據。
存儲器=內存+外存。
內存是半導體存儲器,外存通常是指光盤,硬盤等可長期保存信息。
半導體存儲器包含RAM和ROM。
- RAM:隨機讀寫存儲器(random access memory)。
RAM主要用來存放各種數據,中間結果以及外存交換信息和作
為堆棧。程序運行的時候通常從外存讀入內存ram中,然后再
由cpu從ram中讀取并運行。- Sram靜態存儲器,cache。
- Dram動態存儲器用于主存。SDRAM:Synchronous
- Dynamic Random Access Memory,同步動態隨機存儲器。
- Rom:只讀存儲器(read only memory)。
- Flash memory:閃速存儲器,又叫閃存,是一種特殊的rom。
每一個存儲單元有一個確定的地址
注意: 存儲單元的地址和該地址單元中存放的內容是兩個不同的概念。
I/O設備和I/O接口
I/O設備:微機配備的輸入/輸出設備(外設)。
存儲程序工作原理
把編制好的程序和數據一起先送入存儲器中保存起來。啟動機器運行后,根據給出的程序中第一條指令的存儲地址,控制器就可以根據存儲程序中的程序周而復始的取出指令、分析指令、執行指令,直至完成全部指令操作,即控制器通過指令流的串行驅動實現程序控制。
名詞術語
- 微處理器:是將運算器和控制器做在一塊集成電路上的一個獨立部件。它具有解釋指令、執行指令和與外界交換數據的能力。
- 微機:通過總線把I/O、CPU和半導體存儲器有機結合在一起。
微機分為:單板機(印制電路板)、單片機(芯片)、多板機。 - 微機系統:微機配上外部設備、系統電源和系統軟件就構成微機系統。
- 微機多機系統:多臺微機/微處理器組合而成。
- 微機開發系統(MDS):在研制開發微機應用系統時,從程序調試到樣機的系統調試,他都能提供軟件和硬件的支持
- 計算機網絡系統:借助通信網絡將一定的域內的眾多計算機和外設連接起來構成計算機網絡可以實現計算機之間的互相通信和資源共享。
- 多媒體:文、圖、聲、像等單媒體與計算機程序融合在一起形成的信息傳播媒體。
微機結構-微機的結構是一種總線結構
總線(Bus)是計算機各種功能部件之間傳送信息的公共通信干線,它是由導線組成的傳輸線束, 按照計算機所傳輸的信息種類,計算機的總線可以劃分為數據總線、地址總線和控制總線,分別用來傳輸數據、數據地址和控制信號。
- 計算機的各個部件掛在總線上,總線使得計算機功能部件之間的相互關系變成各個功能部件面向總線的單一關系。
- 優點:
- 結構簡單
- 擴展維護方便
系統總線
從處理器引出的若干信號線,CPU通過它們與存儲器或I/O設備進行信息交換。一個部件只要滿足總線標準,就可以連接到采用這種總線標準的系統中。
系統總線分為:
- 地址總線
- 控制總線
- 數據總線
地址總線
傳遞地址信息的總線,即AB。CPU在地址總線上輸出將要訪問的內存單元或I/O端口的地址,該總線為單向總線。
內存容量的計算:
- 16條地址線可訪問$2^{16} = 65536B = 64 KB$
- 20條地址線可訪問$2^{20} = 1 MB$
- 1K = 1024B 1M = 1024 KB 1G = 1024 MB
控制總線
傳遞控制信息的總線,即CB。
一部分是從CPU輸出:通過對指令的譯碼,由CPU內部產生,由CPU送到存儲器、輸入/輸出接口電路和其它部件。如讀寫控制信號等。
另一部分是由系統中的其他外設產生,送往CPU,如:中斷請求信號、總線請求信號、狀態信號。
數據總線
傳遞數據信息的總線,即DB。
在CPU進行讀操作時,內存或外設的數據通過數據總線送往CPU;
在CPU進行寫操作時,CPU數據通過數據總線送往內存或外設,數據總線是雙向總線。
微機的工作過程
準備
- 1、編寫程序(源程序);
- 2、將源程序匯編或編譯成計算機能識別的機器語言程序;
- 3、將數據和程序放入存儲器中存放。
取指令階段的執行過程:(設程序從00H開始存放)
- 1、將程序計數器(PC或IP)的內容送地址寄存器AR。
- 2、程序計數器PC的內容自動加1變為01H,為取下一條指令作好準備。
- 3、地址寄存器AR將00H通過地址總線送至存儲器地址譯碼器譯碼,選中00H單元。
- 4、CPU發出“讀”命令。
- 5、所選中的00單元的內容B0H讀至數據總線DB上。
- 6、經數據總線DB,讀出的B0H送至數據寄存器DR。
- 7、數據寄存器DR將其內容送至指令寄存器IR中,經過譯碼CPU“識別”出這個操作碼為“MOV A,05H”指令,于是控制器發出執行這條指令的各種控制命令。
執行指令階段的執行過程:
- 1、將程序計數器(PC或IP)的內容送地址寄存器AR。
- 2、程序計數器PC的內容自動加1變為02H,為取下一條指令作好準備。
- 3、地址寄存器AR將01H通過地址總線送至存儲器地址譯碼器譯碼,選中01H單元。
- 4、CPU發出“讀”命令。
- 5、所選中的01H單元的內容05H讀至數據總線DB上。
- 6、經數據總線DB,讀出的05H送至數據寄存器DR。
- 7、由控制碼計算機已知到讀出的是立即數,并要求將它送入累加
計算機軟件系統
系統軟件和應用軟件系統軟件包括操作系統、各種高級語言處理程序、編譯系統和其他服務程序、數據庫管理系統等軟件。這些軟件不是用來解決具體應用問題的,而是利用計算機自身的功能,合理的組織解題流程,管理計算機軟、硬件各種資源,提供人-機間的接口,從而簡化或代替各環節中人所承擔的工作。還可以為用戶使用機器提供方便,擴大機器功能,提高工作效率。應用軟件是由用戶利用計算機及其系統軟件編制的解決實際應用問題的程序。
Intel微處理器結構
8086的功能結構/編程結構
Intel 8086 微處理器有16位寄存器和16位外部數據總線,20位地址總線,尋址為1MB的地址空間。Intel 8088 微處理器的外部數據總線為8位,其他與8086是一樣的。
8086 CPU從功能上劃分成兩部分:總線接口單元BIU(Bus Interface Unit)和執行單元EU(Execution Unit).
BIU根據EU的請求,將指令送到指令流隊列中排隊,為EU提供即將執行的指令;EU從BIU的指令隊列取得的指令和數據,來對片外操作數(片外就是指CPU以外存儲數據的地方,比如存儲器,IO接口等)進行訪問的。這樣EU與BIU可獨立工作,BIU在保證EU與片外傳輸操作數的前提下,可進行指令預取,與EU可重疊操作。取指部分與執行部分可分開進行,提高CPU的利用率。(8086指令隊列出現2個空字節,且EU未占總線,BIU自動取指令填充隊列。)
- BIU作為總線控制單元,負責與存儲器及IO接口來傳輸數據。
- BIU的組成部分:段寄存器組(CS,DS,SS,ES)、指令指針(IP)、地址加法器、指令隊列緩沖器、總線接口控制邏輯。
- EU作為執行單元,負責執行指令。
- EU的組成部分:16位通用寄存器組(AX,BX,CX,DX,SP,BP,SI,DI)、算術邏輯單元(ALU)、標志寄存器(FLAG)、操作控制器電路。
BIU
1.段寄存器組(CS,DS,SS,ES)
- CS:代碼段寄存器,存放當前將被執行的程序的段地址。
- DS:數據段寄存器,存放當前被執行的程序所用操作數的段地址。
- SS:堆棧段寄存器,存放當前被執行的程序所用堆棧的段地址。
- ES:附加段寄存器,存放當前被執行程序所用操作數的段地址。
- 其中,DS、SS和ES寄存器的內容可由程序設置,而CS寄存器的內容不能用程序設置。
2.指令指針寄存器(IP)
它主要用來存放將要執行的下一條指令的偏移量,與CS聯合形成下一條指令的物理地址。
3.地址加法器
它用來計算物理地址的,物理地址的形成:
理地址 = 段基地址×10H + 偏移量
8086微處理器有20條地址總線,可尋址1MB的存儲器空間。由于8086微處理器是一個16位結構,段寄存器均為16位,這樣16位寄存器就無法存放20位地址了。為了解決這個問題,8086內部就設置了一個20位的地址加法器,它首先將16位的段地址左移4位,然后再與16位的偏移地址相加形成20位的物理地址,如圖:
每當取指令的時,則自動選擇代碼段寄存器CS,再加上由指令指針寄存器(IP)提供的16位偏移量,按上述方法計算后得到所要取的指令的20位物理地址。
4.指令隊列緩沖器
它是一個6B的先進先出緩沖器。8086微處理器具有指令預取功能,當執行部件(EU)不使用總線接口部件與片外進行數據傳送,總線接口部件就可以從存儲器中讀取指令填充指令隊列緩沖器。 8088微處理器的指令隊列緩沖器只有4B深度。
5.總線接口控制邏輯
這部分電路是處理器與外部總線的接口,它首先把已形成的20位地址碼經地址線送出片外,然后經數據總線進行操作數或指令代碼的傳輸。操作數送相關寄存器或由相關寄存器送到片外,而指令代碼從片外存儲器讀入到指令隊列等待譯碼執行。
EU
1.16位通用寄存器組(AX,BX,CX,DX,SP,BP,SI,DI)
(1)4個16位通用的數據寄存器:AX、BX、CX、DX,又可以各分為兩個8位的寄存器:AL、AH、BL、BH、CL、CH、DL、DH
其中:
AX: 具有累加功能,可作16位累加器,AL可作為8位累加器。
BX: 在基址變址尋址時作為基址寄存器。
CX: 在循環類與串處理類指令執行時作為默認的計數器寄存器。
DX: 作為數據寄存器使用,在雙字運算中存放高16位數據。
(2)另外四個地址指針和變址寄存器
SP(Stack Pointer):堆棧指針寄存器,用來指出堆棧的頂部偏移地址。
BP(Base Pointer):基地址指針寄存器,在間接尋址時作為基地址寄存器。
SI(Source Index):源變址寄存器,在間接尋址時作為地址寄存器或變址寄存器。在字符串處理指令中,作為目的變址寄存器。
DI(Destination Index):目的變址寄存器,在間接尋址時作為地址寄存器或變址寄存器。在字符串處理指令中,作為源變址寄存器。
2.算術邏輯單元(ALU)
它主要完成算術運算、邏輯運算。
3.標志寄存器(FLAG)
它是一個16位的寄存器,用來記錄程序中運行結果的狀態信息,它們是根據有關指令的運行結果由 CPU 自動設置的。其中9位有定義, 9位中6位表示狀態,3位表示控制標志,見圖
(1)進位標志(CF):運算指令執行之后,若在最高位上產生進位、借位時,該標志位被置1。 具體地說,兩個數相加時,最高位(D15或D7)有進位,或當兩個數相減時,最高位有借位,進位標志位被置1,即CF=1;否則CF=0。
(2)奇偶標志(PF):8086/8088 CPU中采用奇校驗,運算指令執行后,運算結果的低8位中含1的位數為偶數時,該標志位被置1,否則被置0。也稱為偶標志位。
(3)輔助進位標志(AF):運算指令執行后。當兩個數相加(減)時,當D3有向D4進(借)位時,該標志位被置1,否則被置0。
(4) 全零標志(ZF):運算指令執行后,結果的每一位都為零時該標志位被置1。
(5) 符號標志(SF):在帶符號數運算時,如果運算結果最高位為1,表示結果為負值,SF位被置1,否則SF位被置0。SF也稱為負標志位。
(6)溢出標志(OF):運算指令執行后,結果的數值產生溢出,該標志位被置1,否則被置0。
(7)方向標志(DF):用于字符串指令操作,當DF=0時,字符串處理由低地址向高地址處理;當DF=1時,則從高位地址向低位地址處理。
(8)中斷允許標志(IF):用來控制可屏蔽硬件中斷。當IF=1時8086微處理器可以接受片外來的可屏蔽中斷請求,開中斷;IF=0時片外來的中斷請求被阻止,關中斷,也稱被屏蔽。
(9)陷阱標志(TF):該標志用來控制單步中斷。在TF=1時,以單步方式執行程序。即8086每執行完—條指令就產生處理器內部單步中斷。單步執行指令可使程序員跟蹤指令的執行過程,進行積序的調試。
4.操作控制電路
操作控制電路是8086微處理器的控制核心,首先將指令隊列中送來的一條指令進行譯碼,然后根據不同指令的功能產生出所需要的控制信號來控制各相關功能部件的操作。
8086、8088的功能結構
微處理器 8086, 8088結構類似。從程序員和使用角度來看的結構即編程結構從功能上分為兩部分:總線接口部分BIU(Bus Interface Unit),執行部分EU(Execution Unit)。
由于指令隊列的存在,兩部分各自執行自己的功能并行工作,這種工作方式與傳統的計算機在執行指令時的串行工作相比極大的提高了工作效率。
計算機執行程序時,CPU的工作順序是:
- 取指令 -> 執行指令 -> 再取指令 -> 再執行指令...CPU串行工作。
- 8086CPU工作順序是:取指令,執行指令同時進行。并行工作。
8088的寄存器結構
存儲器組織
8088的功能結構
- 1、總的存儲空間為1M字節,每段最長可達 64K字節。
- 2、各段起始地址能被 16 整除。(低 4 位為 0 )
- 3、各段之間可分開、部分或完全重疊、可首尾相接。
- 4、根據各段的用途將其定義為CS、DS、ES、SS段。并用偏移地址(距段起址的字節距離)表示被訪問單元。
注:常在CS中用 IP 表示偏移量,SS中用 SP、BP,DS中用 BX、SI、DI、數值 。
實際地址的形成
- 物理地址:20 位
- 邏輯地址:
段基址(段寄存器的內容)16位
偏移地址(字節距離)16位
一個實際地址可用多個邏輯地址表示。
標志寄存器
- CF:進位標志位。當執行一個加法(或減法)運算使最高位產生進位(或借位)時,CF為1,否則為0。
- PF:奇偶標志位。該標志位反映運算結果中1的個數是偶數個還是奇數個。當指令執行結果的低8位中含偶數個1時,PF為1,否則為0.
- AF:輔助進位標志位。當執行一個加法(或減法)運算使結果的低4位向高4位有進位(或借位)時,AF為1,否則為0.
- ZF:零標志位。若當前的運算結果為零,ZF為1,否則為0.
- SF:符號標志位。他與運算結果的最高位相同。
- OF:溢出標志位。當補碼運算有溢出時,OF為1,否則為0.
- DF:方向標志位。用以指定字符串處理的方向,當DF=1,字符串以遞減順序處理,即地址以從高到低順序遞減。反之則以遞增處理。
- IF:中斷允許標志位。它用來控制8086是否允許接收外部中斷請求。若IF=1,8086能響應外部中斷。反之則不響應。注意:IF的狀態不影響非屏蔽中斷請求(NMI)和CPU內部中斷請求。
- TF:跟蹤標志位。為調試程序而設定的陷阱控制位。當TF=1,8086CPU處于單步狀態,此時CPU每執行完一條指令就自動產生一次內部中斷。當該復位后,CPU恢復正常
8086指令系統
數據傳送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。
算術指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、DAA、DAS、AAA、AAS。
邏輯指令:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR。
控制轉移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOPNE、CALL、RET、INT。
串操作指令:MOVS、LODS、STOS、CMPS、SCAS。
標志處理指令:CLC、STC、CLD、STD。
數據傳送指令
通用數據傳送指令
MOV dst, src;傳送指令(move)
執行操作:(dst) ← (src)
功能: 將源操作數(字節或字)傳送到目的地址。
注意:
- 目的操作數dst和源操作數src不能同時用存儲器尋址方式,這個限制適用于所有指令;
- 目的操作數dst不能是CS,也不能用立即數方式;
- 目的操作數dst和源操作數src不允許同時為段寄存器;
- MOV指令不影響標志位。
PUSH src ; 進棧指令(push onto the stack)
執行操作: (SP) ← (SP)-2
((SP)) ← (src)
POP dst ; 出棧指令(pop from the stack)
執行操作: (dst) ← ((SP))
(SP) ← (SP)+2
PUSH和POP指令分別將數據存入堆棧或把堆棧中的數據取出。堆棧是以LIFO(后進先出)方式工作的一個存儲區,程序中定義的堆棧段就是這樣一個LIFO存儲區。數據存入堆棧單元或從堆棧單元中取出都由堆棧指針SP指示,而SP總是指向棧頂,所以進棧和出棧指令都會自動修改SP。
PUSH指令執行時,SP的內容先減2,然后將數據壓入SP所指示的字單元,存儲的方法同樣是高8位存入高地址字節,低8位存入低地址字節。POP指令執行時,將SP所指示的棧頂地址的內容取出放入目的地址,然后SP增2,指向新的棧頂地址。
注意:
PUSH和POP指令只能是字操作,因此存取字數據后,SP的修改必須是+2或-2;
PUSH和POP指令不能使用立即數方式;
POP指令的dst不允許是CS寄存器;
PUSH和POP指令都不影響標志位。
PUSH指令在程序中常用來暫存某些數據,而POP指令又可將這些數據恢復。
XCHG opr1, opr2 ; 交換指令(exchange)
執行操作:(opr1) ←→ (opr2)
XCHG指令使兩個操作數opr1,和opr2互相交換,其中一個操作數必須在寄存器中,另一個操作數可以在寄存器或存儲器中。
注意:
- 不允許使用段寄存器
- 不影響標志位
累加器專用傳送指令
這組指令只限于使用累加器(ac:AX 或AL)傳送信息。
IN ac, port ; 輸入指令(input), port≤0FFH
執行操作: (AL) ← (port) 傳送字節或 (AX) ← (port+1,port) 傳送字
IN ac, DX ; 輸入指令, DX中的port>0FFH
執行操作: (AL) ← ((DX)) 傳送字節或 (AX) ← ((DX)+1,(DX)) 傳送字
OUT port, ac ; 輸出指令(output), port≤0FFH
執行操作: (port) ← (AL) 傳送字節或 (port+1,port) ← (AX) 傳送字
OUT DX, ac ; 輸出指令(output), DX中的 port>0FFH
執行操作: ((DX)) ← (AL) 傳送字節或 ((DX)+1,(DX)) ← (AX) 傳送字
對8086及其后繼機型的微處理機,所有I/O端口與CPU之間的通信都由輸入輸出指令IN和OUT來完成。IN指令將信息從I/O輸入到CPU,OUT指令將信息從CPU輸出到I/O端口,因此,IN和OUT指令都要指出I/O端口地址。微處理機分配給外部設備最多有64K個端口,其中前256個端口(0~FFH)稱為固定端口,可以直接在指令中指定。當端口地址超過8位(≥256),稱為可變端口,它必須先送到DX寄存器,然后再用IN或OUT指令傳送信息。CPU與I/O端口傳送信息的寄存器只限于累加器ac (AX或AL),傳送16位信息用AX,傳送8位信息用AL,這取決于外設端口的寬度。
注意:
- 只限于在AL或AX與I/O端口之間傳送信息
- 不影響標志位
XLAT ; 換碼指令(translate)
執行操作: (AL) ← ((DS)×16+(BX)+(AL))
這條指令根據AL寄存器提供的位移量,將BX指示的字節表格中的代碼換存在AL中。該指令還可寫為:XLAT opr,opr為字節表格的首地址,因為opr所表示的偏移地址已存入BX寄存器,所以opr在換碼指令中可有可無,有則可提高程序的可讀性。
注意:
- 所建字節表格的長度不能超過256字節,因為存放位移量的是8位寄存器AL;
- XLAT指令不影響標志位。
地址傳送指令
這組指令完成把地址送到指定寄存器的功能。
LEA reg, src ; 有效地址送寄存器(load effective address)
執行操作:(reg) ← offset of src
LEA指令把源操作數的有效地址送到指定的寄存器,這個有效地址是由src選定的一種存儲器尋址方式確定的。
LDS reg, src ; 指針送寄存器和DS(load DS with point)
執行操作: (reg) ← (src)(DS) ← (src+2)
LES reg, src ; 指針送寄存器和ES(load ES with point)
執行操作: (reg) ← (src)(ES) ← (src+2)
LDS和LES指令把確定內存單元位置的偏移地址送寄存器,段地址送DS或ES。這個偏移地址和段地址(也稱地址指針)是由src指定的兩個相繼字單元提供的。
注意:
- 指令中的reg不能是段寄存器;
- 指令中的src必須使用存儲器尋址方式;
- 該指令不影響標志位。
標志寄存器傳送指令
這組指令完成和標志位有關的操作。
LAHF 標志寄存器的低字節送AH(load AH with flags)
SAHF AH送標志寄存器低字節(store AH into flags)
PUSHF 標志進棧(push the flags)
POPF 標志出棧(pop the flags)
注意:
- LAHF和SAHF指令隱含的操作寄存器是AH和FLAGS
- LAHF和PUSH不影響標志位,SAHF和POPF則由裝入的值來確定標志位的值。
LAHF 標志寄存器的低字節送AH(load AH with flags)執行操作:(AH) ← (FLAGS)0-7
SAHF AH送標志寄存器低字節(store AH into flags)執行操作:(FLAGS) 0-7 ← (AH)
PUSHF 標志進棧(push the flags)執行操作:(SP) ← (SP)-2((SP)+1,(SP)) ← (FLAGS)0-15
POPF 標志出棧(pop the flags)執行操作:(FLAGS) 0-15 ← ((SP)+1,(SP))(SP) ← (SP)+2
算術指令
加法指令
ADD 加法指令
寫法: ADD DST,SRC
執行操作:(DST)<-(SRC)+(DST)
ADC 帶進位加法指令
寫法: ADC DST,SRC
執行操作:(DST)<-(SRC)+(DST)+CF
ADD 加1指令
寫法: INC OPR
執行操作:(OPR)<-(OPR)+1
減法指令
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)
邏輯指令
AND\OR\XOR\NOT\TEST
寫法:
AND reg/mem,reg/mem/imm;
OR reg/mem,reg/mem/imm;
XOR reg/mem,reg/mem/imm;
NOT reg/mem;
TEST reg/mem,reg/mem/imm;
AND\TEST\OR\XOR,兩個操作數必須類型匹配,而且不能同時是內存操作數。
XOR通常用來將寄存器清0,如 XOR AX,AX;
TEST與AND的關系類似于CMP與SUB。TEST的典型用法是檢查某位是否為1
位移指令
SHL(邏輯左移)
寫法:SHL REG\mem,1\CL ;
作用:將dest的各個二進制位向左移動1(CL)位,并將DEST的最高位移出到CF,最低位移入0。
SAL(算術左移)
寫法:SAL REG\mem,1\CL ;
作用:將dest的各個二進制位向左移動1(CL)位,并將DEST的最高位移出到CF,最低位移入0(同SHL)。
SHR(邏輯右移)
寫法:SHR REG\mem,1\CL ;
作用:將dest的各個二進制位向左移動1(CL)位,并將DEST的最低位移出到CF,最高位移入0。
SAR(算術右移)
寫法:SAR REG\mem,1\CL ;
作用:將dest的各個二進制位向左移動1(CL)位,并將DEST的最低位移出到CF,最高位不變。
SHLD(雙精度左移)
寫法:SHLD REG16/REG32/MEM16/MEM32, REG16/REG32, IMM8/CL;(類型須匹配)
作用:將OPRD1的各二進制左移,并將oprd1的最高位移到CF,oprd2的最高位移到oprd1的最低位,但是,oprd2的值不變。
SHRD(雙精度右移)
寫法與作用與雙精度左移類似。移動方向為右移。
循環移位指令
ROL(循環左移)
寫法:ROL REG\MEM, 1\CL;或 ROL REG/MEM,IMM8;(類型可不匹配)
作用:將DEST的各二進制位向左移動,并將最高位移出到CF,并同時移入最低位。
ROR(循環右移)
寫法:ROR REG\MEM, 1\CL;或 ROR REG/MEM,IMM8;(類型可不匹配)
作用:將DEST的各二進制位向右移動,并將最低位移出到CF,并同時移入最高位。
RCL(帶進位循環左移)
寫法:RCL REG\MEM, 1\CL;或 RCL REG/MEM,IMM8;(類型可不匹配)
作用:將DEST的各二進制位向左移動,并將最高位移出到CF,原CF移入最低位。
RCR(帶進位循環右移)
寫法:RCR REG\MEM, 1\CL;或 RCR REG/MEM,IMM8;(類型可不匹配)
作用:將DEST的各二進制位向右移動,并將最低位移出到CF,原CF移入最高位。
位測試指令
BT(位測試)
寫法:BT REG16/MEM16,REG16/IMM8;或BT REG32/MEM32,REG32/IMM8;
作用:CF=DEST的第index位,dest不變。
BTS(位測試并置位)
寫法:BTS REG16/MEM16,REG16/IMM8;或BTS REG32/MEM32,REG32/IMM8;
作用:CF=DEST的第index位,dest的第index位=1;
BTR(位測試并復位)
寫法:BTR REG16/MEM16,REG16/IMM8;或BTR REG32/MEM32,REG32/IMM8;
作用:CF=DEST的第index位,dest的第index位=0;
BTC(位測試并復位)
寫法:BTC REG16/MEM16,REG16/IMM8;或BTC REG32/MEM32,REG32/IMM8;
作用:CF=DEST的第index位,dest的第index位取反;
位掃描指令
BSF(前向位掃描)
寫法:BSF reg16/reg32, reg16/reg32/mem16/mem32;(類型須匹配)
作用:dest=src中值為1的最低位編號(從低位向高位搜索)
BSR(后向位掃描)
寫法:BSR reg16/reg32, reg16/reg32/mem16/mem32;(類型須匹配)
作用:dest=src中值為1的最高位編號(從高位向低位搜索)
說明:BSF和BSR搜索SRC操作數中首次出現1的位置,BSF從低位向高位搜索,BSR反之。若找到一個1,則置ZF=0,并存儲位編號到DEST操作數中。若SRC=0,即沒有1出現,則置ZF=1,且dest的值不確定。
控制轉移指令開始
JMP(無條件轉移指令)
執行代碼的跳轉,分為兩種,一:段內轉移,即要跳過去的代碼地址和當前地址在同一段,這時只要修改IP(專用寄存器–指令指針)即可;二:段間轉移:即要跳過去的代碼地址和當前代碼地址不在同一段內,需要同時修改CS和IP的值。
寫法:
1、JMP label;若label與該指令位于同一代碼段內,IP=label的偏移地址,否則CS:IP=label的分段地址,簡單的說,就是跳到label的地址去。
2、JMP reg16/mem16;段內轉移,偏移地址=reg16/[mem16]
3、JMP mem32;段間間接轉移,段地址CS=mem32高字,偏移地址IP=mem32低字。
說明:當操作數是內存操作數時,若內存操作數是雙字類型,則產生段間轉移,若內存操作數是字類型,則產生段內間接轉移。當不能確定類型時,編譯器將報錯。
Jcc(條件轉移指令)
寫法:Jcc label;
作用:若條件成立,則IP=label的偏移地址,否則,CPU將忽略該條件轉移,繼續執行下一條指令。
JCXZ/JECXZ(Jump if CX/ECX is zero)
寫法:JCXZ label;(若CX=0,則轉移到label)
? JECXZ label;(若ECX=0,則轉移到label)
說明:label相對位移量必須在-126~127之間
循環指令
LOOP label;
作用:CX=CX-1;若CX<>0,則轉移到label;
LOOPZ/LOOPE label;
作用:CX=CX-1;若CX<>0且 ZF=1,則轉移到label;
LOOPNZ/LOOPNE label;
作用:CX=CX-1;若CX<>0且ZF=0,則轉移到label;
說明:label相對位移量必須在-128~127之間
過程調用和返回指令
CALL(過程調用)
寫法:CALL label;
作用:若label與該指令在同一代碼段,則為段內直接調用,IP進棧,IP=label的偏移地址,如果是不在同一代碼段,則為段間間接調用,CS:IP進棧,CS:IP=label的分段地址
寫法:CALL reg16/mem16;
作用:段內間接調用,IP進棧,IP=reg16/【mem16】
寫法:CALL mem32;
作用:段間間接調用,CS:IP進棧,CS等于mem32高字,ip等于mem32低字。
該指令與JMP指令的區別就是保存了CS:IP的值,這樣在調用指令結束后,可以返回回來而已。
RET(過程返回)
寫法:RET; 近返回或遠返回
RETN; 近返回;
RETF; 遠返回
RET imm16; 近返回或遠返回,并調整堆棧,SP=SP+imm16;
RETN imm16;近返回,并調整堆棧,SP=SP+imm16;
RETF imm16;遠返回,并調整堆棧,SP=SP+imm16;
作用:RET/RETN/RETF:返回地址出棧,從而使調用返回,其中,遠返回是POP一個雙字到CS:IP,而近返回是POP一個字到IP
RET/RETN/RETF imm16:在返回后,CPU立即將imm16加到堆棧指針SP。這種機制用來在返回前將參數從棧中移除。
說明:CALL 與 RET必須配合使用,并且確保返回時棧頂正好是返回地址,不然就會出錯。
INT(中斷指令)
寫法:INT n;(n為中斷號,取值為0~255)
通常,程序內部的跳轉,用JMP或CALL,并且JMP和CALL得參數是要跳轉的過程的入口指令地址,而INT則是調用系統提供的中斷服務程序,并且參數是中斷號,然后由CPU根據中斷號去計算中斷服務程序的入口地址,MS DOS使用中斷號21H作為系統調用,一般INT中斷的步驟如下:
(1)由AH給出中斷號
(2)根據相應功能的要求,設置入口參數
(3)INT 21H
(4)分析和使用出口參數
除了直接以AL或AX返回出口參數外,INT 21H還是用AL或AX作為返回碼,對于功能號0~2eh,由AL返回0(表示成功)或1(表示失敗);其余功能號則由CF返回0或者1,并由AX返回錯誤碼。
標志處理指令開始
CLC ; CF=0
STC ; CF=1
CMC ; CF=NOT CF
CLD ; DF=0
STD ; DF=1
CLI ; IF=0(應慎用)
STI ; IF=1
串操作指令開始
MOVS(串傳送)
寫法:
MOVSB/MOVSW/MOVSD
功能:
ES:[DI]=DS:[SI]
If(DF=0)
Then
SI=SI+size;
DI=DI+size;
Else
SI=SI-size;
DI=DI-size;
Endif
其中,size等于1(B)、2(W)、4(D).
作用:將DS:SI所指源串的一個字節/字/雙字復制到ES:DI所指的內存單元,然后,若DF=0,則SI和DI增加1、2、4,否則減少1、2、4.
LODS(串載入)
寫法:LODSB\LODSW\LODSD
功能:
AL/AX/EAX=DS:[SI];
IF (DF=0) THEN
SI=SI+size;
ELSE
SI=SI-size;
Endif
作用:將DS:SI所指源串的值復制到AL/AX/EAX中,然后,根據DF使SI增加或減小1、2、4
STOS(串存儲)
寫法:
STOSB\STOSW\STOSD
功能:
ES:[DI]=AL/AX/EAX;
IF (DF=0) THEN
DI=DI+size;
ELSE
DI=DI-size;
ENDIF
作用:將AL/AX/EAX中的值復制到ES:[DI]所指的內存單元中去,并根據DF標志位的值調整DI
CMPS(串比較)
寫法:CMPSB/CMPSW/CMPSD
功能:
DS:[SI]-ES:[DI];
IF (DF=0) THEN
SI=SI+size;DI=DI+size;
ELSE
SI=SI-size;DI=DI-size;
ENDIF
作用:將DS:SI所指內存值與ES:DI所指內存值進行比較,并根據比較結果設置標志位,然后,對SI和DI做相應的調整。
SCAS(串掃描)
寫法:SCASB/SCASW/SCASD
功能:
AL/AX/EAX-ES:[DI];
IF (CF=0) THEN
DI=DI+size;
ELSE
DI=DI-size;
ENDIF
作用:將AL/AX/EAX與ES:DI所指內存值進行比較,根據比較結果設置標志位,然后根據DF調整相應的DI的值。
說明:以上串操作的共性:
DS:SI指向源串,ES:DI指向目的串
重復前綴
43、重復前綴
重復前綴用來和以上幾個串操作指令混合使用
REP(重復)
功能:當CX<>0時,重復執行后面的串指令,每執行一次,CX自動-1,該指令只能用在MOVS\LODS\STOS之前
REPZ/REPE(為零/等于時重復)
功能:當CX<>0且ZF=1時,重復執行后面的指令,每執行一次,CX自動-1,該指令只能用在CMPS\ACAS之前。
REPNZ/REPNE(非零/不等于時重復)
功能:CX<>0且ZF=0時,重復執行后面的指令,每執行一次,CX自動-1,該指令只能用在CMPS\ACAS之前。
說明:REPNE SCAS(B/W/D)適用于在多字節、字、雙字數據結構中搜索特定值。
CPU控制指令-
—————————CPU控制指令-
NOP(無操作)
寫法:NOP;
作用:該指令不做任何事情,只占用1個字節,耗費一個指令執行周期。
HIT(暫停)
寫法:HIT;
作用:HIT使CPU進入暫停狀態,這時CPU不執行任何操作,直到系統復位或發生外部中斷為止,中斷使CPU繼續執行后面的指令(貌似和屏保或待機的功能類似)
LOCK(封鎖前綴)
功能:LOCK指令用于多處理器系統,作為某些指令的前綴,可以使CPU通過鎖住總線等方式,抱著指令作為原子性操作,即:指令執行過程不會被打斷操作。
該指令用于以下指令的前綴時,以保證原子性的對內存的“讀-修改-寫”操作:
1) 加法:ADD\ADC\INC\XADD
2) 減法:SUB\SBB\DEC\NEG
3) 交換:XCHG\CMPXCHG\CMPXCHG8B
4) 邏輯:AND\NOT\OR\XOR
5) 位測試:BTS\BTC\BTR
說明:其他類型指令不能加LOCK前綴,另外,XCHG總是原子性操作,無論前面有沒有加LOCK前綴。LOCK前綴典型用于BTS指令,以實現多處理器環境中程序的并發執行,如:
LOCK BTS [EBX],AX
LOCK ADD [SI],AL
總結
- 上一篇: 前端学习(1569):todoMVC准备
- 下一篇: Excel 2010实战技巧精粹