微型計算機原理與接口技術(shù),這書名看起來好像是講微機原理與接口技術(shù)兩部分,其實我覺得叫微機原理與匯編語言更合適,感覺它講的主要是這兩部分知識,第一部分微機原理是講8086是怎么工作的,第二部分匯編語言講的是怎樣用匯編來控制其完成自己需要完成的任務(wù)。
電腦,或者叫計算機,其本質(zhì)還是用來計算的,只不過計算的數(shù)據(jù)多了,叫成處理,都無所謂,其可以用來處理數(shù)字化的聲音和圖像,導(dǎo)致多媒體技術(shù)的發(fā)展,才有了現(xiàn)在的世界,其實其本質(zhì)還是大量的計算,而程序就是告訴計算機要如何計算或者處理這些數(shù)據(jù),所以這門課的目的就是講怎樣通過計算機來實現(xiàn)一些基本的計算任務(wù)。
首先考慮這樣一道數(shù)學(xué)題:今要用白鐵皮打造一個無蓋圓柱鐵桶,已知其底面半徑為r,高度為h,求需要的鐵皮面積S(忽略接縫處)以及該桶可盛的水的體積V(忽略鐵皮的厚度)。
由上所述,本題的目的就是通過r與h兩個數(shù)據(jù)計算S和V,電腦是死的,不知道怎么算,所以需要程序猿告訴它該怎么算,即編程的過程。
首先考慮人類做此題的過程:通過思考,我們得到解題步驟為先由2πr得底面周長,再由πr^2算得底面積,底面周長乘以h得側(cè)面積2πrh,S等于底面積與側(cè)面積之和(πr^2+2πrh),底面積乘以h得體積πhr^2。
計算機處理這道問題的時候與人一樣,只不過機器遠不如人類靈活。首先,必須將所有需要的東西寫在電腦的內(nèi)存中,電腦通過讀取內(nèi)存中存儲的信息得知需要做哪些工作。而這部分內(nèi)存需要分為四段,即DS,SS,CS和ES。DS和ES稱為數(shù)據(jù)段,其中DS中存儲源數(shù)據(jù),即程序需要處理的數(shù)據(jù),本題為r和h;ES為目標(biāo)數(shù)據(jù)段,存儲處理完的數(shù)據(jù),即S和V。CS稱為代碼段,即程序猿編寫的程序。SS為堆棧段,人類做題時似乎不需要這個,但計算機卻需要,這就體現(xiàn)出其低級的地方,堆棧段的作用后面說。
有了數(shù)據(jù)存放的地方,然后需要的就是指針。指針是內(nèi)存單元的地址,其作用是指示數(shù)據(jù)存放的位置和程序進行的位置。程序進行的過程中,需要有一個指針指示程序進行到了哪一步;當(dāng)程序需要取數(shù)據(jù)時,需要有指針告訴計算機從哪個內(nèi)存單元取數(shù)據(jù),輸出數(shù)據(jù)時也一樣。就上面的例子而言,先取r,通過調(diào)用兩個子程序計算出其面積和周長,再計算表面積與體積。這時堆棧就派上用場了。C艸課中都學(xué)過棧LIFO的特點,棧指針始終指向棧頂。當(dāng)調(diào)用子程序時,將指示程序運行到哪步的指針放入堆棧,然后運行子程序。如子程序中還需調(diào)用子程序,則再次將指針壓入堆棧。當(dāng)子程序執(zhí)行完畢時,將堆棧中的數(shù)據(jù)取出來,上一級程序就可以繼續(xù)執(zhí)行。就好比看書的時候看到了不懂的部分,用書簽夾一下,去查別的書,查完之后再回到該位置繼續(xù)看。堆棧的作用就是存儲那個看不懂的地方在什么位置。還是就上面的例子,其中一個子程序的功能是根據(jù)圓的半徑計算其周長,那么在調(diào)用該子程序前,先將數(shù)據(jù)指針指向r,然后調(diào)用該子程序,電腦將指示程序運行進度的指針壓入堆棧,該子程序先將數(shù)據(jù)r取出存放在CPU的某位置中,再通過子程序中的2πr公式計算出周長,并輸出存放在內(nèi)存的某位置,子程序運行完成后電腦自動從堆棧中彈出指針,主程序繼續(xù)進行。主程序也是類似。例如計算體積,將數(shù)據(jù)指針指向之前計算出的底面積,取出數(shù)據(jù)放在CPU中,再將指針指向h,取出數(shù)據(jù),兩數(shù)相乘得到體積,再將其保存在內(nèi)存的某位置。通過這樣一步一步地執(zhí)行處理數(shù)據(jù)的指令,計算機就能完成一系列計算任務(wù)了。
匯編語言是很低級的語言,直接跟電腦硬件打交道。許多C艸幾句話就寫完的程序用匯編需要寫好長。這是其缺點,優(yōu)點則是效率高,運行速度快。
幾個基本概念:
位和字節(jié):小學(xué)的時候?qū)W過,2是一位數(shù),23是兩位數(shù),233是三位數(shù)……微機原理中的位指的是二進制的位,例如,8086是16位微處理器,指的是它能處理16位的二進制數(shù)據(jù)。2333H就是一個寫成16進制的16位二進制數(shù)。而1個字節(jié)指一個8位二進制數(shù),即8bit=1Byte。一個16位二進制數(shù)的長度就是2B。1024B=1KB。(書30頁)
地址、物理地址、段地址、偏移地址:地址即為每個存儲空間的編號。8086處理器有20根地址線,每個存儲空間的地址需要用一個5位16進制數(shù)表示,即為該存儲空間的物理地址。因8086處理器只能處理16位的數(shù)據(jù),所以用段地址和偏移地址來表示實際的地址,方法為:段地址左移4位(乘16)后加上偏移地址即為物理地址。例如:段地址為2000H,偏移地址為3333H,則該存儲空間的物理地址為23333H(書70~71頁)。一個地址所對應(yīng)的存儲空間能存儲1個字節(jié)的數(shù)據(jù)。
例:某存儲器有12條地址線和8條數(shù)據(jù)線,求該存儲器的容量。
解:因為有8條數(shù)據(jù)線,所以每個地址能存儲1Byte的數(shù)據(jù);12條地址線,共有2^12個地址,所以總?cè)萘繛?^12Byte=4KByte。
第1章:
原碼,反碼,補碼以及之間的轉(zhuǎn)換
正數(shù):原碼=反碼=補碼
負數(shù):反碼:最高位不變,其余位取反;補碼:反碼+1
一個字節(jié)的有符號數(shù),從00H到FFH,原碼:+0,1,2,…,127,-0,-1,…,-127;反碼:+0,1,2,…,127,-127,-126,…,-1,-0;補碼:0,1,2,…,127,-128,-127,…,-1。
例:A=32H,B=100,寫出A、B、[A-B]的原碼,[A-B]的反碼,補碼。
答:原:A:32H=00110010B;B:100=01100100B,A-B=48-100=-52=10110100B。
反:11001011;補:11001100。
ASCII碼:0~9,減30H;A~F,減37H。
第2章:
8086CPU從功能上分為兩大部分,即總線接口單元BIU和執(zhí)行單元EU。
標(biāo)志寄存器FLAGS:
CF:進位標(biāo)志位,有進位時為1。
PF:奇偶標(biāo)志位,運算結(jié)果中1的個數(shù)為偶數(shù)是為1。
ZF:零標(biāo)志位,結(jié)果為0時為1。
SF:負號標(biāo)志位,結(jié)果最高位為1時為1。
OF:溢出標(biāo)志位,有溢出時為1。
總線周期:一個最基本的讀或?qū)懼芷诎?個T狀態(tài),有可能在T3和T4中間插入一個或幾個等待狀態(tài)Tw。
第3章:
尋址時,BP對應(yīng)的段寄存器為SS,其余都是DS。
重要的指令:
MOV,PUSH,POP,LEA(可用MOV+OFFSET代替),PUSHF,POPF。
算數(shù):ADD,ADC,INC,SUB,SBB,DEC。NEG取補。
MUL,IMUL,乘數(shù)在AL或AX中,積在AX或DX+AX中。
DIV,IDIV,被除數(shù)在AX或DX+AX中,商在AL或AX中,余數(shù)在AH或DX中。
CBW,CWD,擴展。
DAA壓縮BCD碼調(diào)整。
邏輯:AND,不需要的與0,需要的與1。
OR,不變的或0,置1的或1。
XOR,求反的異或1,不變的異或0。
TEST(=AND):測是否是0:0FFH;奇偶:01H;正負:80H。
CMP(=SUB)。
跳轉(zhuǎn):JMP,JZ/JNZ是否是零,JA/JAE/JBE/JB無符號數(shù),JG/JGE/JLE/JL有符號數(shù)。
先看ZF,判斷是否相等。無符號數(shù):看CF;有符號數(shù):看SF與OF是否相等。
指令對標(biāo)志位的影響匯總:INC、DEC:不影響CF;邏輯:將CF、OF置0;NOT:不影響標(biāo)志位。
移位:SHL/SHR,ROL/ROR循環(huán),RCL/RCR帶進位循環(huán)。
串操作:MOVS:DS→ES;STOS:ES;LODS:DS。(因為DS是源數(shù)據(jù)段,ES是目標(biāo)數(shù)據(jù)段。)
循環(huán)LOOP:CX中為循環(huán)次數(shù)。
CALL、RET:子程序中用。
第4章:
DOS系統(tǒng)功能調(diào)用:
MOV AH,XXH
INT 21H
01H:鍵盤輸入,將ACSII碼送入AL中。
02H:屏幕輸出,將DL中的ASCII碼對應(yīng)的字符顯示在屏幕上。
09H:顯示字符串,將DX地址中的字符串顯示在屏幕上。
4CH:返回DOS系統(tǒng)。
程序模版:
DATA SEGMENT;定義數(shù)據(jù)段
……
DATA ENDS
STACK SEGMENT;定義堆棧段
STA DW 100 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK, ES:DATA
MOV AX, DATA
MOV DS, AX
MOV ES, AX
MOV AX, STACK
MOV SS, AX
MOV SP, TOP
……
CALL XXX;調(diào)用子程序
……
MOV AH, 4CH;返回DOS系統(tǒng)
INT 21H
XXX PROC NEAR;子程序
……
RET;返回主程序
XXX ENDP;子程序結(jié)束
CODE ENDS;主程序結(jié)束
END START
第5章:
看書上的電路圖,會根據(jù)所給地址補畫圖中的存儲器和接線,會根據(jù)圖寫出每個存儲器對應(yīng)的地址范圍,會計算存儲器容量。
第6章:
CPU與外設(shè)交換的信息與所對應(yīng)接口的三種類型為:數(shù)據(jù),狀態(tài),控制。
CPU與外設(shè)之間數(shù)據(jù)傳送的三種控制方式:直接,中斷,DMA。
中斷向量表:256個中斷向量,每個占4個字節(jié)共1024個單元,位于00000H~03FFFH。
給出中斷類型號,乘4即為中斷向量的起始地址。(書329頁知道0BF6:3A16H怎么來的)
第8章:
8253:
控制字:
選擇計數(shù)器-讀寫方式-工作方式-計數(shù)選擇
例:CNT0工作在方式3:00 11 011 0=36H
CNT1工作在方式0:01 11 000 0=70H
六種工作方式中,有2種是硬件啟動,2種初值不能自動重裝。
方式0:軟件啟動,輸出一段時間的低電平。(例如按鍵后燈亮1s后熄滅)
方式1:因其為硬件啟動,幾乎不會考。
方式2:每個周期中有1個脈沖時間為低電平。
方式3:方波,每個周期中一半高電平一半低電平。
N的計算:N即為輸出的周期與輸入周期的比值。
程序模版:
假設(shè)8253的地址為0230H~0233H,CNT0工作在方式3,N=2333H
MOV DX, 0233H;控制端地址
MOV AL, 36H;CNT0控制字
OUT DX, AL;輸出
MOV DX, 0230H;CNT0地址
MOV AX, 2333H;N
OUT DX, AL;先輸出低字節(jié)
MOV AL, AH;將高字節(jié)移動到AL(因OUT只能在AL輸出)
OUT DX, AL;再輸出高字節(jié)
8255:
控制字:一般只考方式0,且A端口輸入,B端口輸出,所以為1 00 1 0 0 0 0=90H。
C端口:高四位是0,低四位中前3位是要置入的編碼,后1位是置1還是置0。
例:要把PC3置1,則控制字為0000 011 1=07H。
檢測鍵盤有按鍵則返回DOS:
……
MOV AH, 01H
INT 16H;檢測按鍵
JNZ FINISH;有按鍵則跳
……
FINISH: MOV AH, 4CH;結(jié)束,返回DOS
INT 21H
……