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