微機(jī)原理與應(yīng)用實(shí)驗(yàn)手冊(cè)lzw_第1頁(yè)
微機(jī)原理與應(yīng)用實(shí)驗(yàn)手冊(cè)lzw_第2頁(yè)
微機(jī)原理與應(yīng)用實(shí)驗(yàn)手冊(cè)lzw_第3頁(yè)
微機(jī)原理與應(yīng)用實(shí)驗(yàn)手冊(cè)lzw_第4頁(yè)
微機(jī)原理與應(yīng)用實(shí)驗(yàn)手冊(cè)lzw_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、微機(jī)原理與應(yīng)用實(shí)驗(yàn)李章維 李敏 沈永增浙江工業(yè)大學(xué)信息工程學(xué)院2012年4月目 錄實(shí)驗(yàn)一 熟悉匯編程序及調(diào)試21.1 匯編與宏匯編程序21.2 匯編過(guò)程31.2.1 程序匯編的基本步驟31.2.2 列表文件(.lst)41.2.3 交叉索引文件(.crf)61.3 執(zhí)行連接程序71.3.1 連接程序執(zhí)行過(guò)程71.3.2 內(nèi)存映象文件(.map)81.3.3 執(zhí)行程序81.4 編寫匯編語(yǔ)言源程序91.4.1 源程序的書寫格式91.4.2 段寄存器段地址的裝入101.4.3 程序中的數(shù)據(jù)與變量111.4.4 返回dos狀態(tài)的方法121.5 調(diào)試軟件debug131.6 匯編指令調(diào)試15實(shí)驗(yàn)二 加法

2、及判斷程序調(diào)試實(shí)驗(yàn)18實(shí)驗(yàn)三 dos中斷調(diào)用實(shí)驗(yàn)22實(shí)驗(yàn)四 微機(jī)接口實(shí)驗(yàn)244.1 實(shí)驗(yàn)設(shè)備簡(jiǎn)介244.2 8253可編程定時(shí)器計(jì)數(shù)器實(shí)驗(yàn)264.3 8259中斷控制實(shí)驗(yàn)304.4 8255 并行接口實(shí)驗(yàn)32附錄i ascii 碼字符表35附錄ii 實(shí)驗(yàn)4.2參考程序36附錄iii 實(shí)驗(yàn)4.3參考程序44附錄iv 實(shí)驗(yàn)4.4參考程序51實(shí)驗(yàn)一 熟悉匯編程序及調(diào)試1.1 匯編與宏匯編程序匯編就是把用匯編語(yǔ)言編寫的源程序翻譯(匯編)成機(jī)器語(yǔ)言的目標(biāo)程序。匯編一個(gè)用匯編語(yǔ)言編寫的源程序可以使用小匯編程序asm.exe,也可以使用宏匯編程序masm.exe。由于masm.exe不但可以代替asm,而且

3、可以匯編具有宏定義的匯編語(yǔ)言源程序,因此我們?cè)趨R編程序時(shí)使用宏匯編程序masm.exe。運(yùn)行匯編程序應(yīng)具備下列文件:文本編輯程序:edit.com 或 notepad.exe宏匯編程序: masm.exe連接程序: link.exe用戶通過(guò)文本編輯程序鍵入?yún)R編語(yǔ)言源程序,檢查無(wú)誤后,要將源程序以ascii文本(純文本)存盤,文件的擴(kuò)展名為 .asm 。下面就是用文本編輯程序edit.com或notepad.exe編輯的匯編語(yǔ)言源程序,該程序?yàn)樵谄聊簧巷@示一串英文字符hello!。data segmentstr db hello!,$data endsstacksegment stackdb 6

4、4 dup (?)stack endscode segmentassume cs: code, ds: datastart: mov ax, datamov ds, axmov ah, 9hmov dx, offset strint 21hmov ah,4chint 21hcode endsend start然后將上面鍵入的匯編語(yǔ)言源程序保存為擴(kuò)展名為 .asm的文件,例如 xyz.asm 文件。1.2 匯編過(guò)程1.2.1 程序匯編的基本步驟1、將masm.exe、link.exe程序拷貝到e盤的根目錄下2、進(jìn)入dos系統(tǒng):?jiǎn)螕糇烂嫔系摹伴_(kāi)始”運(yùn)行command(cmd),dos系統(tǒng)下的屏幕提

5、示符為:盤號(hào):目錄名3、進(jìn)入e盤: e: ,此時(shí)的屏幕提示符為“e:”,4、建立源程序:用記事本輸入源程序,并保存到e盤根目錄,xyz.asm5、編譯程序:源程序建立以后,就可以用匯編程序masm.exe 進(jìn)行匯編。例如欲對(duì)保存在e 盤根目錄下的源程序文件xyz.asm 進(jìn)行匯編,在屏幕提示符e:下,可打入如下命令(帶下劃線的部分為鍵盤輸入): masm xyz.asm 將匯編語(yǔ)言源程序用宏匯編程序翻譯(匯編)后,可以形成三個(gè)文件:第一個(gè)文件是擴(kuò)展名為.obj的目標(biāo)文件,在該文件中,將源程序的操作碼部分變?yōu)闄C(jī)器碼,但地址操作數(shù)是可浮動(dòng)的相對(duì)地址,而不是實(shí)際地址,因此需經(jīng)link連接文件進(jìn)行連接

6、才能形成可執(zhí)行文件。第二個(gè)文件是列表文件,擴(kuò)展名為.lst,它把源程序和目標(biāo)程序列表,以供檢查程序用。第三個(gè)文件是交叉索引文件,擴(kuò)展名為.crf,它是一個(gè)對(duì)源程序所用的各種符號(hào)進(jìn)行前后對(duì)照的文件。目標(biāo)文件(obj文件)是必須產(chǎn)生的,而其它兩個(gè)文件在需要時(shí)給予命令就可產(chǎn)生,對(duì)連接和執(zhí)行匯編程序無(wú)直接的關(guān)系。下面舉例說(shuō)明匯編過(guò)程。在dos狀態(tài)下,鍵入masm,則調(diào)入宏匯編程序,屏幕顯示與操作如下:e: masmmicrosoft (r) macro assemble version 5. 00copyright (c) microsoft corp 19811985, 1987.allrights

7、 reserved.source filename . asm : xyzobject filename xyz . obj: xyzsource listing nul. lst: xyzcross-reference nul. crf: xyz48826 + 433414 bytes symbol space free0 warning errors0 severe errors其中劃線部分是用戶鍵入的,xyz為源程序名(xyz.asm),方括號(hào)中是機(jī)器規(guī)定的默認(rèn)文件名,如果用戶認(rèn)為方括號(hào)內(nèi)的文件名就是要鍵入的文件名,則可只在劃線部分鍵入回車。如果不想要列表文件和交叉索引文件,則可在nul

8、.lst和nul.crf后不鍵入文件名只鍵入回車符。當(dāng)回答完上述四個(gè)詢問(wèn)后,匯編程序就對(duì)源程序進(jìn)行匯編。在匯編過(guò)程中,如果發(fā)現(xiàn)源序程中有語(yǔ)法錯(cuò)誤,則提示出錯(cuò)信息,指出是什么性質(zhì)的錯(cuò)誤,錯(cuò)誤類型,最后列出錯(cuò)誤的總數(shù)。之后可重新進(jìn)入文本編輯環(huán)境(edit.com或notepad.exe),調(diào)入源程序xyz.asm進(jìn)行修改,修改完畢,再進(jìn)行匯編,直到匯編通過(guò)為止。如果在匯編時(shí)不需要產(chǎn)生列表文件(.lst)和交叉索引文件(.crf),調(diào)用匯編程序時(shí)可用分號(hào)結(jié)束。例如: ;e: masm xyz; microsoft (r) macro assembler version 5. 00copyright

9、(c) microsoft corp 1981-1985, 1987. all rights reserved.49902+448722 bytes symbol space free0 warning errors0 severe errors匯編后只產(chǎn)生一個(gè).obj文件。如果需要產(chǎn)生.obj文件和.lst文件,不需要.crf文件,則在分號(hào)前加兩個(gè)逗號(hào)即可。例如:e: masm xyz,; 如果4個(gè)文件都需要,簡(jiǎn)便的操作方法是分號(hào)前用3個(gè)逗號(hào):e: masm xyz,; microsoft (r) macro assembler version 5. 00copyright (c) micr

10、osoft corp 1981-1985, 1987. all rights reserved.48830+433410 bytes symbol space free0 warning errors0 severe errors1.2.2 列表文件(.lst)列表文件.lst是通過(guò)匯編程序(masm.exe)產(chǎn)生的,可用文本編輯程序(edit.com或notepad.exe)顯示或打印該文件,以便分析調(diào)試源程序。例如xyz.lst文件的內(nèi)容顯示如下:microsoft (r) macro assembler version 5.00 3/3/3page 1-11 0000 data segm

11、ent2 0000 48 65 6c 6c 6f 21 24 str db hello!,$3 0007 data ends45 0000 stack segment stack6 0000 0040 db 64 dup(?)7 ?8 910 0040 stack ends1112 0000 code segment13 assume cs:code, ds:data14 0000 b8 - r start: mov ax, data15 0003 8e d8 mov ds, ax16 0005 b4 09 mov ah, 9h17 0007 ba 0000 r mov dx, offset

12、str18 000a cd 21 int 21h19 000c b4 4c mov ah, 4ch20 000e cd 21 int 21h21 0010code ends22 end startmicrosoft (r) macro assembler version 5.00 3/3/3symbols-1segments and groups:n a m e length align combine classcode . . . . . . . . . . . . . . 0010 para nonedata . . . . . . . . . . . . . . 0007 para n

13、onestack . . . . . . . . . . . . .0040 para stacksymbols:n a m e type value attrstart . . . . . . . . . . . . . l near 0000 codestr . . . . . . . . . . . . . . l byte 0000 datafilename . . . . . . . . . . . text xyz19 source lines19 total lines7 symbols48830 + 433410 bytes symbol space free0 warning

14、 errors0 severe errors列表程序由三部分組成:(1) 源程序和目標(biāo)程序清單從列表程序中可以看到:它同時(shí)列出源程序和對(duì)應(yīng)的機(jī)器語(yǔ)言清單,第一列給出每條指令所在行號(hào),第二列給出從段的首地址開(kāi)始的每條指令存放的偏移地址,接著是數(shù)字列,給出對(duì)應(yīng)每條語(yǔ)句的機(jī)器碼和對(duì)應(yīng)于存放在棧段和數(shù)據(jù)段的值,在機(jī)器碼后加上r的指令表示:這條指令在連接時(shí)可能產(chǎn)生與列出來(lái)的偏移地址不同的地址,因?yàn)檫@些偏移地址可能與其它模塊有關(guān),例如列表清單中代碼段中有兩條指令與數(shù)據(jù)段有關(guān): mov ax,data 和 mov dx,offset str,因此在這兩條指令的機(jī)器碼后面加上r的標(biāo)識(shí)。最右邊就是用匯編語(yǔ)言編寫

15、的源程序。(2) 段信息匯總表在段信息匯總表中列出該程序用了哪幾個(gè)段,如:代碼段code、數(shù)據(jù)段data和堆棧stack;每個(gè)段所占存儲(chǔ)空間的長(zhǎng)度(字節(jié)數(shù));每個(gè)段的定位類型,包括page(頁(yè))、para(節(jié))、word(字)和byte(字節(jié))它們表示此段的起始邊界要求,即起始邊界地址應(yīng)分別可以被256、16、2和1除盡。該列表清單中是以para為code段、data段和start段的起始邊界地址。最后一列為段的組合類型;段的組合類型是告訴連接程序,本段與其它段的關(guān)系,組合類型有none、public、commom、at表達(dá)式、stack和memory。none:表示本段與其它段不發(fā)生邏輯關(guān)系

16、,即每段都有自己的基本地址。是隱含組合類型。本例中代碼段(code)數(shù)據(jù)段(data)的組合類型以就為none,說(shuō)明這兩個(gè)段不與其它段發(fā)生任何關(guān)系。stack:表明連接程序首先要把本段與同名同類別的其它段相鄰地連接在一起,然后為所有定義為棧段的連接在一起的段,定義一個(gè)共同的段基地址,即連接成一個(gè)物理段。在列表程序的源程序中只有一個(gè)棧段,在棧段定義中給出了組合類型為stack,因此在段信息匯總表中列出了該項(xiàng),在本程序中它沒(méi)有任何意義,因?yàn)闆](méi)有其它棧段與它連接,只是為了說(shuō)明這個(gè)問(wèn)題而設(shè)置的。(3) 符號(hào)匯總表在列表程序中最后部分列出了符號(hào)匯總情況,是指在源程序中用戶定義的符號(hào)名、類型、值和所在段。

17、在xyz.asm中有兩個(gè)符號(hào)是由用戶定義的,其中str是在數(shù)據(jù)段定義的,其值是指為str這個(gè)符號(hào)定義的偏移地址。另一個(gè)符號(hào)是標(biāo)號(hào)stack,是在代碼段定義的,stack的偏移地址和str偏移地址都是0000h,只是兩個(gè)符號(hào)所在段不同。在上述列表文件中,指出了源程序無(wú)語(yǔ)法錯(cuò)誤,如果在源程序中存在某些語(yǔ)法錯(cuò)誤時(shí),列表文件可提示某條語(yǔ)句有哪些錯(cuò)誤,出錯(cuò)提示最示在出錯(cuò)指令行的下面,因此用戶可借助列表文件很快地找到錯(cuò)誤行,以便調(diào)試。另外由于列表文件給出了各條指令的偏移地址,對(duì)調(diào)試程序時(shí)設(shè)置斷點(diǎn)很方便。1.2.3 交叉索引文件(.crf)匯編后產(chǎn)生的交叉索引文件,擴(kuò)展名為.crf,它列出了源程序中定義的符

18、號(hào)(包括:標(biāo)號(hào)、變量等)和程序中引用這些符號(hào)的情況。如果要查看這個(gè)符號(hào)表,必須使用cref.exe文件,它根據(jù).crf文件建立一個(gè)擴(kuò)展名為.ref的文件,而后再用文本編輯程序(edit.com或notepad.exe)顯示,就可以看到這個(gè)符號(hào)使用情況表。具體操作方法如下:e: crefcref filename.crf: xyzlist filenamexyz.ref:就建立了一個(gè)擴(kuò)展名為.ref的文件xyz.ref,文件xyz.ref中的內(nèi)容如下:microsoft cross-reference version 5.00 mon mar 02 13:41:17 2003symbol cro

19、ss-reference (# definition, + modification) cref-1code . . . . . . . . . . . . . . 12# 13 21data . . . . . . . . . . . . . . 1# 3 13 14stack. . . . . . . . . . . . . .5# 10start. . . . . . . . . . . . . .14# 22str. . . . . . . . . . . . . . . 2# 175 symbols1.3 執(zhí)行連接程序用匯編語(yǔ)言編寫的源程序經(jīng)過(guò)匯編程序(masm)匯編后產(chǎn)生了目標(biāo)程序

20、(.obj),該文件是將源程序操作碼部分變成了機(jī)器碼,但地址是可浮動(dòng)的相對(duì)地址(邏輯地址),因此必須經(jīng)過(guò)連接程序link連接后才能運(yùn)行。連接程序link是把一個(gè)或多個(gè)獨(dú)立的目標(biāo)程序模塊裝配成一個(gè)可重定位的可執(zhí)行文件,擴(kuò)展名為.exe文件。此外還可以產(chǎn)生一個(gè)內(nèi)存映象文件,擴(kuò)展名為.map。1.3.1 連接程序執(zhí)行過(guò)程在dos狀態(tài)下,鍵入link(或link xyz)則系統(tǒng)調(diào)入link程序,屏幕顯示操作如下:e: linkibm personal computer linkerversion 2. 00 (c) copyright ibm corp 1981, 1982, 1983object m

21、odules . obj: xyzrun file xyz. exe: xyzlist filenul. map: xyzlibraries . lib:其中下劃線表示這部分是戶鍵入的,xyz為源程序名,方括號(hào)內(nèi)為機(jī)器默認(rèn)文件名,當(dāng)用戶認(rèn)為方括號(hào)中的文件名就是要鍵入的文件名時(shí),可在冒號(hào)后面只鍵入回車。其中map文件是否需要建立,由用戶決定,需要?jiǎng)t鍵入文件名,不需要?jiǎng)t直接送入一個(gè)回車鍵。最后一個(gè)詢問(wèn)是問(wèn)是否在連接時(shí)用到庫(kù)文件,對(duì)于連接匯編語(yǔ)言源程序的目標(biāo)文件,通常是不需要的,因此直接鍵入回車鍵。與匯編程序一樣,可以在連接時(shí)用分號(hào)結(jié)束后續(xù)詢問(wèn)。例如:e: link xyz;ibm personal

22、 computer linkerversion 2.00 (c) copyright ibm corp 1981, 1982, 1983連接后只產(chǎn)生xyz.exe文件。如果除xyz.exe文件外還要產(chǎn)生xyz.map文件,則在分號(hào)前加兩個(gè)逗號(hào)。例如:e: link xyz,; ibm personal computer linkerversion 2.00 (c) copyright ibm corp 1981, 1982, 19831.3.2 內(nèi)存映象文件(.map)由連接程序link產(chǎn)生的擴(kuò)展名為.map文件,它實(shí)際上是連接程序的列表文件,它給出了每個(gè)段的地址分配情況及長(zhǎng)度。例如xyz.m

23、ap的內(nèi)容如下所示:start stop length name class00000h 00006h 00007h data00010h 0004fh 00040h stack00050h 0005fh 00010h codeprogram entry point at 0005:0000從表中可以看到,源程序ex2中定義了三個(gè)段:數(shù)據(jù)段(data)起始地址為00000h,終止地址為00006h,長(zhǎng)度為00007h個(gè)字節(jié);堆棧段(stack)起始地址000loh,終止地址為0004fh,長(zhǎng)度為0040h個(gè)字節(jié),代碼段(code),起始地址為0005ohh,終止地址00o5fh,長(zhǎng)度為00lo

24、h個(gè)字節(jié)。1.3.3 執(zhí)行程序當(dāng)用連接程序link將目標(biāo)程序(.obj)連接定位后,產(chǎn)生可執(zhí)行文件(.exe),可以在dos狀態(tài)下執(zhí)行該程序。執(zhí)行操作如下:e: xyzhello !也可以鍵入xyz.exee: xyz.exehello !在執(zhí)行程序后可以看到執(zhí)行結(jié)果,因?yàn)樵闯绦蛑杏酗@示結(jié)果的指令,如果程序中沒(méi)有顯示結(jié)果的指令,要想看到結(jié)果,只有通過(guò)debug調(diào)試程序來(lái)達(dá)到目的。如果執(zhí)行結(jié)果沒(méi)有達(dá)到預(yù)先設(shè)計(jì)目的,也是通過(guò)debug來(lái)進(jìn)行調(diào)試、運(yùn)行。因此debug是匯編語(yǔ)言編程的最有利的調(diào)試工具。1.4 編寫匯編語(yǔ)言源程序用匯編語(yǔ)言編寫的源程序必須符合一定的格式,才能經(jīng)過(guò)宏匯編程序masm的匯編

25、,生成一個(gè)目標(biāo)程序。為了完成匯編任務(wù),匯編程序一般采用兩遍掃描的方法,第一遍掃描源程序產(chǎn)生符號(hào)表、處理偽指令等,第二遍掃描產(chǎn)生機(jī)器指令代碼、確定數(shù)據(jù)等。1.4.1 源程序的書寫格式當(dāng)cpu訪問(wèn)內(nèi)存時(shí),是把存儲(chǔ)器分成若干個(gè)段,通過(guò)4個(gè)段寄存器中存放的地址對(duì)內(nèi)存儲(chǔ)器進(jìn)行訪問(wèn)的,因此在編源程序時(shí)必須按段的結(jié)構(gòu)來(lái)編制程序。由于每個(gè)段的物理空間為64kb,所以程序中各段可以分別為一個(gè)或幾個(gè)。源程序的書寫一般有如下形式: 堆棧段名 segment stack邏輯堆棧段 用變量定義預(yù)置的堆??臻g 堆棧段名 ends數(shù)據(jù)段名 segment邏輯數(shù)據(jù)段 用變量定義預(yù)置的數(shù)據(jù)空間數(shù)據(jù)段名 ends代碼段名 seg

26、ment assume 定義各段尋址關(guān)系起始標(biāo)號(hào) proc程序邏輯代碼段代碼段名 ends end 起始標(biāo)號(hào)其中:segment、assume、procendp是偽指令。偽指令只是把源程序中各段的設(shè)置情況告訴匯編程序,在匯編時(shí)不產(chǎn)生目標(biāo)代碼。在源程序中最少要有一個(gè)代碼段,數(shù)據(jù)段根據(jù)需要可有可無(wú),也可以增設(shè)附加段。對(duì)于堆棧段也可以根據(jù)需要可有可無(wú),但如果沒(méi)有堆棧段,在連接(link)時(shí)計(jì)算機(jī)將顯示下列警告性的錯(cuò)誤:warning l4021:no stack segment在程序中如果沒(méi)有用到堆棧時(shí),該錯(cuò)誤提示不影響程序的運(yùn)行,如果程序中用到堆棧時(shí)必須設(shè)置堆棧段。1.4.2 段寄存器段地址的裝入

27、assume偽指令語(yǔ)句只是建立了當(dāng)前段與段寄存器的聯(lián)系,但不能把各段的段地址裝入相應(yīng)的段寄存器中,段寄存器段地址的裝入是在程序中完成的。(1)ds、es、ss的裝入由于段寄存器不能用立即數(shù)尋址方式直接傳送,所以段地址裝入可通過(guò)通用寄存器傳送給段寄存器。mov ax,邏輯段名mov 段寄存器,ax其中邏輯段名為程序中定義各邏輯段的名字,(不包括代碼段),段寄存器是指與各邏輯段相對(duì)應(yīng)的各段寄存器(ds、es、ss)。(2)cs的裝入代碼段寄存器是裝當(dāng)前執(zhí)行目標(biāo)代碼的段地址,ip是提供下一條要執(zhí)行的目標(biāo)代碼的偏移量,為了保證程序的正確執(zhí)行,cs和ip裝入新值時(shí)是一起完成的。對(duì)cs和ip的裝入有如下幾

28、種情況:(1) 根據(jù)用戶程序中的偽指令end后的標(biāo)號(hào)為cs和ip提供代碼段的段地址和目標(biāo)代碼的偏移地址。例如:code segmentassume cs : code,start : code endsend start例中的起始地址是標(biāo)號(hào)start, start是在程序裝入內(nèi)存后開(kāi)始執(zhí)行的起始點(diǎn)。源程序最后一個(gè)end是偽指令操作符,它的作用有兩個(gè): 其一為標(biāo)志源程序的結(jié)束,其二為指定程序運(yùn)行時(shí)的起始地址。也就是在源程序匯編和連接后的可執(zhí)行程序自動(dòng)將cs和ip在執(zhí)行時(shí)指start標(biāo)號(hào)處。(2) 在程序運(yùn)行過(guò)程中,當(dāng)執(zhí)行某些指令和操作時(shí),cpu自動(dòng)修改cs和ip的值,使它們指向新的代碼段。例如:

29、執(zhí)行段間過(guò)程調(diào)用call指令和返回指令ret。執(zhí)行段間的無(wú)條件轉(zhuǎn)移指令jmp far。當(dāng)使用int nh或產(chǎn)生硬件中斷時(shí),將利用n4形成物理地址,其中低字裝入ip,高字裝入cs。在中斷返回時(shí)由iret恢復(fù)斷點(diǎn)處的cs和ip的值。硬件復(fù)位時(shí),自動(dòng)將ip置0,cs置為0ffffh,指向rom中的初始化程序。1.4.3 程序中的數(shù)據(jù)與變量在匯編源程序中的數(shù)據(jù)除了立即數(shù),由指令產(chǎn)生的數(shù)和通過(guò)鍵盤輸入的數(shù)以外,還有大量的數(shù)據(jù)是通過(guò)偽指令語(yǔ)句進(jìn)行預(yù)置和分配的,也就是將所需的數(shù)據(jù)以某種形式存放在某邏輯段中(除代碼段),在程序中可任意調(diào)用。在數(shù)據(jù)定義的同時(shí)還可以定義變量,將變量與數(shù)據(jù)結(jié)合在一起??梢詾槟硞€(gè)變量

30、分配存儲(chǔ)空間以便在程序執(zhí)行過(guò)程中存放中間結(jié)果和最終結(jié)果,使用起來(lái)極為方便。(1)變量與數(shù)據(jù)的定義變量與數(shù)據(jù)的定義可以通過(guò)符號(hào)定義偽指令equ、=和數(shù)據(jù)定義偽指令db或dw或d來(lái)實(shí)現(xiàn)。例如:xx equ l00 ;為xx變量定義一個(gè)常數(shù)100;yy equ bp十8 ;定義一個(gè)變址尋址單元;zz equ cx ;定義zz為cx寄存器的替換名字;emp = 100 ;為變量emp定義一個(gè)常數(shù)100;a db 200 ;定義a為一字節(jié)變量,初值為100;b db abc;b值為41h,b十l值為42h、b+2值為43h;c db 3dup(0) ;定義3個(gè)0,每個(gè)0占一個(gè)字節(jié),起始地址c;d dw

31、l00dup(?);定義100個(gè)字的存儲(chǔ)空間,起始地址為d;e dd ? ;定義一個(gè)雙字的變量e。其中=除了可以重新賦值以外,其它功能同equ。而equ定義的變量則不能再重新定義。例如:const = 60 ;與 const equ 60 等價(jià),接著還可以對(duì)const再賦值;const = 8 ;對(duì)const重新賦值。如果在const=8之前是用equ對(duì)const賦值,就不能再賦值。equ和=可以出現(xiàn)在程序的邏輯段內(nèi),也可出現(xiàn)在邏輯段外。(2)匯編程序中數(shù)據(jù)的提供方法用數(shù)據(jù)定義偽指令提供數(shù)據(jù)如果程序要求原始數(shù)據(jù)為一批數(shù)據(jù)時(shí),用數(shù)據(jù)定義偽指令db、dw和dd來(lái)提供較為方便。用立即數(shù)的形式提供數(shù)據(jù)

32、當(dāng)原始數(shù)據(jù)只有幾個(gè)時(shí),一般用立即數(shù)的方法來(lái)提供,例如:mov ax,l00當(dāng)然用立即數(shù)的方法只是將一個(gè)數(shù)據(jù)傳送到通用寄存器中,它只是通過(guò)通用寄存器傳送數(shù)據(jù)。用編程序的方法提供數(shù)據(jù)假如原始數(shù)據(jù)是一組有規(guī)律的數(shù)據(jù)項(xiàng),則用編程序的方法形成這一組數(shù)據(jù),不用專門為這組數(shù)據(jù)分配存儲(chǔ)單元,節(jié)省了存儲(chǔ)空間。例如: s=2+4+6+100mov ax,0 ;將累加器ax清0。movbx,2 ;將初始數(shù)據(jù)2送入bx。mov cx,50 ;將循環(huán)計(jì)數(shù)值送入cx。lp: add ax,bx ;進(jìn)行累加,結(jié)果在ax中。add bx,2 ;在bx中形成原始數(shù)據(jù)4、6、8、100。loop lp ;循環(huán)操作,直到cx=0為

33、止。mov s,ax ;將最后累加結(jié)果送變量s中。 用鍵盤提供數(shù)據(jù)當(dāng)原始數(shù)據(jù)為任意數(shù)據(jù)時(shí),一般用鍵盤輸入方法,這可用dos 2lh中斷01h號(hào)功能實(shí)現(xiàn),如:mov ah,0lhint 2lh當(dāng)cpu執(zhí)行到這兩條語(yǔ)句后就等待鍵盤輸入字符,通過(guò)鍵盤送入的字符是以ascii碼的形式送入al寄存器中,如果鍵入字符3,送入al寄存器中是33h。(3) 數(shù)據(jù)的輸出方式 在顯示器上顯示一個(gè)字符將要顯示的字符的ascii碼送入dl,再調(diào)用dos 21h中斷02h號(hào)功能,就可在顯示器上顯示該字符。mov dl,3 ;將3的ascii碼送入dl。mov ah,02h ;調(diào)用02h功能。int 2lh ;發(fā)中斷請(qǐng)求

34、。 在打印機(jī)上輸出一個(gè)字符將要打印字符的ascii碼送入dl,再調(diào)用dos 21h中斷02h號(hào)功能,就可在打印機(jī)上打印出dl中的字符。mov dl,3mov ah,05hint 2lh1.4.4 返回dos狀態(tài)的方法當(dāng)在dos狀態(tài)下執(zhí)行.exe文件時(shí),如果希望在執(zhí)行完.exe文件后正常返回dos狀態(tài),一般用如下兩種方法;(1) 采用dos 21h中斷4ch號(hào)功能調(diào)用mov ah,4chint 2lh(2) 采用返回(ret)斷點(diǎn)的方法程序名 proc farpush dssub ax, axpush axret程序名 endp1.5 調(diào)試軟件debug實(shí)際上,大部分程序必須經(jīng)過(guò)調(diào)試才能糾正程序

35、設(shè)計(jì)中的錯(cuò)誤,從面得到正確的結(jié)果。匯編語(yǔ)言程序調(diào)試,就是用調(diào)試程序(debug 程序)發(fā)現(xiàn)錯(cuò)誤,再經(jīng)過(guò)編輯,匯編,鏈接糾正錯(cuò)誤。下面以調(diào)試xyz.exe 程序?yàn)槔o出debug 程序中最常用的幾個(gè)命令。1、進(jìn)入debug,并調(diào)入xyz.exe程序先用debug 程序裝入要調(diào)試的匯編語(yǔ)言程序程xyz.exe,操作命令如下:ddebug xyz.exe 此時(shí),屏幕上出現(xiàn)一個(gè)短劃線,即為debug 環(huán)境下的提示符。2、反匯編命令u:u ;從當(dāng)前地址反匯編。u120 ;從cs:120h 處開(kāi)始反匯編。3、匯編命令a: a100 ;從cs:100h 開(kāi)始輸入?yún)R編指令。4、顯示存儲(chǔ)單元內(nèi)容命令d: d d

36、s:0000 ;從數(shù)據(jù)段的0 單元開(kāi)始顯示128 個(gè)字節(jié)。5、修改存儲(chǔ)單元命令e: e address ;修改存儲(chǔ)單元內(nèi)容。 e cs:100 ;則用戶可以直接鍵入要修改的內(nèi)容,再按“空格”鍵;可修改下一單元內(nèi)容,直到用回車鍵結(jié)束該命令。6、存文件命令w:在存文件之前,首先要把文件 的長(zhǎng)度(字節(jié)數(shù))填寫在bx 和cx 寄存器中。例如:r bxbx xxxx:0000r cxcx xxxx:nnnn ;文件字節(jié)長(zhǎng)度。n 文件名.asmw7、讀文件命令l:n 文件名.asm ;在讀文件前必須先輸入文件名l ;讀入文件。8、單步執(zhí)行命令t:t;從當(dāng)前cs:ip地址執(zhí)行一條指令t3 ;從當(dāng)前地址往下執(zhí)

37、行三條指令9、執(zhí)行程序命令g:g =100 ;(若不輸入起始地址,則以cs:ip 為起始地址。;注意:g 有起始地址時(shí),切不可忘掉 “=”號(hào)。) 設(shè)斷點(diǎn)運(yùn)行g(shù) =起始地址 斷點(diǎn)地址1 斷點(diǎn)地址2 (斷點(diǎn)地址最多不超過(guò)十個(gè))。10、退出debug:使用如下命令q可退出debug軟件 q1.6 匯編指令調(diào)試一、實(shí)驗(yàn)?zāi)康?. 了解debug的常用命令,學(xué)會(huì)用debug調(diào)試程序。2. 了解數(shù)據(jù)在存儲(chǔ)器中的存取方法,及堆棧中數(shù)據(jù)的壓入與彈出。3. 掌握各種尋址方法以及簡(jiǎn)單指令的執(zhí)行過(guò)程。二、實(shí)驗(yàn)內(nèi)容1.設(shè)堆棧指針sp=2000h,ax=3000h,bx=5000h,編寫一段程序,將ax的內(nèi)容和bx的內(nèi)容

38、進(jìn)行交換,用堆棧作為兩寄存器交換內(nèi)容的中間存儲(chǔ)單元,用debug調(diào)試程序進(jìn)行匯編與調(diào)試。2.設(shè)ds=當(dāng)前段地址,bx=0300h,si=0002h,用debug的命令將十六進(jìn)制數(shù)據(jù)0ah、0bh、0ch、0dh、0eh順序裝入偏移地址為300h304h的連續(xù)存儲(chǔ)單元。在debug狀態(tài)下送入下面程序,并用單步執(zhí)行的方法,分析每條指令源地址的形成過(guò)程?當(dāng)數(shù)據(jù)傳送完畢時(shí),ax中的內(nèi)容是什么?程序清單如下:mov ax,bxmov ax,0304hmov ax,0304hmov ax,bxmov ax,0001 bxmov ax,bxsimov ax,0001 bx siint 33.設(shè)ax=0002

39、h,編一個(gè)程序段用移位的方法將ax的內(nèi)容乘10。三、實(shí)驗(yàn)要求1.實(shí)驗(yàn)前要作好充分準(zhǔn)備,包括匯編程序清單、調(diào)試步驟、調(diào)試方法,對(duì)程序結(jié)果的分析等。2.本實(shí)驗(yàn)在pc機(jī)上進(jìn)行。3.本實(shí)驗(yàn)只在debug調(diào)試程序狀態(tài)下進(jìn)行,包括匯編程序,調(diào)試程序,執(zhí)行程序。四、編程提示1. 實(shí)驗(yàn)內(nèi)容1將兩個(gè)寄存器的內(nèi)容進(jìn)行交換時(shí),必須有一個(gè)中間寄存器才能進(jìn)行內(nèi)容的交換。如果用堆棧作為中間存儲(chǔ)單元,必須遵循先進(jìn)后出的原則。2. 實(shí)驗(yàn)內(nèi)容2(1) 其中數(shù)據(jù)段寄存器中的段地址為進(jìn)入debug狀態(tài)后系統(tǒng)自動(dòng)分配的段地址。(2) si和bx的初值可在debug狀態(tài)下,用r命令裝入,也可以在程序中用指令來(lái)完成。(3) 用t命令程序

40、執(zhí)行,可進(jìn)行單步跟蹤執(zhí)行,每執(zhí)行一條指令就可以看到各寄存器的狀態(tài)。也可用r命令直接調(diào)出寄存器,來(lái)檢驗(yàn)各寄存器內(nèi)容是否正確。(4) 在執(zhí)行程序前,可用e命令將偏移地址300h304h送入0ah,0bh,0ch,0dh。3. 實(shí)驗(yàn)內(nèi)容3(1) 用移位的方法完成某些乘法運(yùn)算,是較為常見(jiàn)的方法,操作數(shù)左移一位為操作數(shù)乘2運(yùn)算。(2) 算式2xlo的程序流程圖如下:ax、bx 裝入操作數(shù)2ax 左移兩位axax+bxaxax 左移一位ax開(kāi) 始結(jié) 束(3) 程序的執(zhí)行可用debug的g命令,也可用t命令單步跟蹤執(zhí)行。在程序送入后,用debug命令將它存入磁盤,以免程序丟失時(shí)需重新調(diào)入。五、實(shí)驗(yàn)報(bào)告1.程

41、序說(shuō)明說(shuō)明程序的功能、結(jié)構(gòu)。包括:程序名、功能、算法說(shuō)明、主要符號(hào),并對(duì)所用到的寄存器進(jìn)行說(shuō)明。2.調(diào)試說(shuō)明上機(jī)調(diào)試的情況:上機(jī)調(diào)試步驟,調(diào)試過(guò)程中所遇到的問(wèn)題是如何解決的。對(duì)調(diào)試過(guò)程中的問(wèn)題進(jìn)行分析,對(duì)執(zhí)行結(jié)果進(jìn)行分析。3.畫出程序框圖;4.寫出程序和執(zhí)行過(guò)程清單。實(shí)驗(yàn)二 加法及判斷程序調(diào)試實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?. 掌握編寫匯編語(yǔ)言源程序的基本方法和基本框架。2. 學(xué)會(huì)編寫順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的匯編程序,掌握宏定義與宏調(diào)用的方法。3.掌握程序中數(shù)據(jù)的產(chǎn)生與輸入輸出的方法。二、實(shí)驗(yàn)內(nèi)容1. 用匯編語(yǔ)言編寫一個(gè)加法程序: 1325十9839,用ascii碼的形式將加數(shù)與被加數(shù)存放在數(shù)據(jù)區(qū)da

42、ta1和data2中,并將相加結(jié)果顯示輸出。2. 設(shè)有一組數(shù)據(jù): 5,-4,0,3,100,-51,編程判斷:每個(gè)數(shù)是0、=0、還是0yn(5) 參考程序流程圖二。圖4-2 參考程序流程圖二五、思考題(1) 兩個(gè)實(shí)驗(yàn)內(nèi)容中的原始數(shù)據(jù)是否可以通過(guò)鍵盤輸入?請(qǐng)將編好的程序上機(jī)調(diào)試。(2) 程序中的原始數(shù)據(jù)是以怎樣的形式存放在數(shù)據(jù)區(qū)中的?請(qǐng)用debug調(diào)試程序進(jìn)行觀察,并分析。(3) 在實(shí)驗(yàn)內(nèi)容2中,打印顯示部分是否可以用宏定義來(lái)定義?六、實(shí)驗(yàn)報(bào)告1程序說(shuō)明(1) 說(shuō)明程序基本結(jié)構(gòu),包括程序中各部分的功能。(2) 說(shuō)明入口參數(shù)與出口參數(shù),各種參數(shù)輸人與輸出的方式。(3) 說(shuō)明程序中各部分所用的算法和

43、編程技巧。(4) 說(shuō)明主要符號(hào)和所用到寄存器的功能。2上機(jī)調(diào)試說(shuō)明(1) 上機(jī)調(diào)試步驟。(2) 上機(jī)調(diào)試過(guò)程中遇到的問(wèn)題是如何解決的。(3) 對(duì)調(diào)試源程序的中間結(jié)果和最終結(jié)果進(jìn)行分析。3畫出程序總框圖。4寫出源程序清單與執(zhí)行結(jié)果。5回答思考題。實(shí)驗(yàn)三 dos中斷調(diào)用實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康恼莆兆址蛿?shù)據(jù)的顯示方法。二、實(shí)驗(yàn)內(nèi)容先顯示信息“inputstring,the end flag is $”再接收字符。如為0-9,則計(jì)數(shù)器加1,并顯示計(jì)數(shù),如為非數(shù)字,則直接顯示,但不計(jì)數(shù)。段寄存器和堆棧初始化數(shù)字字符計(jì)數(shù)器bx清0顯示提示信息入 口調(diào)用disp顯示子程序是$字符?是回車鍵回車換行nnyy計(jì)數(shù)器b

44、x加1返回dos是09ynint 21h 的01h 子功能接收鍵入字符調(diào)用disp顯示子程序,并顯示計(jì)數(shù)結(jié)果調(diào)用disp顯示子程序,并顯示計(jì)數(shù)結(jié)果三、程序框圖5-1 參考程序流程圖四、實(shí)驗(yàn)報(bào)告1程序說(shuō)明2上機(jī)調(diào)試說(shuō)明3畫出程序總框圖。4寫出源程序清單與執(zhí)行結(jié)果。實(shí)驗(yàn)四 微機(jī)接口實(shí)驗(yàn)4.1 實(shí)驗(yàn)設(shè)備簡(jiǎn)介一、硬件介紹1、實(shí)驗(yàn)板上設(shè)有8253、8255、8251等接口芯片,每個(gè)芯片的片選信號(hào)cs都需要擴(kuò)展;2、實(shí)驗(yàn)板上共有ioy0(600h-63fh)、ioy1(640h-67fh)、ioy2(680h-6bfh)三個(gè)可選的片選地址范圍;3、接口芯片中的a0、a1、a2等地址引腳已經(jīng)直接連到了芯片上

45、,無(wú)需用戶連接;4、8253芯片的gate0已接+5v,out2、gate2、clk2沒(méi)有外接引線;5、實(shí)驗(yàn)板上提供了irq5、irq6、irq7三根中斷請(qǐng)求輸入線,其中irq7用戶可用;6、實(shí)驗(yàn)板上提供了8路開(kāi)關(guān)、8路led(共陰)顯示,其引線分別在開(kāi)關(guān)和led的上方;7、實(shí)驗(yàn)板上提供了2路手動(dòng)脈沖輸入開(kāi)關(guān);8、實(shí)驗(yàn)板有時(shí)會(huì)工作不正常,這時(shí)一般可復(fù)位實(shí)驗(yàn)板左上方背面的復(fù)位按鈕,也可直接用試驗(yàn)箱上的電源開(kāi)關(guān)進(jìn)行復(fù)位。二、軟件介紹1、實(shí)驗(yàn)系統(tǒng)共有兩個(gè)軟件(其運(yùn)行圖標(biāo)都已安裝在桌面或程序開(kāi)始菜單欄中):td-acc:匯編語(yǔ)言運(yùn)行調(diào)試軟件td-osc:虛擬示波器軟件2、匯編語(yǔ)言程序調(diào)試的實(shí)驗(yàn)步驟、運(yùn)

46、行桌面上的td-acc軟件;、選擇菜單“文件”-“打開(kāi)”,調(diào)入源程序;、編譯、連接、下載試驗(yàn)程序;、運(yùn)行;3、實(shí)驗(yàn)系統(tǒng)內(nèi)存的分配程序下載時(shí)的初始狀態(tài):、程序代碼始終下載到0200h:0000h地址處;、應(yīng)用程序的堆棧地址始終為0000h:7fffh、用戶程序的數(shù)據(jù)段被自動(dòng)安排到代碼段的后面;4、由于試驗(yàn)系統(tǒng)采用上下位機(jī)結(jié)構(gòu),每個(gè)匯編程序都必須下載到下位機(jī)才能運(yùn)行,而下位機(jī)又不帶顯示接口,無(wú)顯示屏,因此匯編程序的編程與通用x86系列的微機(jī)會(huì)有些差別:、屏幕顯示運(yùn)行結(jié)果,用ah=1,al=asc碼字符,int 10h來(lái)組合;、盡量不要采用除下列調(diào)用之外的其它功能調(diào)用和中斷調(diào)用;、不能用鍵盤進(jìn)行輸入

47、操作;三、可用的功能調(diào)用、輸入?yún)?shù):ah=04ch或ah=00h,功能:退出程序到dos操作系統(tǒng)、輸入?yún)?shù):ah=01h,功能:讀鍵盤輸入到al中,并將輸入字符顯示在屏幕中、輸入?yún)?shù):ah=02h,dl=字符的ascii碼,功能:將dl中的字符顯示在屏幕中、輸入?yún)?shù):ah=08h,功能:讀鍵盤輸入到al中,且不顯示輸入的字符、輸入?yún)?shù):ah=09h,ds:dx字符竄的首地址,字符竄必須以$結(jié)尾,功能:顯示字符竄,直到$為止、輸入?yún)?shù):ah=0ah,ds:dx緩沖區(qū)首地址,ds:dx緩沖區(qū)最大輸入字符數(shù),輸出參數(shù):ds:dx+1實(shí)際輸入的字符數(shù),ds:dx+2輸入字符竄的緩沖區(qū)首地址,功能:讀鍵

48、盤輸入的字符竄到緩沖區(qū)ds:dx中,并以回車結(jié)束4.2 8253可編程定時(shí)器計(jì)數(shù)器實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?. 熟悉8253 接口芯片的工作原理。2. 掌握8253 接口芯片的編程控制方法。二、實(shí)驗(yàn)內(nèi)容1計(jì)數(shù)器0 以方式2(分頻)工作,計(jì)數(shù)器初值0fh,用手動(dòng)逐個(gè)輸入單脈沖,編程使計(jì)數(shù)值在屏幕上顯示,并同時(shí)用邏輯筆觀察out0 電平變化(當(dāng)輸入n+1 個(gè)脈沖后out0變高電平)。2計(jì)數(shù)器0 和計(jì)數(shù)器1 串接后均以方式3(方波)工作,初值=1000,用示波器觀察out1輸出電平的變化(頻率1hz)。3計(jì)數(shù)器0 以方式3 工作,輸出作為計(jì)數(shù)器1 的輸入,計(jì)數(shù)器1 以方式2 工作。編程實(shí)現(xiàn)在顯示屏幕上提示輸

49、入計(jì)數(shù)器0 和計(jì)數(shù)器1 的參數(shù),如下所示:counter1:_counter2:_continue?(y/n)_要求在程序運(yùn)行時(shí)能夠用鍵盤直接輸入修改方波和分頻信號(hào)的參數(shù),實(shí)時(shí)改變方波的寬度、分頻信號(hào)的周期和分頻數(shù)。用示波器觀察計(jì)數(shù)器0 和計(jì)數(shù)器1 的輸出波形及其關(guān)系,并在紙上記錄clk0、out0、out1 的波形。三、硬件接線圖6-1 計(jì)數(shù)器0方式2工作接線示意圖圖6-2 計(jì)數(shù)器0和計(jì)數(shù)器1方式3(方波)工作接線示意圖圖6-3 計(jì)數(shù)器0 方式3(方波)和計(jì)數(shù)器1 方式2(分頻)工作接線示意圖四、編程提要18253 計(jì)數(shù)器0 地址 680h計(jì)數(shù)器1 地址 681h控制寄存器地址 683hclk0連接時(shí)鐘 1mhz2參考流程圖設(shè)計(jì)數(shù)器0為工作方式0送計(jì)數(shù)器初值讀

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論