實(shí) 驗(yàn)?? 匯編語言程序結(jié)構(gòu)
一、實(shí)驗(yàn)?zāi)康?br>?
1.掌握匯編語言程序上機(jī)過程。
??? 2.掌握匯編語言結(jié)構(gòu)。
??? 3.學(xué)習(xí)匯編語言的偽操作。
??? 4.了解匯編程序、連接程序、DOS系統(tǒng)裝入和返回功能。
??? 5.掌握用DEBUG調(diào)試匯編語言程序的方法
二、實(shí)驗(yàn)任務(wù)
1.?編寫完整的匯編語言程序
(1)?從鍵盤輸入一個(gè)字符,將該字符對(duì)應(yīng)的ASCII碼以二進(jìn)制形式顯示出來。
(2)?將1CH類型中斷子程入口地址的段址和偏移地址以十六進(jìn)制形式顯示出來。
(3)?密碼檢測(cè):從鍵盤輸入的字符串,如果與所設(shè)密碼相符,顯示‘Welcome’;不符,顯示‘Invalid Password!’。要求輸入密碼前,給出‘Enter Password:’的提示,輸入的密碼不反顯,而以‘*’顯示。
(4)?將數(shù)據(jù)段1定義的字符串‘How are you doing?’ 傳送到數(shù)據(jù)段2定義的緩沖區(qū)中。
2.?偽操作學(xué)習(xí)
編輯下列源文件:
data??????????? SEGMENT
var0??????????? DB??? 10101010B,‘TsingHua’
var1??????????? DW? ‘efgh’
var2??????????? DB??? -374,-1
var3??????????? DW??? -1,9080H
var4??????????? DD??? ffeeddccH
data??????????? ENDS?
code??????????? SEGMENT
ASSUME? CS:code,DS:data
start:????????? MOV????? DS,data
????????????? MOV????? CX,var0
??????????????? LEA????? AL,var1
code??????????? ENDS
????????????? END?? start
匯編該文件,據(jù)提示說明出錯(cuò)語句的錯(cuò)誤原因。
修改程序中的錯(cuò)誤,在DEBUG下查看變量var0~var4在內(nèi)存中的存放情況。
三、實(shí)驗(yàn)說明
1.?參看附錄2,了解匯編程序、連接程序、DOS的裝入和返回功能。
2.?匯編語言程序的上機(jī)過程
(1)建立匯編語言程序源文件??墒褂萌魏我粋€(gè)文本編輯器(如EDIT.com)編輯源文件,源文件,源文件的擴(kuò)展名通常取為.asm。
(2)匯編文件,形成目標(biāo)模塊。匯編程序的使用參看附錄2。
?若文件有語法錯(cuò)誤,據(jù)錯(cuò)誤提示,返回(1),修改源文件。
若無錯(cuò),則形成.OBJ目標(biāo)文件和.LST列表文件。
???? (3)連接目標(biāo)模塊,形成可執(zhí)行文件。連接程序的使用參看附錄2。
若有錯(cuò),據(jù)錯(cuò)誤提示,返回(1),修改錯(cuò)誤。
若無錯(cuò),則形成.EXE可執(zhí)行文件和.MAP映像文件。
(4)?DOS下直接鍵入可執(zhí)行文件名,即可執(zhí)行該程序。
(5)?運(yùn)行結(jié)果不對(duì),需調(diào)試程序,查找原因。
返回步驟(1)查看源文件,查找錯(cuò)誤,修改文件。
若無法通過查看源文件找出錯(cuò)誤,可在DEBUG下調(diào)試.EXE文件,找出錯(cuò)誤之處,再返回步驟(1)。參看附錄2,了解在DEBUG下裝入.exe文件的方法,利用在實(shí)驗(yàn)一中掌握的調(diào)試方法對(duì)程序進(jìn)行調(diào)試。
3.?對(duì)于編程任務(wù)(1),利用DOS的單字符輸入功能,即可獲得輸入字符的ASCII碼。字符的ASCII碼為一個(gè)8位二進(jìn)制數(shù),顯示時(shí)需將這8位二進(jìn)制數(shù)值(0或1)分別轉(zhuǎn)換為其對(duì)應(yīng)的ASCII碼(30H或31H),從高位至低位順序顯示出來。
4.?對(duì)于編程任務(wù)(2),中斷子程的入口地址可從中斷向量表中獲得,段地址和偏移地址均為16位二進(jìn)制數(shù),用十六進(jìn)制表示為4位數(shù),顯示時(shí)需將這4位十六進(jìn)制數(shù)值轉(zhuǎn)換為其對(duì)應(yīng)的ASCII碼,從高位至低位順序顯示出來。
5.?對(duì)于編程任務(wù)(3),實(shí)質(zhì)是一個(gè)字符串的比較程序,其中不回顯的輸入可調(diào)用DOS的07H或08H功能完成。
6.?編程任務(wù)(4),程序本身較簡(jiǎn)單,請(qǐng)按下列要求完成任務(wù):
?? (1)在匯編過程中,除形成.obj目標(biāo)文件外,還要形成源文件的 .lst列表文件,通過查看列表文件,掌握匯編程序的基本功能。
(2)在連接過程中,除形成 .exe執(zhí)行文件外,還要形成其 .map 映像文件,通過查看映像文件,掌握連接程序的功能.
(3) 由于程序中無結(jié)果的顯示,故需在DEBUG下運(yùn)行并查看結(jié)果。
(4)分別用附錄2 中介紹的兩種方法,完成程序返回DOS的功能。
(5)在DEBUG下查看程序,對(duì)照源程序文件 .asm,掌握匯編程序偽操作的功能。
7.利用DEBUG,學(xué)習(xí)偽操作的方法。
在DEBUG下查看源程序時(shí),發(fā)現(xiàn).asm源文件指令中用符號(hào)表示的變量、標(biāo)號(hào)、過程名等符號(hào)地址以及一些由匯編提供的操作符(如SEG,OFFSET等)均被一些確定的數(shù)值代替,從而說明,這些用符號(hào)表示的地址,經(jīng)過匯編、連接及裝入內(nèi)存后,都有了具體的選擇理地址與之對(duì)應(yīng),其它的一些偽操作也都在程序執(zhí)行前已經(jīng)完成,通過對(duì)在DEBUG下查看源程序,對(duì)比.asm源文件,可以掌握偽操作的功能。
例:有如下程序段,程序源文件名設(shè)為Study.asm:
data???????? SEGMENT
string?????? DB‘how are you doing?’,‘$’
D_word?????? DW????? 1234h,5678h
Data???????? ENDS
Code???????? SEGMENT
???????????? ASSUME??? CS:code,DS:data
main???????? PROC???? FAR
Begin:?????? PUSH? DS
???????????? MOV?? AX,0
???????????? PUSH? AX
??????????? MOV?? AX,data
??????????? MOV?? DS,AX
??????????? MOV?? SI,OFFSET string
??????????? MOV?? BL,string
??????????? RET
main????????? ENDP
code????????? ENDS
??????????? END begin
經(jīng)匯編、連接后,形成Study.exe,在DEBUG下裝入此文件,用U查看程序。
D:\>DEBUG study.exe ↙
-U ↙
12A7:0000 1E???????? PUSH DS
12A7:0001 B80000???? MOV AX,0000
12A7:0004 50???????? PUSH AX
12A7:0005 B8A512???? MOV AX,12A5??? ;原為MOV AX,data
12a7:0008 8ED8?????? MOV DS,AX
12A7:000A BE0000???? MOV SI,0000??? ;原為MOV SI,OFFSET string
12A7:000D 8A1E0000?? MOV BL,[0000]? ;原為MOV BL,string
12A7:0011 CB???????? RETF
?┇???????????????????????????????? ;省略與程序部分無關(guān)的顯示
—
對(duì)照源程序Study.asm,可知:
(1)?定義的data段,在內(nèi)存的段值為12A5H;
(2)?偽操作OFFSET的作用是取變量string的偏移地址:
從匯編后操作數(shù)OFFSET string由string的偏移值0000代替可知;
(3)?變量string是一個(gè)直接尋址的操作數(shù):
從程序中操作數(shù)string被操作數(shù)[0000]代替可知。
(4)?用命令D查看12A5H段的內(nèi)容
—D 12 5:0 L 30 ↙
12A5:0000 48 6F 77 20 61 72 65 20—79 6F 75 20 64 6F 69 6E? How are you doing
12A5:0010 67 20 3F 24 34 12 78 56—00 00 00 00 00 00 00 00? g?$4Xv … … …
12A5:0020 1E B8 00 00 50 B8 A5 12—8E D8 BE 00 00 8A 1E 00???? P … … … …
—
看到存放在內(nèi)存的字符串‘How are you doing?’,其后存放數(shù)值1234H,5678H,存放規(guī)則為低地址的內(nèi)存單元放低字節(jié)數(shù)據(jù),高地址的內(nèi)存單元放高字節(jié)數(shù)據(jù)。
(5)?用命令R查看當(dāng)前各寄存器值
—R ↙
AX=0000 BX=0000 CX=0032 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=1295 ES=1295 SS=12A5 CS=12A7 EP=0000 NV UP EI PL NZ NA PO NC
12A7:0000? 1E?????? PUSH? DS
—
當(dāng)前DS的值為1295H,并不等于data對(duì)應(yīng)的值12A5H,此時(shí)DS的值為程序段前綴所在段值,故程序中若不給DS賦值,使 DS的值等于12A5H,則指令MOV BL,[0000]中的操作數(shù)[0000]將不為12A5:0000H指向的值‘H’,而是1295:0H指向的值CDH。
(6)對(duì)偽操作功能不清楚的地方,均可通過編寫匯編語言程序,經(jīng)匯編、連接后在DEBUG下對(duì)照查看來掌握。
8.結(jié)束實(shí)驗(yàn)前,演示編程任務(wù)(1),(2),(3),(4)的運(yùn)行結(jié)果,請(qǐng)指導(dǎo)教師檢查。
四、問題思考
1.?匯編語言程序中語句END后的標(biāo)號(hào)作用是什么?
2.?采用附錄2介紹返回DOS的方法二中,可否將語句main proc far中的far屬性去掉,為什么?
3.?一個(gè)段的大小為多少?一定是64KB嗎?如何在DEBUG下查看程序在內(nèi)存的存放情況?畫出編程任務(wù)4各段在內(nèi)存的存放情況。
六、?實(shí)驗(yàn)報(bào)告
1.?畫出各程序流程圖,列出程序清單,加上適量注釋。
2.?記錄實(shí)驗(yàn)任務(wù)“2.偽操作學(xué)習(xí)”的結(jié)果。
3.?回答問題思考。
4.?針對(duì)實(shí)驗(yàn)?zāi)康淖鲂〗Y(jié)。
評(píng)論
查看更多