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