




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、計算機硬件基礎(chǔ)實驗報告指導(dǎo)教師:姓名:班級:學(xué)號:目錄實驗一:運算器實驗第3頁實驗二:存儲器讀寫實驗第6頁實驗三:數(shù)據(jù)通路實驗第8頁實驗四:微程序控制器試驗第10頁實驗五:TEG-G1模型計算機(微程序控制器)測試第12頁實驗六:TEG-G1模型計算機(硬連線控制器)測試第14頁實驗七:程序調(diào)試BEDUG實驗第16頁實驗八:內(nèi)存操作數(shù)及尋址方法實驗第18頁附錄部分:第20頁實驗七 調(diào)試程序DEBUG實驗手冊實驗八 內(nèi)存操作數(shù)及尋址方法實驗手冊實驗一:運算器實驗一、實驗?zāi)康模?.熟悉寄存器的讀寫操作。2.熟悉運算器的數(shù)據(jù)通路。3.驗證運算器的加、減、與、或功能。4.按給定的數(shù)據(jù),完成幾種指定的算
2、術(shù)、邏輯運算功能。二、實驗原理:實驗電路圖詳見實驗指導(dǎo)書P12-P13頁。操作方式選擇S3 S2 S1 S0M操作類型功能HLLHL加法F=A加BLHHLL減法F=A減BHLHHH邏輯與F=A與BHHHLH邏輯或F=A或BHHHHH傳送1F=AHLHLH傳送2F=BTEC-G1中運算器操作功能實驗設(shè)備:1.TEC-G1計算機組成實驗系統(tǒng)1臺2.雙蹤示波器1臺3.直流萬用表1只實驗內(nèi)容:用邏輯筆測試時序信號T1、T2、T3。對下述7組數(shù)據(jù)進行加、減、與、或運算。A=0F0H,B=10HA=10H,B=0F0HA=03H,B=05HA=0AH,B=0AHA=0FFH,B=0AAHA=55H,B=0
3、AAHA=0C5H,B=61H3.在實驗過程中,記錄每一步中有關(guān)信號的值,并對這些信號的作用予以解釋。實驗步驟:詳見實驗指導(dǎo)書P14-P16頁。六、實驗結(jié)果:1.用邏輯筆測試時序信號T1、T2、T3時序信號QD指示燈D1D0高低 T1 T2 T32.7組數(shù)據(jù)的加、減、與、或運算結(jié)果與C、Z標(biāo)志位數(shù)值運算加減與或CZA=0F0H,B=10HA=10H,B=0F0HA=03H,B=05HA=0AH,B=0AHA=0FFH,B=0AAHA=55H,B=0AAHA=0C5H,B=61H3.試驗中記錄每一步中有關(guān)信號的值,并對這些信號的作用予以解釋操作指示燈SEL0SEL1SEL2SEL3LRSWBUS
4、ALUBUSLDZLDC寫入D0-D7寫入A0-A7寫入B0-B7,加減與或重置解釋: 七、思考題:(加分項目)為什么在A總線上出現(xiàn)數(shù)據(jù)A、在B總線上出現(xiàn)數(shù)據(jù)B后,在數(shù)據(jù)總線DBUS上能夠直接觀測運算的數(shù)據(jù)結(jié)果,而標(biāo)志結(jié)果卻在下一步才能觀測到?答: 實驗二:存儲器讀寫實驗實驗?zāi)康模?.了解靜態(tài)隨機讀寫存儲器MH6116的基本工作特性及使用方法。2.了解半導(dǎo)體存儲器SRAM怎樣存儲和讀出數(shù)據(jù)。實驗原理:詳見實驗報告書P16-P19頁。注:1.存儲器器件HM6116外形圖詳見實驗報告書P17頁2.寫操作時序圖詳見實驗報告書P17頁3.讀操作時序圖詳見實驗報告書P18頁4.存儲器實驗電路圖詳見實驗報
5、告書P18頁實驗設(shè)備:1.TEC-G1計算機組成實驗系統(tǒng)1臺2.雙蹤示波器1臺(非必備)3.直流萬用表1只實驗內(nèi)容:將下列10十個數(shù)寫入從地址23H開始的10個存儲單元。10H,11H,12H,13H,14H,2AH,2BH,25H,0FH,08H2.從地址23H開始的存儲單元連續(xù)讀出10個數(shù),并將讀出的數(shù)和寫入的數(shù)比較,看是否一致。3.在存儲器讀、寫的過程中,記錄下有關(guān)信號的值,并且解釋這些信號的作用。實驗步驟:詳見實驗報告書P19-P21頁。實驗結(jié)果:1.實驗內(nèi)容1和2制作成動畫錄像收存2.在存儲器讀、寫的過程中,記錄下有關(guān)信號的值,并且解釋這些信號的作用操作指示燈SWBUSRAMBUSL
6、ARSELARLRWARINC輸入存儲地址輸入存儲信息輸入讀取地址解釋: 3.結(jié)合實驗報告書P18頁的存儲器實驗電路圖,說明在TEC-G1模型見算計中是如何實現(xiàn)存儲器的讀寫答: 七、思考題:(加分項目)在TEC-G1模擬計算機中,信號SWBUS和RAMBUS能否同時為1?為什么?答: 實驗三:數(shù)據(jù)通路實驗實驗?zāi)康模?.了解TEC-G1模型計算機的數(shù)據(jù)通路。2.了解各種數(shù)據(jù)在TEC-G1模型計算機數(shù)據(jù)通路中的流動路徑。實驗原理:詳見實驗報告書P21-P23頁。TEC-G1模型計算機數(shù)據(jù)通路框圖詳見實驗報告書P22頁。實驗設(shè)備:1.TEC-G1計算機組成實驗系統(tǒng)1臺2.雙蹤示波器1臺(非必備)3.
7、萬用直流表1只實驗內(nèi)容:1.向R0中寫入35H,向R1中寫入86H。2.將R0中的數(shù)寫入存儲器20H單元,從存儲器20H單元讀數(shù)到R2。3.將R1中的數(shù)寫入存儲器20H單元,從存儲器20H單元讀數(shù)到R3。4.檢查R2、R3的內(nèi)容是否正確。5.在上述任務(wù)中記錄有關(guān)信號的值,并對信號的取值做出正確的解釋。實驗步驟:詳見實驗報告書P23-P24頁。六、實驗結(jié)果:1.實驗內(nèi)容1和2制作成動畫錄像收存2.在實驗過程中記錄有關(guān)信號的值,并對信號的取值做出正確的解釋 七、思考題:(加分項目)1.在實驗報告書P23-P24頁的實驗步驟3-6中是否改變了R0和R1的值?為什么?答: 2.在實驗報告書的P24頁的
8、實驗步驟6中A總線A7-A0上顯示的是哪個寄存器的值?為什么?答: 實驗四:微程序控制器試驗實驗?zāi)康模?.掌握時序信號發(fā)生器的工作原理。2.了解TEC-G1模型計算機的微程序控制器的原理。3.學(xué)會微程序控制器的一般設(shè)計方法。4.讀懂微程序流程。5.理解微程序流程圖設(shè)計方法。實驗原理:詳見實驗報告書P25-P30頁。注:1.時序信號發(fā)生器電路圖詳見實驗報告書P25頁。2.名稱助記符功能指令格式IR7 IR6 IR5 IR4IR3 IR2IR1 IR0加法ADD R0,RsRO - R0 + Rs000000Rs減法SUB R0,RR0 - R0 - Rs000100Rs邏輯與AND R0,RR0
9、 - R0 and Rs001000Rs邏輯或OR RO,RR0 - R0 or Rs001100Rs傳送1MOVA Rd,R0Rd - R00100Rd00傳送2MOVB R0,RsR0 - Rs101000Rs取數(shù)LD R0,immRd - imm0101RdXX 立即數(shù)imm存數(shù)ST R0,addrR0 DEBUG ; 進入DEBUG-R ; 查看當(dāng)前各寄存器的內(nèi)容AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=1271 ES=1271 SS=1271 CS=1271 IP=0100NV UP EI PL
10、 NZ NA PO NC1271:0100 B83412 MOV AX,1234-D 0:0 ; 查看O:O7FH內(nèi)存塊的內(nèi)容0000:0000 9E OF C9 00 65 04 70 00-16 00 EB 07 65 04 70 00 e.pe.p.0000:0010 65 04 70 00 54 FF 00 F0-58 7F 00 F0 F5 E7 00 F0 e.p.T.X:-U FFFF:0 ; 反匯編FFFF:0處的指令FFFF:0000 CDl9 INT 19FFFF:0002 E000 LOOPNZ 0004::-A ; 匯編一條指令1271:0100 MOV AX,1234
11、1271:0103-T = 100 ; 執(zhí)行該指令A(yù)X=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=1271 ES=1271 SS=1271 CS=1271 IP=0103NV UP EI PL NZ NA PO NC1271:0103 E9C300 JMP 01C9-R ; 查看指令執(zhí)行后結(jié)果AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI。0000DS=1271 ES:1271 SS=1271 CS=1271 IP=0103NV UP E1
12、PL NZ NA PO NC-Q ; 退出DEBUGD:2)在DEBUG下查看開機后執(zhí)行的第一條指令D:DEBUG ; 進入DEBUG-u FFFF:0 ; 反匯編FFFF:0處的指令: ; 顯示指令-Q ; 退出DEBUG3)在DEBuG下查看數(shù)據(jù)在內(nèi)存中的存放情況D:DEBUG ; 進入DEBUG-A ; 匯編一條傳送指令1693:0100 MOV word ptrO,12341693:0106-T ; 執(zhí)行該指令A(yù)X=0000 BX=0000 CX=0000 DX=0000SP=FFEE BP=0000 SI=0000 DI=0000DS=1693 ES=1693 SS=1693 CS=
13、1693 IP=0106NV UP E工PL NZ NA PO NC1693:0106 50 PUSH AX-D DS:0 ; 查看結(jié)果1693:0000 34 12 FF 9E OO 9A EE FE-lD F0 4F 03 18 10 8A 031693:0010 18 10 17 03 18 10 23 OE-0l 0l 01 00 02 FF FF FF-Q ; 退出DEBUG討論1.開機后的第一條指令應(yīng)該在內(nèi)存的什么區(qū)域?是在ROM還是RAM中?為什么?2.開機后執(zhí)行的第一條指令的地址是否固定?為什么?當(dāng) PC 的電源打開后,PC 硬件產(chǎn)生RESET信號給CPU ,RESET結(jié)束后
14、80 x86 結(jié)構(gòu)的 CPU 將自動進入實模式,并從地址 0 xFFFF0 開始自動執(zhí)行程序代碼,這個地址通常是 ROM-BIOS 中的 地址。第一步: 當(dāng)我們按下電源開關(guān)時,電源就開始向主板和其它設(shè)備供電,此時電壓還不太穩(wěn)定,主板上的控制芯片組會向cpu發(fā)出并保持一個reset(重置)信號,讓cpu內(nèi)部自動恢復(fù)到初始狀態(tài),但cpu在此刻不會馬上執(zhí)行指令。當(dāng)芯片組檢測到電源已經(jīng)開始穩(wěn)定供電了(當(dāng)然從不穩(wěn)定到穩(wěn)定的過程只是一瞬間的事情),它便撤去reset信號(如果是手工按下計算機面板上的reset按鈕來重啟機器,那么松開該按鈕時芯片組就會撤去reset信號),cpu馬上就從地址ffff0h處開
15、始執(zhí)行指令,從前面的介紹可知,這個地址實際上在系統(tǒng)bios的地址范圍內(nèi),無論是award bios還是ami bios,放在這里的只是一條跳轉(zhuǎn)指令,跳到系統(tǒng)bios中真正的啟動代碼處。第二步: 系統(tǒng)bios的啟動代碼首先要做的事情就是進行post(poweron self test,加電后自檢),post的主要任務(wù)是檢測系統(tǒng)中一些關(guān)鍵設(shè)備是否存在和能否正常工作,例如內(nèi)存和顯卡等設(shè)備。由于post是最早進行的檢測過程,此時顯卡還沒有初始化,如果系統(tǒng)bios在進行post的過程中發(fā)現(xiàn)了一些致命錯誤,例如沒有找到內(nèi)存或者內(nèi)存有問題(此時只會檢查640k常規(guī)內(nèi)存),那么系統(tǒng)bios就會直接控制喇叭發(fā)聲
16、來報告錯誤,聲音的長短和次數(shù)代表了錯誤的類型。在正常情況下,post過程進行得非常快,我們幾乎無法感覺到它的存在,post結(jié)束之后就會調(diào)用其它代碼來進行更完整的硬件檢測。第三步: 接下來系統(tǒng)bios將查找顯卡的bios,前面說過,存放顯卡bios的rom芯片的起始地址通常設(shè)在c0000h處,系統(tǒng)bios在這個地方找到顯卡bios之后就調(diào)用它的初始化代碼,由顯卡bios來初始化顯卡,此時多數(shù)顯卡都會在屏幕上顯示出一些初始化信息,介紹生產(chǎn)廠商、圖形芯片類型等內(nèi)容,不過這個畫面幾乎是一閃而過。系統(tǒng)bios接著會查找其它設(shè)備的bios程序,找到之后同樣要調(diào)用這些bios內(nèi)部的初始化代碼來初始化相關(guān)的設(shè)
17、備。第四步: 查找完所有其它設(shè)備的bios之后,系統(tǒng)bios將顯示出它自己的啟動畫面,其中包括有系統(tǒng)bios的類型、序列號和版本號等內(nèi)容。第五步: 接著系統(tǒng)bios將檢測和顯示cpu的類型和工作頻率,然后開始測試所有的ram,并同時在屏幕上顯示內(nèi)存測試的進度,我們可以在cmos設(shè)置中自行決定使用簡單耗時少或者詳細耗時多的測試方式。第六步: 內(nèi)存測試通過之后,系統(tǒng)bios將開始檢測系統(tǒng)中安裝的一些標(biāo)準硬件設(shè)備,包括硬盤、cdrom、串口、并口、軟驅(qū)等設(shè)備,另外絕大多數(shù)較新版本的系統(tǒng)bios在這一過程中還要自動檢測和設(shè)置內(nèi)存的定時參數(shù)、硬盤參數(shù)和訪問模式等。第七步: 標(biāo)準設(shè)備檢測完畢后,系統(tǒng)bio
18、s內(nèi)部的支持即插即用的代碼將開始檢測和配置系統(tǒng)中安裝的即插即用設(shè)備,每找到一個設(shè)備之后,系統(tǒng)bios都會在屏幕上顯示出設(shè)備的名稱和型號等信息,同時為該設(shè)備分配中斷、dma通道和i/o端口等資源。第八步: 到這一步為止,所有硬件都已經(jīng)檢測配置完畢了,多數(shù)系統(tǒng)bios會重新清屏并在屏幕上方顯示出一個表格,其中概略地列出了系統(tǒng)中安裝的各種標(biāo)準硬件設(shè)備,以及它們使用的資源和一些相關(guān)工作參數(shù)。實驗八 內(nèi)存操作數(shù)及尋址方法實驗?zāi)康?1)熟練掌握DEBUG的常用命令,學(xué)會用DEBUG調(diào)試程序。(2)掌握數(shù)據(jù)在內(nèi)存中的存放方式和內(nèi)存操作數(shù)的幾種尋址方式。(3)掌握簡單指令的執(zhí)行過程。實驗內(nèi)容(1)求兩數(shù)和程序
19、與兩數(shù)多字節(jié)加減法程序。(2)求累加和程序。(3)求多個多字節(jié)數(shù)據(jù)的加法程序。實驗器材 依據(jù)自己計算機寫出硬件配置。基本操作(1)求兩數(shù)和程序與兩數(shù)多字節(jié)加減法程序。 MOV AX,1234 直接尋址 MOV 1000,AX MOV BX,1002 MOV BYTE PTRBX,20 MOV DL,39 INC BX MOV BX,DL DEC DL MOV SI,3 MOV BX+SI,DL MOV BX+SI+1,DL MOV WORD PTRBX+SI+2,2846 用A命令輸入上述程序,并用T命令逐條運行。 每運行一條有關(guān)內(nèi)存操作數(shù)的指令,要用D命令檢查并記錄有關(guān)內(nèi)存單元的內(nèi)容,注明是
20、什么尋址方式。注意:D命令顯示結(jié)果中右邊的AscII字符及雙字節(jié)數(shù)存放法。注意將相應(yīng)的信息寫在對應(yīng)的語句旁,用注釋方式 (2)求累加和程序。 MOV BX,1000 MOV CX,10 SUB AX,AXLOP:ADD AL,BX ADC AH,O INC BX J:LOOP LOP INT3 用A命令將程序輸入到100H開始的內(nèi)存中,在輸入時記下標(biāo)號LOP和J的實際地址,在輸入LOOP指令時LOP用實際地址值代替。 用命令N AA將此程序命名為文件AA(文件名可任取)。 用R命令將BX:CX改為程序長度值(即最后一條指令后面的地址減去開始地址)。 用命令w 100將此程序存到AA命名的磁盤文
21、件中。 用命令Q退出DEBUG。 用命令DEBUG AA再次調(diào)入DEBUG和文件AA,可用u命令檢查調(diào)入程序。若調(diào)入DEBUG時忘了加AA文件名,可用N命令和L命令將文件調(diào)入。 用E命令在內(nèi)存地址1000H處輸入16個數(shù)字。 用命令G100J(J用實際地址代替),使程序運行并停在斷點J上,檢查AX和BX的值是否符合估計值。 用T命令運行一步,觀察程序方向(IP值)和CX值是否與估計一樣,若不一樣,檢查程序是否有錯。 重復(fù)G、J與T命令,再檢查AX的值是否正確。 用G命令使程序運行到結(jié)束,檢查AX的值是否正確。 (3)求多個多字節(jié)數(shù)據(jù)的加法程序。 MOV DI,1000 NOV CX, MOV
22、SI,2000 CLCLOP:MOV AL,SI ADC DI,AL INC SI INC DI LOOP LOP INT 20 用A命令輸入此程序。 用E命令在1000H開始處輸入一個8B被加數(shù),在2000H開始處輸人一個8B加數(shù),均為低字節(jié)在前面。 用G命令運行此程序,并用D命令檢查其結(jié)果(存放在哪里?),是否正確? 將INT 20H指令改為INT 3,有何區(qū)別?若不加這條指令,行不行?試一試。姬神出品必屬精品附錄資料:不需要的可以自行刪除 C語言-INT10中斷號視頻服務(wù)程序00H(設(shè)置視頻模式)輸入: AH=00H AL=視頻模式輸出: 無 說明:視頻服務(wù)程序00H用來設(shè)置視頻配置為表
23、10-l中列出之一。AL寄存器給定所需視頻模式。若設(shè)置了新視頻模式,則清除屏幕。 視頻服務(wù)程序0lH(設(shè)置光標(biāo)大小)輸入: AH=01H CH=光標(biāo)開始掃描行 CL=光標(biāo)結(jié)束掃描行輸出: 無說明:該服務(wù)程序用于正文模式。在一個字符單元內(nèi)由一行或幾行組成的光標(biāo)將在字符顯示位置得閃爍。該服務(wù)程序定義光標(biāo)的顯示行數(shù)。對CGA模式,8掃描行(07)用于光標(biāo)。對EGA模式,使用14行(013)。MCGA和VGA適配器,光標(biāo)可具有16掃描行(015)高。缺省設(shè)置如下: CGA: CH6,CL7 EGA: CHll,CL12 MCGA和VGA: CH量13,CL1 視頻服務(wù)程序02H(設(shè)置光標(biāo)位置)輸入:
24、AH=02H BH=光標(biāo)頁號 DH=光標(biāo)行號 DL=光標(biāo)列號輸出: 無說明:該服務(wù)器序用于將光標(biāo)移到指定行和列位置。該服務(wù)程序即可用于正文模式也可用于圖形模式;然而,僅在正文模式下才顯示光標(biāo)。屏幕左上角為坐標(biāo)系統(tǒng)的原點。對支持多頁的正文和圖形模式,則必須指定頁號,以保證光標(biāo)位置正確。視頻服務(wù)程序03H(讀光標(biāo)位置)輸入: AH=03H BH=頁號輸出: CH=光標(biāo)開始行 CL=光標(biāo)結(jié)束行 DH=行號 DL列號說明:該服務(wù)程序用于獲取光標(biāo)大小和位置。BH給定了頁號。CH中存放光標(biāo)開始掃描行,而CL中為光標(biāo)結(jié)束掃描行。DH中存放行位置,DL中為列位置。視頻服務(wù)程序05H(設(shè)置活動顯示頁)輸入: A
25、H=05H AL=活動頁號輸出: 無 說明:該服務(wù)程序為正文和圖形模式用來設(shè)置活動顯示頁號。AL指定所需頁號。對多數(shù)正文模式,頁號范圍為0一7。對具有足夠視頻緩沖EGA和VGA適配器,可支持多頁圖形。對所有正文和圖形模式,缺省為0頁。視頻服務(wù)程序06H(向上翻滾活動窗口)。輸入:AH=06HAL=翻滾行數(shù)BH=空白行屬性CH左上角行號CL=左上角列號 DH右下角行號 Dl右下角列號輸出: 無 說明:該服務(wù)程序用來創(chuàng)建和翻滾一正文窗口。CH和CL中給出了正文窗口左上角坐標(biāo),DH和DL中給出了正文窗口右下角坐標(biāo)。AL中定義了翻滾的行數(shù)。若AL00H,則正文窗口為空白。當(dāng)滾動窗口時,底部行是空白行,
26、其屬性由BH中指定。視頻服務(wù)程序07H(向下翻滾窗口)輸入:AH=07HAL=翻滾行數(shù)BH=空白行屬性CH=左上角行號CL=左上角列號DH=右下角行號DL=右下角列號輸出: 無說明:該服務(wù)程序用來創(chuàng)建和翻滾一正文窗口。CH和CL中給出了正文窗口左上角坐標(biāo),DH和DL中給出了正文窗口右下角坐標(biāo)。AL中定義了翻滾的行數(shù)。若AL00H,則正文窗口為空白。當(dāng)滾動窗口時,頂部行為空白,其屬性由BH中指定。視頻服務(wù)程序08H(讀字符和屬性)輸入: AH=08H BH=活動頁號輸出: AH=字符屬性 AL=字符碼說明:該服務(wù)程序用于讀取正文或視頻模式下,光標(biāo)所在處字符。在圖形模式下,獲取的字符同圖形模式下使
27、用的字符生成表有關(guān)。在正文模式下,將獲得字符的ASCII碼。字符屬性存放在AH中,字符ASCII碼存放在AL中。圖形模式下,AH中內(nèi)容無意義.視頻服務(wù)程序09H(寫字符和屬性)輸入: AH09H AL=寫字符的ASCII碼 BL=寫字符的屬性 BH=活動頁號 CX=重復(fù)寫字符和屬性次數(shù)輸出: 無 說明:該服務(wù)程序?qū)懸粋€字符到屏幕當(dāng)前光標(biāo)處。AL中指定字符碼。正文模式下,BL中指定字符屬性。圖形模式下,BL指定背景顏色。字符可重復(fù)寫。CX為寫字符及屬性的次數(shù)。視頻服務(wù)程序0FH(取當(dāng)前視頻模式)輸入: AH0FH輸出: AH每行字符數(shù) AL當(dāng)前顯示模式 BH活動頁號說明:該服務(wù)程序用來獲取當(dāng)前視
28、頻模式,屏幕寬(以字符計),以及活動顯示頁號;視頻顯示模式存放在AL中。屏幕寬度(以字符計)存放在AH中,活動頁號存放在BH中。文件相關(guān)函數(shù)函數(shù)名: fopen功 能: 打開一個流用 法: FILE *fopen(char *filename, char *type);函數(shù)名: fclose功 能: 關(guān)閉一個流用 法: int fclose(FILE *stream); fopen()函數(shù)提供了幾種打開文件的方式,這是由其字符指針參數(shù)type決定的。以下給出打開方式列表:參數(shù)作用R只讀W新建、可寫,如果文件存在則覆蓋A存在則在文件后附加,如果不存在則新建后寫r+更新一個存在的文件(讀和寫)w+
29、增加一個新的文件更新(讀和寫),如果文件存在則覆蓋a+存在則在文件后附加(讀和寫),如果不存在則新建后更新(讀和寫)*以文本模式打開一個存在或新建的文件,附加”t”在參數(shù)后(rt, w+t, etc.)。*以二進制模式打開一個存在或者新建的文件,附加”b”在參數(shù)后(wb, a+b, etc.)。函數(shù)名: fseek功 能: 重定位流上的文件指針用 法: int fseek(FILE *stream,long offset,int fromwhere); 讀取文件函數(shù):函數(shù)名: fread功 能: 從一個流中讀數(shù)據(jù)用 法: int fread( void *ptr, int size, int
30、nitems, FILE *stream ); 寫入文件函數(shù):函數(shù)名: fwrite功 能: 寫內(nèi)容到流中用 法: int fwrite( void *ptr, int size, int nitems, FILE *stream ); fseek()函數(shù)提供了文件指針的三個初始位置,這是由其參數(shù)fromwhere決定的,以下給出其列表:常量值文件定位SEEK_SET0從文件頭開始尋找SEEK_CUR1從文件當(dāng)前位置開始尋找SEEK_END2從文件最后開始尋找函數(shù)名: fprintf功 能: 傳送格式化輸出到一個流中用 法: int fprintf( FILE *stream, char *f
31、ormat, argument,. );函數(shù)名: fscanf功 能: 從一個流中執(zhí)行格式化輸入用 法: int fscanf( FILE *stream, char *format,argument. );發(fā)聲函數(shù)函數(shù)名: sound功 能: 以指定頻率打開PC揚聲器用 法: void sound(unsigned frequency);函數(shù)名: nosound功 能: 關(guān)閉PC揚聲器用 法: void nosound(void);常規(guī)內(nèi)存操作函數(shù)申請函數(shù):malloc(),farmalloc(),calloc(),farcalloc(),realloc(),farealloc()函數(shù)名:
32、malloc功 能: 內(nèi)存分配函數(shù)用 法: void *malloc(unsigned size);函數(shù)名: farmalloc功 能: 從遠堆中分配存儲塊用 法: void far *farmalloc(unsigned long size);函數(shù)名: calloc功 能: 分配主存儲器用 法: void *calloc(size_t nelem, size_t elsize);函數(shù)名: farcalloc功 能: 從遠堆棧中申請空間用 法: void far *farcalloc( unsigned long units, unsigned ling unitsz );函數(shù)名: reall
33、oc功 能: 重新分配主存用 法: void *realloc(void *ptr, unsigned newsize);函數(shù)名: farrealloc功 能: 調(diào)整遠堆中的分配塊用 法: void far *farrealloc( void far *block, unsigned long newsize );使用函數(shù):memcpy(),memset(),memmove(),movedata()函數(shù)名: memcpy功 能: 從源source中拷貝n個字節(jié)到目標(biāo)destin中用 法: void *memcpy(void *destin,void *source,unsigned n);函數(shù)
34、名: memset功 能: 設(shè)置s中的所有字節(jié)為ch, s數(shù)組的大小由n給定用 法: void *memset(void *s, char ch, unsigned n);函數(shù)名: memmove功 能: 移動一塊字節(jié)用 法: void *memmove(void *destin,void *source,unsigned n);函數(shù)名: movedata功 能: 拷貝字節(jié)用 法: void movedata(int segsrc, int offsrc, int segdest, int offdest, unsigned numbytes);釋放函數(shù):free(),farfree()函數(shù)名
35、: free功 能: 釋放已分配的塊用 法: void free(void *ptr);函數(shù)名: farfree功 能: 從遠堆中釋放一塊用 法: void farfree(void);指針操作函數(shù):MK_FP(),FP_OFF(),FP_SEG()函數(shù)名: MK_FP功 能: 設(shè)置一個遠指針用 法: void far *MK_FP(unsigned seg, unsigned off);函數(shù)名: FP_OFF功 能: 獲取遠地址偏移量用 法: unsigned FP_OFF(void far *farptr);函數(shù)名: FP_SEG功 能: 獲取遠地址段值用 法: unsigned FP_S
36、EG(void far *farptr);如果想知道還剩下多少常規(guī)內(nèi)存,我們可以使用以下函數(shù):函數(shù)名: coreleft()功 能: 獲取空閑內(nèi)存用 法: unsigned coreleft(void);函數(shù)名: farcoreleft()功 能: 獲取遠堆空閑內(nèi)存用 法: unsigned long farcoreleft(void);XMS功能調(diào)用索引表:功能號功能版本功能00H功能01H功能02H功能03H功能04H功能05H功能06H功能07H功能08H功能09H功能0AH功能0BH功能0CH功能0DH功能0EH功能0FH功能10H功能11H取XMS版本號請求高內(nèi)存區(qū)HMA釋放高內(nèi)存區(qū)
37、HMA全程啟用A20全程停用A20局部啟用A20局部停用A20查詢A20狀態(tài)查詢自由擴展內(nèi)存分配擴展內(nèi)存塊釋放擴展內(nèi)存塊移動擴展內(nèi)存塊鎖住擴展內(nèi)存塊擴展內(nèi)存塊解鎖取EMB句柄信息重新分配擴展內(nèi)存塊請求上位存儲塊UMB釋放上位存儲塊UMBXMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS規(guī)范V2.0XMS功能調(diào)用函數(shù)1. 測試xms是否存
38、在使用中斷2fH的43H(AH)功能的00H(AL)子功能,可以獲得是否安裝了XMS驅(qū)動程序的信息,如果AL返回為80H則說明XMS安裝了。以下給出具體函數(shù):char test_xms() asm mov ax,0 x4300int 0 x2f if (_AL=0 x80) XMS=1; return(XMS);2. 獲取xms驅(qū)動程序入口地址使用中斷2fH的43H(AH)功能的10H(AL)子功能,可以獲得xms驅(qū)動程序入口地址,返回的ES:BX便是具體的入口。以下給出具體函數(shù):void get_driver_address() if (XMS) asm mov ax,0 x4310 /功能
39、號43H int 0 x2f /調(diào)用中斷2fH xms=(void (far *)()(long)(_ES)lock_count=_BH; handle_info-free_handle=_BL; /獲取可用的句柄handle_info-size=_DX; /獲取句柄分配的塊的容量 return(error_code); 18. 為句柄重新分配內(nèi)存使用功能0FH(AH)可以為句柄重新分配內(nèi)存,DX給入句柄,BX給入新的塊的容量(單位:K),AX返回0001H表示成功、0000H表示失敗,失敗時BL返回錯誤代碼,以下給出具體函數(shù):char reallocate_xms_block(unsigne
40、d handle,unsigned size) char error_code=0 xff; if (XMS) asm mov ah,0 x0f mov dx,handle mov bx,size xms();error_code=_BL; return(error_code); 19. 請求分配UMB使用功能10H(AH)可以請求分配UMB(upper memory block,即上位內(nèi)存, 640K以上的非EMS內(nèi)存),DX給入塊的大小(單位:節(jié), 即paragraphs, 為16個字節(jié)),AX返回0001H表示成功、0000H表示失敗,BX返回分配UMB的段地址,DX返回塊的實際容量ac
41、tual size of block,失敗時BL返回錯誤代碼,以下給出具體函數(shù):typedef struct UMB_info unsigned UMB_segment; unsigned size; ui;char request_UMB(unsigned size,ui *info) char error_code=0 xff; if (XMS) asm mov ah,0 x10 mov dx,size xms();error_code=_BL;info-UMB_segment=_BX;/返回umb段地址info-size=_DX;/返回容量 return(error_code); 20.
42、 釋放UMB使用功能11H(AH)可以釋放UMB(upper memory block),640K以上的非EMS內(nèi)存),DX給入要釋放的UMB內(nèi)存的段地址,AX返回0001H表示成功、0000H表示失敗,失敗時BL返回錯誤代碼,以下給出具體函數(shù):char release_UMB(unsigned segment) char error_code=0 xff; if (XMS) asm mov ah,0 x10 mov dx,segment xms();error_code=_BL; return(error_code); 這里值得一提的是HIMEM.SYS需要至少為256字節(jié)的棧空間。此外給出
43、錯誤時BL返回的錯誤代碼及其含義:返回錯誤代碼含義80h沒有提供的功能81h檢測到虛擬盤(Vdisk)82h發(fā)生A20地址線錯誤8Eh一般驅(qū)動程序錯誤8Fh致命的驅(qū)動程序錯誤90h高端內(nèi)存(HMA)不存在91h高端內(nèi)存(HMA)已被使用92hDX is less than the /HMAMIN= parameter93h高端內(nèi)存(HMA)未被分配94hA20地址線已被激活A(yù)0h所有擴充內(nèi)存已被分配A1h所有可用的句柄已被分配A2h無效的句柄A3h無效的源句柄A4h無效的源偏移A5h無效的目的句柄A6h無效的目的偏移A7h無效的長度A8h移動有非法的重疊A9h發(fā)生奇偶校驗錯誤AAh塊未加鎖AB
44、h塊已被鎖定ACh塊鎖定計數(shù)溢出ADh鎖定失敗B0h只有更小一些的UMB空間B1h沒有可用的UMB空間EMS功能調(diào)用索引EMS功能調(diào)用索引:功能號功能功能40H功能41H功能42H功能43H功能44H功能45H功能46H功能47H功能48H功能4BH功能4CH功能4DH取得EMS程序狀態(tài)取得物理映射頁面的段地址獲取邏輯頁頁數(shù)信息分配句柄和內(nèi)存內(nèi)存映射釋放句柄和內(nèi)存獲取EMM的版本號保存指定句柄映射關(guān)系恢復(fù)指定句柄映射關(guān)系獲取EMM的句柄數(shù)獲取指定句柄所分配的邏輯頁頁數(shù)獲取所有句柄分配情況1. 測試EMS管理程序測試EMS管理程序, 找到返回1, 否則返回0,以下給出具體函數(shù):char test
45、_ems() int i; union REGS inregs,outregs; struct SREGS segs; struct DeviceHeader struct DeviceHeader far *link;unsigned attributes;unsigned strategy_offset;unsigned interrupt_offset;char name_of_number_of_units8; far *dev; unsigned char major,minor,c13; inregs.x.ax=0 x3001;/dos中斷功能30子功能01讀取當(dāng)前擴充內(nèi)存是否有效
46、 intdos(&inregs,&outregs);/DOS中斷 major=outregs.h.al;/返回擴充內(nèi)存狀態(tài) minor=outregs.h.ah; if (majorattributes & 0 x8000) for (i=0;iname_of_number_of_unitsi; /取設(shè)備名稱 if (!strcmp(c,EMMXXXX0) /將設(shè)備名稱與擴充內(nèi)存名字比較 EMS=1;/擴充內(nèi)存存在 return(1); dev=dev-link; /指向下一個設(shè)備 return(0); 2. 取得管理程序狀態(tài)在確認EMS存在時,使用中斷67H功能40H(AH)可以取得管理程序
47、狀態(tài),AH返回00H表示成功、否則返回錯誤代碼。以下給出具體函數(shù):char get_EMS_status() char tmp=0 xff; if (EMS) asm mov ah,0 x40/功能號40h int 0 x67/調(diào)用中斷67h mov tmp,ah/返回值 return(tmp); 3. 取得物理映射頁面的段地址使用中斷67H功能41H(AH)可以取得物理映射頁面的段地址,AH返回00H表示成功、否則返回錯誤代碼,BX返回物理映射頁面的段地址。使用此功能可確定EMS在1Mb常規(guī)內(nèi)存中的映射位置,此物理映射頁面的大小為64K, 分為0-3頁, 每頁為16K,因為EMS邏輯頁的大小
48、為16K, 也就是說我們最多可同時將4 個EMS邏輯頁映射到物理頁上。以下給出具體函數(shù):char get_page_frame_segment(unsigned *segment) char tmp=0 xff; if (EMS) asm mov ah,0 x41 int 0 x67 mov tmp,ah*segment=_BX;/取得段地址 return(tmp); 4. 獲取邏輯頁頁數(shù)信息使用中斷67H功能42H(AH)可以獲取邏輯頁頁數(shù)信息,AH返回00H表示成功、否則返回錯誤代碼,BX返回未分配的頁數(shù),DX返回頁的總數(shù)。以下給出具體函數(shù):char get_number_of_pages
49、(unsigned *avail,unsigned *total) char tmp=0 xff; if (EMS) asm mov ah,0 x42 int 0 x67 mov tmp,ah *avail=_BX;/返回可用頁數(shù)*total=_DX;/返回所有頁數(shù) return(tmp); 5. 分配句柄和內(nèi)存使用中斷67H功能43H(AH)可以分配句柄和內(nèi)存,BX給入要求分配的邏輯頁的頁數(shù)(邏輯頁每頁的大小為16K),AH返回00H表示成功、否則返回錯誤代碼,DX返回句柄。當(dāng)程序退出運行時, 句柄將被非顯式的關(guān)閉并無法回收。以下給出具體函數(shù):char allocate_memory(uns
50、igned *handle,unsigned page_numbers) char tmp=0 xff; if (EMS) asm mov ah,0 x43 mov bx,page_numbers int 0 x67 mov tmp,ah*handle=_DX;/返回句柄 return(tmp); 6. 內(nèi)存映射使用中斷67H功能44H(AH)可以進行內(nèi)存映射,AL給入物理頁頁號 (0-3),BX給入要求分配的邏輯頁的頁數(shù)(邏輯頁每頁的大小為16K),DX給入句柄,AH返回00H表示成功、否則返回錯誤代碼。以下給出具體函數(shù):char map_memory(char physical_page,
51、unsigned logical_page,unsigned handle) char tmp=0 xff; if (EMS) asm mov ah,0 x44 mov al,physical_page /物理頁數(shù) mov bx,logical_page /邏輯頁數(shù) mov dx,handle int 0 x67 mov tmp,ah return(tmp); 7. 釋放句柄和內(nèi)存使用中斷67H功能45H(AH)可以釋放句柄和內(nèi)存,DX給入EMM句柄,AH返回00H表示成功、否則返回錯誤代碼。句柄必須被顯示的釋放, 否則分配的內(nèi)存無法被其后的程序使用。如果不成功, 應(yīng)重試這一操作。以下給出具體
52、函數(shù):char release_memory(unsigned handle) char tmp=0 xff; if (EMS) asm mov ah,0 x45 mov dx,handle int 0 x67 mov tmp,ah return(tmp); 8. 獲取EMM的版本號使用中斷67H功能46H(AH)可以獲取EMM的版本號,AH返回00H表示成功、否則返回錯誤代碼,AL返回EMM的版本號,高四位為主版本號(BCD碼),低四位為副版本號(BCD碼)。句柄必須被顯示的釋放, 否則分配的內(nèi)存無法被其后的程序使用。如果不成功, 應(yīng)重試這一操作。以下給出具體函數(shù):char get_EMM_
53、version(unsigned char *version) char tmp=0 xff; if (EMS) asm mov ah,0 x46 int 0 x67 mov tmp,ah*version=_AL; return(tmp); 9. 保存指定句柄映射關(guān)系使用中斷67H功能47H(AH)可以保存指定句柄映射關(guān)系,DX給入句柄,AH返回00H表示成功、否則返回錯誤代碼。一些TSR, ISR或設(shè)備驅(qū)動程序要使用EMS, 必須在操作前保存映射關(guān)系并在完成后恢復(fù)。以下給出具體函數(shù):char save_mapping_context(unsigned handle) char tmp=0 x
54、ff; if (EMS) asm mov ah,0 x47 mov dx,handle int 0 x67 mov tmp,ah return(tmp); 10. 恢復(fù)指定句柄映射關(guān)系使用中斷67H功能48H(AH)可以恢復(fù)指定句柄映射關(guān)系,DX給入句柄,AH返回00H表示成功、否則返回錯誤代碼。一些TSR, ISR或設(shè)備驅(qū)動程序要使用EMS, 必須在操作前保存映射關(guān)系并在完成后恢復(fù)。一些TSR, ISR或設(shè)備驅(qū)動程序要使用EMS, 必須在操作前保存映射關(guān)系并在完成后恢復(fù)。以下給出具體函數(shù):char restore_mapping_context(unsigned handle) char t
55、mp=0 xff; if (EMS) asm mov ah,0 x48 mov dx,handle int 0 x67 mov tmp,ah return(tmp);獲取EMM的句柄數(shù)使用中斷67H功能4BH(AH)可以獲取EMM的句柄數(shù),AH返回00H表示成功、否則返回錯誤代碼,BX返回EMM的句柄數(shù)(0-255)。要確定可用的句柄數(shù), 用255減去BX的值即可。以下給出具體函數(shù):char get_number_of_EMM_handles(unsigned *handle_numbers) char tmp=0 xff; if (EMS) asm mov ah,0 x4b int 0 x6
56、7 mov tmp,ah*handle_numbers=_BX;/返回句柄數(shù) return(tmp);獲取指定句柄所分配的邏輯頁頁數(shù)使用中斷67H功能4CH(AH)可以獲取指定句柄所分配的邏輯頁頁數(shù),DX給入句柄,AH返回00H表示成功、否則返回錯誤代碼,BX返回邏輯頁頁數(shù) (1-512)。 一個句柄最多可分配512個邏輯頁。以下給出具體函數(shù):char get_pages_owned_by_handle(unsigned handle,unsigned *page_numbers) char tmp=0 xff; if (EMS) asm mov ah,0 x4c mov dx,handle
57、int 0 x67 mov tmp,ah*page_numbers=_BX;/返回頁數(shù) return(tmp);獲取所有句柄分配情況使用中斷67H功能4DH(AH)可以獲取所有句柄分配情況,ES:DI用于接收信息的數(shù)組,記錄結(jié)構(gòu)如下表,AH返回00H表示成功、否則返回錯誤代碼,BX返回活動的EMM句柄數(shù)。緩沖區(qū)的容量至少應(yīng)為4*BX個字節(jié),當(dāng)ES:DI所指的緩沖區(qū)有段跨越時會導(dǎo)致錯誤。以下給出具體函數(shù):記錄結(jié)構(gòu)偏移大小內(nèi)容00字EMS句柄號02字分配的邏輯頁頁數(shù)char get_pages_for_all_handles(unsigned char *buffer,unsigned *hand
58、le_numbers) char tmp=0 xff; if (EMS) unsigned bseg=FP_SEG(buffer),boff=FP_OFF(buffer);asm mov ah,0 x4d mov di,boff mov es,bseg int 0 x67 mov tmp,ah*handle_numbers=_BX;/返回句柄數(shù) return(tmp);以下給出返回的錯誤代碼極其含義:返回錯誤代碼含義00h成功80h內(nèi)部錯誤81h硬件故障82h擴展內(nèi)存管理程序忙83h未分配或無效的句柄84h未定義的功能85h沒有可用的句柄86h保存或恢復(fù)映射關(guān)系時出錯87h要求分配的頁數(shù)超過系統(tǒng)總量88h要求分配的頁數(shù)超過當(dāng)前可用量89h0頁要求錯誤8Ah無效的邏輯頁頁號8Bh非法的物理頁頁號8Ch映射關(guān)系描述棧溢出8Dh映射關(guān)系保存失敗, 句柄已有關(guān)系描述棧8Eh映射關(guān)系恢復(fù)失敗, 句柄沒有關(guān)系描述棧8Fh無效的子功能90h未定義的屬性類型91h不支持的特性92h成功, 部分源區(qū)域(region)已被改寫93h源或目的區(qū)域的長度超過任
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)與算法的C++應(yīng)用試題及答案
- 計算機二級Delphi復(fù)習(xí)經(jīng)典實例分析試題及答案
- 掌握Delphi編程的調(diào)優(yōu)技巧試題及答案
- 計算機二級MySQL重要功能試題及答案
- 計算機二級Python考試動機與目標(biāo)設(shè)定試題及答案
- 巧解計算機基礎(chǔ)知識試題及答案
- 2025年計算機輔助設(shè)計繪圖員職業(yè)資格鑒定試題
- 軟件設(shè)計中的迭代與增量開發(fā)策略試題及答案
- 財務(wù)成本管理實戰(zhàn)試題及答案解析
- 軟件設(shè)計師考試項目管理流程試題及答案
- 《中小學(xué)生端午節(jié)安全教育主題班會》課件
- 高級網(wǎng)絡(luò)技術(shù)試題及答案
- 股權(quán)終止合作協(xié)議書
- 入團考試試題及答案大學(xué)
- 2025園林景觀設(shè)計合同范本
- 2025年北京高考語文三輪復(fù)習(xí)之微寫作
- 《海南三亞西島景區(qū)營銷現(xiàn)狀問卷調(diào)查及營銷問題和優(yōu)化對策》12000字
- 江蘇省蘇、錫、常、鎮(zhèn)2025屆高考仿真模擬生物試卷含解析
- 阿片類藥物不良反應(yīng)和處置
- 貴港離婚協(xié)議書模板
- 2025年公安機關(guān)人民警察基本級執(zhí)法資格備考題庫
評論
0/150
提交評論