匯編語言實(shí)驗(yàn)指導(dǎo)書20131013new_第1頁
匯編語言實(shí)驗(yàn)指導(dǎo)書20131013new_第2頁
匯編語言實(shí)驗(yàn)指導(dǎo)書20131013new_第3頁
匯編語言實(shí)驗(yàn)指導(dǎo)書20131013new_第4頁
匯編語言實(shí)驗(yàn)指導(dǎo)書20131013new_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、目錄第一部分 匯編語言程序的上機(jī)過程1一、 建立匯編語言的工作環(huán)境1二、在計(jì)算機(jī)上運(yùn)行匯編語言的步驟1三、 建立ASM文件1四、 用MASM程序產(chǎn)生OBJ文件3五、 用LINK程序產(chǎn)生EXE文件3六、 程序的執(zhí)行3七、 舉例3第二部分 匯編語言上機(jī)調(diào)試4一、為何需要調(diào)試?4二、如何進(jìn)行調(diào)試?5第三部分 匯編語言上機(jī)內(nèi)容8實(shí)驗(yàn)一 輸出字符串8實(shí)驗(yàn)二 算術(shù)指令綜合編程8實(shí)驗(yàn)三 查找子字符串9實(shí)驗(yàn)四 信息檢索(選做)10實(shí)驗(yàn)五 格式化輸出10實(shí)驗(yàn)六 數(shù)組合并(選做)10實(shí)驗(yàn)七 字符統(tǒng)計(jì)11實(shí)驗(yàn)八 數(shù)制轉(zhuǎn)換(選做)12實(shí)驗(yàn)九 字符串排序(選做)13第四部分 匯編語言實(shí)驗(yàn)參考代碼13實(shí)驗(yàn)一 輸出字符串1

2、3實(shí)驗(yàn)二 算術(shù)指令綜合編程14實(shí)驗(yàn)三 查找子字符串14實(shí)驗(yàn)四 信息檢索(選做)16實(shí)驗(yàn)五 格式化輸出18實(shí)驗(yàn)六 數(shù)組合并(選做)19實(shí)驗(yàn)七 字符統(tǒng)計(jì)21實(shí)驗(yàn)八 數(shù)制轉(zhuǎn)換(選做)23實(shí)驗(yàn)九 字符串排序(選做)27第一部分 匯編語言程序的上機(jī)過程一、 建立匯編語言的工作環(huán)境為在Windows環(huán)境下運(yùn)行匯編語言程序至少要在磁盤上建立以下文件:1、 匯編程序,如MASM.EXE2、 連接程序,如LINK.EXE必要時(shí),還可建立如CREF.EXE,EXE2BIN.EXE等文件。二、在計(jì)算機(jī)上運(yùn)行匯編語言的步驟1、 用編輯程序建立ASM源文件,以ASM作為擴(kuò)展名2、 用匯編程序把ASM文件轉(zhuǎn)換成OBJ文件

3、3、 用連接程序把OBJ文件轉(zhuǎn)換成可執(zhí)行文件4、 在DOS提示符下直接鍵入可執(zhí)行文件名即可執(zhí)行該程序三、 建立ASM文件用任何文本編輯器建立ASM文件,源程序輸入完后,以ASM作為擴(kuò)展名進(jìn)行保存,(注意:在文件保存對話框中的“保存類型”選擇“所有類型”)假設(shè)所保存的文件名為:ex.asm。ASM源文件的格式1:;定義數(shù)據(jù)段,如果需要的話,其中segment和ends是一對偽操作,表示段的開始和結(jié)束data segment;數(shù)據(jù)段開始;定義數(shù)據(jù)段的主體,如定義變量data ends;數(shù)據(jù)段結(jié)束;定義附加段,如果需要的話extra segment;附加段開始;定義附加段的主體,如定義變量extra

4、 ends;附加段結(jié)束;定義代碼段,必須的code segment;代碼段開始main proc far;程序的主體部分,proc和endp這一對偽操作表示一個(gè)程序模塊的開始和結(jié)束assume ds:data, es:extra, cs:code;assume 偽操作指定某個(gè)段分配給哪個(gè)段寄存器start:;程序的入口地址push ds;保存原數(shù)據(jù)段sub ax,ax;ax寄存器清零,作為數(shù)據(jù)段0偏移地址push ax;數(shù)據(jù)段0偏移地址壓入堆棧中mov ax,datamov ds,ax;把數(shù)據(jù)段地址裝入數(shù)據(jù)段寄存器dsmov ax,extra mov es,ax;把附加段地址裝入附加段寄存器e

5、s;自己所要實(shí)現(xiàn)的功能源代碼在此添加ret;程序結(jié)束后返回DOSmain endp ;程序的主體部分結(jié)束code ends;代碼段結(jié)束end start ;匯編程序的結(jié)束,程序在start處開始執(zhí)行ASM源文件的格式2:;定義數(shù)據(jù)段,如果需要的話,其中segment和ends是一對偽操作,表示段的開始和結(jié)束data segment;數(shù)據(jù)段開始;定義數(shù)據(jù)段的主體,如定義變量data ends;數(shù)據(jù)段結(jié)束;定義附加段,如果需要的話extra segment;附加段開始;定義附加段的主體,如定義變量extra ends;附加段結(jié)束;定義代碼段,必須的code segment;代碼段開始main pr

6、oc far;程序的主體部分,proc和endp這一對偽操作表示一個(gè)程序模塊的開始和結(jié)束assume ds:data, es:extra, cs:code;assume 偽操作指定某個(gè)段分配給哪個(gè)段寄存器start:;程序的入口地址mov ax,datamov ds,ax;把數(shù)據(jù)段地址裝入數(shù)據(jù)段寄存器dsmov ax,extra mov es,ax;把附加段地址裝入附加段寄存器es;自己所要實(shí)現(xiàn)的功能源代碼在此添加mov ax,4c00h;程序結(jié)束后返回DOSint 21hmain endp ;程序的主體部分結(jié)束code ends;代碼段結(jié)束end start ;匯編程序的結(jié)束,程序在star

7、t處開始執(zhí)行該步以及以下幾步在電腦上一邊講解,一邊演示給同學(xué)們看。四、 用MASM程序產(chǎn)生OBJ文件源文件建立后,就要用匯編程序?qū)υ次募R編,匯編后產(chǎn)生二進(jìn)制目標(biāo)文件(以O(shè)BJ作為擴(kuò)展名),其操作如下:D:masm ex.asm匯編程序輸入的是ASM文件,其輸出文件可以是3個(gè),第一個(gè)是OBJ文件,這是我們匯編的主要目的。第二個(gè)是LIST文件,稱為列表文件,這個(gè)文件列出源程序和機(jī)器語言程序清單,并給出符號表,因而可使程序調(diào)試更加方便,這個(gè)文件可有可無,如果不需要,則可對NUL.LST直接按回車鍵。LST清單的最后部分為段名表和符號表,表中分別給出段名、段的大小及有關(guān)屬性,以及用戶定義的符號名、類

8、型和屬性。第三個(gè)是CRF文件,這個(gè)文件用來產(chǎn)生交叉引用表REF,對于一般程序不需要建立此文件。為了建立交叉引用表,必須調(diào)用CREF程序。至此,匯編過程已經(jīng)完成了。但是,匯編程序還有另一個(gè)重要功能,可以給出源程序的出錯(cuò)信息。警告信息(warning errors)指出匯編程序所認(rèn)為的一般性錯(cuò)誤,嚴(yán)重警告錯(cuò)誤(severe errors)則指出匯編程序認(rèn)為已使匯編程序無法進(jìn)行正確匯編的錯(cuò)誤。除給出錯(cuò)誤的個(gè)數(shù)外,匯編程序還給出出錯(cuò)信息,包括出錯(cuò)的行和錯(cuò)誤類型。當(dāng)然匯編程序只能給出程序中的語法錯(cuò)誤,至于程序的算法或編制程序中的其他錯(cuò)誤則程序的調(diào)試時(shí)去解決。五、 用LINK程序產(chǎn)生EXE文件在DOS提示

9、符下鍵入LINK命令即可,具體的操作如下:D:link ex.objLINK程序有兩個(gè)輸入文件OBJ和LIB。OBJ是我們需要連接的目標(biāo)文件,LIB則是程序中需要用到的庫文件,如果程序中沒有用到庫文件,則直接按回車健。LINK程序有兩個(gè)輸出文件EXE和MAP文件,EXE文件就是可執(zhí)行文件,MAP文件是連接程序的列表文件,又稱為連接映像,它給出每個(gè)段在存儲器中的分配情況。六、 程序的執(zhí)行在DOS提示符下直接鍵入可執(zhí)行的文件名即可,具體的操作如下:D:ex七、 舉例下面這個(gè)源代碼的功能是在屏幕上顯示一個(gè)字符串“This is my first ASM program.”。data segments

10、tring db This is my first ASM program.,13,10,$ ;字符串以$符號結(jié)尾,以單引號括起來data endscode segmentmain proc farassume cs:code,ds:data;assume 偽操作指定某個(gè)段分配給哪個(gè)段寄存器,但它不能把段地址裝入段寄存器中start:;程序的入口地址push ds;save old data segmentsub ax,ax;ax寄存器清零,作為數(shù)據(jù)段0偏移地址push ax;零偏移地址入棧mov ax,datamov ds,ax;把數(shù)據(jù)段地址裝入數(shù)據(jù)段寄存器dslea dx,string;把

11、字符串首地址裝入dx寄存器,或?qū)懗蒻ov dx, offset stringmov ah,9;DOS功能調(diào)用,在屏幕上顯示字符串int 21h;DOS中斷ret;return to DOSmain endpcode endsend start;匯編的結(jié)束,程序在此執(zhí)行第二部分 匯編語言上機(jī)調(diào)試一、為何需要調(diào)試?一般匯編語言都要經(jīng)過編輯、編譯、連接等步驟生成可執(zhí)行文件,如果在編譯、連接之后沒有發(fā)現(xiàn)錯(cuò)誤,這只能說明你的程序沒有語法錯(cuò)誤,在運(yùn)行的時(shí)候,并不一定就得到正確的結(jié)果,如果得到的結(jié)果與你所期望的不同,怎么辦?這時(shí)候就需要對這個(gè)可執(zhí)行的文件進(jìn)行調(diào)試。;下面的源代碼完成的功能:把數(shù)據(jù)段中的串st

12、ring1傳送到附加段的string2中。data segment;定義數(shù)據(jù)段string1 db assembly languagedata endsextra segment;定義附加段string2 db 17 dup(?)extra segmentcode segment;定義代碼段main proc farassume cs:code,ds:data,es:extrastart:push dsxor ax,ax;ax寄存器清零,作用同sub ax,ax一樣push axmov ax,data;把數(shù)據(jù)段地址裝入ds寄存器mov ds,axmov ax,extra;把附加段地址裝入es寄

13、存器mov es,axlea si,string1;把源串首址裝入si寄存器lea di,string2;把目的串首址裝入di寄存器mov cx,17;把字符串長度裝入cx寄存器cld;清方向標(biāo)志,在串處理時(shí),地址自動(dòng)增加rep movsb;重復(fù)串傳送操作,重復(fù)次數(shù)放在cx中retmain endpcode endsend start二、如何進(jìn)行調(diào)試?假設(shè)上述代碼經(jīng)編譯、連接后生成的可執(zhí)行文件是example.exe1、 在DOS提示符下鍵入debug命令,注意debug命令后面的文件名必須是完整的,即擴(kuò)展名也要帶。d:masmdebug example.exe這時(shí)候就顯示提示符“”,就可在這

14、個(gè)短線后輸入debug命令。2、 u 反匯編命令【格式】u 起始地址 終止地址【說明】這里方括號里的內(nèi)容是可選的?!竟δ堋繉C(jī)器代碼反匯編成匯編指令【結(jié)果】鍵入u后顯示信息如下:最左邊給出的程序的段地址:偏移地址,即CS:IP值,右邊是匯編語言指令,中間是匯編語言指令對應(yīng)的機(jī)器語言指令。注意:調(diào)試程序默認(rèn)的數(shù)制是十六進(jìn)制。3、 g 設(shè)置斷點(diǎn)命令【格式】g 斷點(diǎn)地址【說明】啟動(dòng)程序,設(shè)置斷點(diǎn)【結(jié)果】假如我們把斷點(diǎn)設(shè)在CS:IP=141D:0004。在debug提示符下鍵入g4(g和4之間可以有空格,也可以沒有空格)結(jié)果如下:程序停在斷點(diǎn)處,并顯示出所有寄存器以及各標(biāo)志位的當(dāng)前值,最后一行給出下一

15、條將要執(zhí)行指令的地址、機(jī)器語言指令及匯編語言MOV AX,1419。我們可以從顯示的寄存器的內(nèi)容來了解程序運(yùn)行是否正確。從圖中可以看出各個(gè)段的16位段基地址值,如(DS)=1409H,(ES)=1409H,(SS)=1419H,(CS)=141DH。4、 t 單步執(zhí)行命令g命令設(shè)置了斷點(diǎn)之后,從這個(gè)斷點(diǎn)開始,每鍵入一次t命令,就按順序執(zhí)行一條指令,這樣我們就可以跟蹤程序的運(yùn)行。通過查看寄存器和存儲單元的內(nèi)容,有利于查找程序中的算法錯(cuò)誤或邏輯錯(cuò)誤?!靖袷健縯鍵入單步調(diào)試命令,運(yùn)行結(jié)果如下:可以看出,AX寄存器中原來的數(shù)0000已經(jīng)被新的數(shù)1419替換了。下一條即將執(zhí)行的指令是MOV DS,AX,

16、我們繼續(xù)執(zhí)行單步調(diào)試命令。繼續(xù)執(zhí)行單步調(diào)試命令: 可以看出,DS寄存器中原來的數(shù)1409已經(jīng)被新的數(shù)1419替換了。我們繼續(xù)執(zhí)行單步調(diào)試命令,程序就可以一步一步地往下執(zhí)行。5、 d 顯示存儲單元的內(nèi)容命令對于我們這個(gè)程序,由于它是要求把存儲器數(shù)據(jù)段中的一串字符傳送到附加段中,所以單從寄存器或在DOS提示符下鍵入可執(zhí)行文件名是看不到運(yùn)行結(jié)果的,因而需要用d命令分別查看數(shù)據(jù)段和附加段的有關(guān)區(qū)域的內(nèi)容?!靖袷健縟 段基址:偏移地址【結(jié)果】如果我們要查看數(shù)據(jù)段內(nèi)0偏移地址開始的存儲單元的內(nèi)容,可以鍵入如下的命令(假設(shè)程序已運(yùn)行到RET指令處,即CS:IP=141D:001C ):最左邊是數(shù)據(jù)段基地址:

17、偏移量,中間是存儲單元的內(nèi)容,每行為16個(gè)字節(jié),為一個(gè)小段(Paragraph),最右邊為對應(yīng)的ASCII碼,不能顯示的ASCII字符以點(diǎn)號顯示。可以看出,我們定義的字符串已顯示在數(shù)據(jù)段開始的存儲單元中,字符串的首地址就是位于數(shù)據(jù)段0偏移處。該圖顯示的是串操作結(jié)束之后的結(jié)果。從圖的右邊我們還可以看出,在數(shù)據(jù)段偏移地址0020H處又存放著同樣的字符串,我們在數(shù)據(jù)段中只定義了一次,為什么在這里卻顯示了兩次呢?原來1419:0020的地址恰恰就是附加段的首地址,1419:0020轉(zhuǎn)換成物理地址是1419100020141B0H,而附加段的首地址是141B:0000轉(zhuǎn)換成物理地址是141B10+000

18、0=141B0H,二者相等,從這里也可以看出,經(jīng)過串移動(dòng)操作后,數(shù)據(jù)段中的串已成功的移到了附加段中,這還可以從下面看出。如果我們要查看附加段內(nèi)0偏移地址開始的存儲單元的內(nèi)容,可以鍵入如下的命令:同樣,最左邊是附加段基地址:偏移量,中間是存儲單元的內(nèi)容,每行為16個(gè)字節(jié),為一個(gè)小段(Paragraph),最右邊為對應(yīng)的ASCII碼,不能顯示的ASCII字符以點(diǎn)號顯示。從圖的最右邊可以看出,經(jīng)過是串移動(dòng)操作結(jié)束之后,數(shù)據(jù)段中的字符串已成功的移到了附加段中。6、r 顯示寄存器內(nèi)容命令【格式】r 寄存器名方括號中寄存器名是可選的,如果沒有鍵入寄存器名,則顯示所有寄存器的內(nèi)容?!窘Y(jié)果】(1) 顯示全部寄

19、存器的內(nèi)容,可鍵入如下命令:(2) 顯示ax寄存器的內(nèi)容,可鍵入如下命令:最后一行的冒號提示以新的值替換ax中原有的值。如果輸入1234后ax的內(nèi)容變?yōu)?234H,結(jié)果如下:7、q 退出命令【格式】q【結(jié)果】結(jié)束debug運(yùn)行環(huán)境,回到DOS提示符。第三部分 匯編語言上機(jī)內(nèi)容實(shí)驗(yàn)一 輸出字符串【實(shí)驗(yàn)題目】在屏幕上輸出一個(gè)字符串【實(shí)驗(yàn)內(nèi)容】在屏幕上輸出字符串:This is my first ASM programme【實(shí)驗(yàn)?zāi)康摹?、 熟悉匯編語言編程環(huán)境2、 熟悉匯編語言上機(jī)步驟3、 初步掌握DOS系統(tǒng)功能調(diào)用的基本方法【實(shí)驗(yàn)步驟】1、在DOS提示符下鍵入EDIT命令,進(jìn)入DOS的編輯窗口,在

20、該窗口中輸入源代碼,編輯結(jié)束之后一定要以ASM擴(kuò)展名保存。2、在DOS提示符下鍵入MASM命令,對源代碼進(jìn)行編譯,若發(fā)現(xiàn)有錯(cuò)誤,再返回到第一步對源程序的錯(cuò)誤之處進(jìn)行修改,直到不出現(xiàn)錯(cuò)誤為止。3、在DOS提示符下進(jìn)入LINK命令,產(chǎn)生可執(zhí)行文件。4、執(zhí)行程序,查看實(shí)驗(yàn)結(jié)果實(shí)驗(yàn)二 算術(shù)指令綜合編程【實(shí)驗(yàn)題目】算術(shù)指令綜合編程【實(shí)驗(yàn)內(nèi)容】編程實(shí)現(xiàn):Z(W-X)/5)*Y)*2,其中W X Y Z 均為字單元,且為帶符號數(shù)【實(shí)驗(yàn)?zāi)康摹?、 熟練掌握算術(shù)運(yùn)算指令2、 初步掌握匯編語言上機(jī)調(diào)試功能【實(shí)驗(yàn)步驟】1、源程序的編輯、編譯、連接和執(zhí)行同實(shí)驗(yàn)一2、在DOS命令提示符下鍵入debug命令(注意:deb

21、ug 命令后面必須帶上可執(zhí)行的文件名且擴(kuò)展名不能丟),進(jìn)入debug環(huán)境,在屏幕上出現(xiàn)debug提示符“_”3、鍵入u反匯編命令,將機(jī)器語言反匯編成匯編指令4、鍵入g命令設(shè)置斷點(diǎn)5、鍵入t命令單步執(zhí)行程序6、鍵入d命令查看存儲單元的內(nèi)容7、鍵入r命令查看寄存器的內(nèi)容8、鍵入q命令退出debug環(huán)境,返回DOS實(shí)驗(yàn)三 查找子字符串【實(shí)驗(yàn)題目】串操作指令編程【實(shí)驗(yàn)內(nèi)容】查找匹配字符串,在一個(gè)字符串中查找一個(gè)子字符串(關(guān)鍵字),如果找到輸出“Found”,反之輸出“No found”,字符串和子字符串可以任意定義,如在字符串”how are you”中查找”are”。【實(shí)驗(yàn)?zāi)康摹?、 熟練掌握串傳送

22、指令2、進(jìn)一步掌握DOS系統(tǒng)功能調(diào)用的基本方法【實(shí)驗(yàn)步驟】同實(shí)驗(yàn)二【算法描述】1、 采用串比較指令和循環(huán)程序設(shè)計(jì)方法。2、 總的串比較次數(shù)的確定:,其中n1為被查找字符串長度,n2為子字符串(關(guān)鍵字)長度。3、 程序流程圖:開始CX總的串比較次數(shù) BX被查找字符串的首址DIBX BXBX+1CX入棧SI關(guān)鍵字首址CX串比較次數(shù)(關(guān)鍵字長度)執(zhí)行重復(fù)串比較指令ZF=1CX出棧CXCX-1CX=0CX出棧輸出“找到”的信息輸出“沒找到”的信息是是否否繼續(xù)查找實(shí)驗(yàn)四 信息檢索【實(shí)驗(yàn)題目】一個(gè)簡單的信息檢索系統(tǒng)【實(shí)驗(yàn)內(nèi)容】在程序的數(shù)據(jù)段中定義一個(gè)字符串?dāng)?shù)組,在鍵盤上輸入一個(gè)數(shù)字,在屏幕上輸出字符串?dāng)?shù)組

23、中的相應(yīng)索引號的字符串,字符串?dāng)?shù)組中每個(gè)字符串的長度相等。【實(shí)驗(yàn)?zāi)康摹?、 掌握輸入字符的DOS功能調(diào)用2、 掌握輸出字符串的DOS功能調(diào)用3、 掌握存儲單元的偏移地址的計(jì)算【實(shí)驗(yàn)步驟】同實(shí)驗(yàn)一【算法描述】1、 如果各字符串的長度相等,則被檢索的字符串的首地址bxallen,其中bx為字符串?dāng)?shù)組中的第一個(gè)字符串的首地址;al為從鍵盤上輸入的數(shù)字;len即每個(gè)字符串的長度。2、 程序分別以下幾個(gè)部分:a) 從鍵盤上輸入一個(gè)數(shù)字;b) 檢查輸入的有效性,即輸入的數(shù)字必須在09之間;c) 按照1所描述的算法計(jì)算被檢索的字符串的首地址;d) 輸出被檢索的字符串實(shí)驗(yàn)五 格式化輸出【實(shí)驗(yàn)題目】格式化輸出【

24、實(shí)驗(yàn)內(nèi)容】以表格1516(15行16列)形式輸出ASCII碼10H0FFH字符【實(shí)驗(yàn)?zāi)康摹?、 掌握輸出字符的DOS功能調(diào)用2、 掌握循環(huán)程序設(shè)計(jì)方法3、 熟悉堆棧的使用【實(shí)驗(yàn)步驟】同實(shí)驗(yàn)一實(shí)驗(yàn)六 數(shù)組合并【實(shí)驗(yàn)題目】數(shù)組合并【實(shí)驗(yàn)內(nèi)容】把兩個(gè)已排好序的數(shù)組連接成一個(gè)新的數(shù)組,使新的數(shù)組也是排好序的【實(shí)驗(yàn)?zāi)康摹?、 掌握循環(huán)程序設(shè)計(jì)方法2、 掌握分支程序設(shè)計(jì)方法【實(shí)驗(yàn)步驟】同實(shí)驗(yàn)二【算法描述】程序框圖如下:實(shí)驗(yàn)七 字符統(tǒng)計(jì)【實(shí)驗(yàn)題目】字符統(tǒng)計(jì)【實(shí)驗(yàn)內(nèi)容】從鍵盤上輸入一個(gè)字符串,然后統(tǒng)計(jì)英文字母、數(shù)字字符和其他字符的個(gè)數(shù)并輸出【實(shí)驗(yàn)?zāi)康摹?、 掌握輸入字符串的DOS功能調(diào)用2、 掌握分支程序設(shè)計(jì)

25、方法3、 掌握二進(jìn)制到十進(jìn)制的轉(zhuǎn)換的匯編語言實(shí)現(xiàn)方法【實(shí)驗(yàn)步驟】同實(shí)驗(yàn)一【算法描述】1、輸入字符串的DOS功能調(diào)用。21H中斷的功能A能從鍵盤讀入一串字符并把它存入用戶定義的緩沖區(qū)中。緩沖區(qū)的第一個(gè)字節(jié)保存最大字符數(shù),這個(gè)最大字符數(shù)用用戶程序給出。由于緩沖區(qū)的最大字符數(shù)僅用一個(gè)字節(jié)來表示,所以緩沖區(qū)最大只能接受255個(gè)字符。緩沖區(qū)的第二個(gè)字節(jié)是實(shí)際輸入字符的個(gè)數(shù),這個(gè)數(shù)據(jù)是有功能A填入的,而不是由用戶填入。實(shí)際輸入字符的個(gè)數(shù)不包括回車。在這兩個(gè)字節(jié)之后,字符串就按字節(jié)存入緩沖區(qū),最后結(jié)束字符串的回車0dh還要占用一個(gè)字節(jié),因此整個(gè)緩沖區(qū)的字節(jié)空間應(yīng)為最大字符數(shù)(包括回車在內(nèi))加2。舉例:在數(shù)據(jù)

26、區(qū)定義的字符緩沖區(qū)如下:data segmentstring db 32,?,32 dup(?)data ends如果鍵入字符串,how are you doing now? 此時(shí)緩沖區(qū)string的各單元的內(nèi)容如下(16進(jìn)制表示),從低地址到高地址:20 16 68 6F 77 20 61 72 65 20 79 6F 75 20 64 6F 69 6E 67 20 6E 6F 77 3F 0Dint 21h 的功能A把實(shí)際字符數(shù)(不包括回車)填入緩沖區(qū)的第二個(gè)字節(jié),并保持DS:DX指向緩沖區(qū)的第一個(gè)字節(jié)2、輸入字符的DOS功能調(diào)用21H中斷的功能1能從鍵盤讀入一個(gè)字符并把它存入al寄存器中

27、。Mov ah,1Int 21h;輸入的字符在al寄存器中。3、字符類型的判別,我們可以把整個(gè)ASCII字符表分成如下的7個(gè)區(qū)間:(假如字符的ASCII值為X),并判斷該字符的類型,分別計(jì)數(shù)。 X30h;為其他字符 30hX39h;為數(shù)字字符 39hX41h;為其他字符 41hX5ah;為大寫英文字母 5ahX61h;為其他字符 61hX7ah;為小寫英文字母 X7ah;為其他字符實(shí)驗(yàn)八 數(shù)制轉(zhuǎn)換【實(shí)驗(yàn)題目】數(shù)制轉(zhuǎn)換【實(shí)驗(yàn)內(nèi)容】從鍵盤上輸入十進(jìn)制數(shù),然后轉(zhuǎn)換為八進(jìn)制數(shù)并輸出,用子程序?qū)崿F(xiàn)【實(shí)驗(yàn)?zāi)康摹?、 掌握輸入字符的DOS功能調(diào)用2、 掌握十進(jìn)制到八進(jìn)制轉(zhuǎn)換的匯編語言實(shí)現(xiàn)方法3、 掌握子程序

28、設(shè)計(jì)方法【實(shí)驗(yàn)步驟】同實(shí)驗(yàn)一實(shí)驗(yàn)九 字符串排序(選做)【實(shí)驗(yàn)題目】字符串排序【實(shí)驗(yàn)內(nèi)容】從鍵盤上最多輸入20個(gè)字符串,每個(gè)字符串長度不超過10個(gè)字符,輸入完成后,按字母的降序排序【實(shí)驗(yàn)?zāi)康摹?、 掌握輸入字符串的DOS功能調(diào)用5、 進(jìn)一步掌握串比較指令的使用6、 掌握子程序設(shè)計(jì)方法【實(shí)驗(yàn)步驟】同實(shí)驗(yàn)一第四部分 匯編語言實(shí)驗(yàn)參考代碼實(shí)驗(yàn)一 輸出字符串data segment string db This is my first ASM programme.,13,10,$data endscode segmentmain proc farassume cs:code,ds:datastart:

29、push dssub ax,axpush axmov ax,datamov ds,ax lea dx,stringmov ah,9int 21hretmain endpcode ends end start實(shí)驗(yàn)二 算術(shù)指令綜合編程data segmentw dw ?x dw ?y dw ?z dw ?,?data endscode segmentmain proc farassume ds:data,cs:codepush dsxor ax,axpush axmov ax,datamov ds,axMOV AX,WSUB AX,XCWDMOV BX,5IDIV BXIMUL Y;AX與Y相乘,

30、乘積存入DX:AXSHL AX,1RCL DX,1;雙字(DX:AX)乘以2MOV Z,AXMOV Z+2,DXRetMain endpCode endsEnd main實(shí)驗(yàn)三 查找子字符串;Search key word in a stringdata segmentstring db Now you seekey db sEen1 equ key-string;n1 is the length of stringn2 equ $-key;n2 is the length of keycount equ n1-n2+1;count得到總共需要查找的最大次數(shù)match db Match,13,

31、10,$nomatch db No Match,13,10,$data endscode segmentassume cs:code,ds:data,es:datamain proc farpush dsxor ax,axpush axmov ax,datamov ds,axmov es,axmov cx,countlea bx,stringnext:mov di,bxinc bxpush cxlea si,keymov cx,n2cldrepz cmpsbjz findpop cxloop next; display no match infolea dx,nomatchmov ah,9in

32、t 21hret; display match infofind:pop cxlea dx,matchmov ah,9int 21hret main endpcode endsend main實(shí)驗(yàn)四 信息檢索;每條信息的長度相同data segmentmsg0 db I like my computer msg1 db 8086 programming is fun msg2 db Time to buy more diskettes msg3 db This program works fine msg4 db Turn off that redio msg5 db I have more

33、memory than you msg6 db My CPU is pentium 4 msg7 db The PSP can be useful msg8 db Assembly language can work fine with hardware msg9 db Sumsung displayer str db 13,10,55 dup (?),13,10,$err db 13,10,Input error!,13,10,$data endscode segmentassume cs:code,ds:data,es:datamain proc farstart:push dsxor a

34、x,axpush axmov ax,datamov ds,axmov es,axmov cx,55lea di,str+2lea si,msg0mov ah,1int 21hcmp al,30hjc errorcmp al,39hja errorand al,0fhmov bl,55mul bladd si,axcld rep movsblea dx,strmov ah,9int 21h jmp exit error:lea dx,errmov ah,9int 21hexit: retmain endpcode endsend main;每條信息的長度不相同data segmentmsg0 d

35、b 13,10,I like my computer,13,10,$msg1 db 13,10,8086 programming is fun,13,10,$msg2 db 13,10,Time to buy more diskettes,13,10,$msg3 db 13,10,This program works fine,13,10,$msg4 db 13,10,Turn off that redio,13,10,$msg5 db 13,10,I have more memory than you,13,10,$msg6 db 13,10,My CPU is pentium 4,13,1

36、0,$msg7 db 13,10,The PSP can be useful,13,10,$msg8 db 13,10,Assembly language can work fine with hardware,13,10,$msg9 db 13,10,Sumsung displayer,13,10,$msgtable dw msg0,msg1,msg2,msg3,msg4,msg5,msg6,msg7,msg8,msg9err db 13,10,Input error!,13,10,$data endscode segmentassume cs:code,ds:datamain proc f

37、arstart:push dsxor ax,axpush axmov ax,datamov ds,axmov ah,1int 21hcmp al,30hjc errorcmp al,39hja errorand al,0fhcbwlea bx,msgtableshl ax,1add bx,axmov dx,bxmov ah,9int 21h jmp exit error:lea dx,errmov ah,9int 21hexit: retmain endpcode endsend main實(shí)驗(yàn)五 格式化輸出;display ascii chars in 15*16 formatcode seg

38、mentassume cs:codemain proc farpush dsxor ax,axpush axmov ah,2mov dl,10hmov cx,15row:push cxmov cx,16col:int 21hpush dxmov dl,0int 21hpop dxinc dlloop colpush dxmov dl,13int 21hmov dl,10int 21hpop dxpop cxloop rowretmain endpcode endsend main實(shí)驗(yàn)六 數(shù)組合并data segmenta dw 1,3,5,7,9,17,21,55,60,76na equ ($

39、-a)/2b dw 2,4,6,8,10,11,13,14,15,16,90nb equ ($-b)/2n equ na+nbc dw n dup(?)data endscode segmentmain proc farassume cs:code,ds:datastart:push dsxor ax,axpush axmov ax,datamov ds,axmov si,0mov di,0mov bx,0mov cx,ncontinue:mov ax,asimov dx,bdicmp ax,dxjl nextmov cbx,dxadd bx,2dec cxadd di,2cmp di,nb*

40、2je sitobxjne continuenext:mov cbx,axadd bx,2dec cxadd si,2cmp si,na*2je ditobxjne continuesitobx:mov ax,asimov cbx,axadd si,2add bx,2loop sitobx jmp outputditobx:mov ax,bdimov cbx,axadd di,2add bx,2loop ditobxoutput: mov si,0 mov cx,nagain: mov ax,csi aam ;this instruction is equal to the following

41、 three instructions ;mov bl,10 ;div bl ;xchg al,ah add ax,3030h push ax mov dl,ah mov ah,2 int 21h pop ax mov dl,al mov ah,2 int 21h mov dl,0 mov ah,2 int 21h add si,2 loop again retmain endpcode endsend start實(shí)驗(yàn)七 字符統(tǒng)計(jì)data segment prompt db Please enter a string, including any char.,13,10,$ string db

42、 25,?,25 dup(?) string1 db 13,10,Number of other char:,$ string2 db 13,10,Number of english char:,$ string3 db 13,10,Number of digital char:,$ address dw string1 dw string2 dw string3 ;string address table a db 0 ;other char b db 0;english char c db 0;digital chardata endscode segmentmain proc far a

43、ssume cs:code,ds:datastart: push ds sub ax,ax push ax mov ax,data mov ds,ax lea dx,prompt mov ah,9 int 21h mov ah,0ah lea dx,string int 21h ;enter string from keyboard mov si,2 ;offset of string mov cl,string+1 xor ch,ch;cx=actual length of string begin: cmp stringsi,z ja others cmp stringsi,a jnb w

44、ords cmp stringsi,Z ja others cmp stringsi,A jnb words cmp stringsi,9 ja others cmp stringsi,0 jnb number jmp others others: inc a jmp next words: inc b jmp next number: inc c jmp next next: inc siloop begin ;following display on the screenlea si,a lea bx,address mov di,3 ;display number of char,dig

45、ital and other char respectivelycontinue: mov dx,bx ;output string1string3 respectivelymov ah,9int 21hmov al,sicbwmov cl,10div cladd ax,3030hpush axmov dl,almov ah,2int 21hpop axmov dl,ahmov ah,2int 21hinc si add bx,2 dec dijnz continueret main endp code ends end start實(shí)驗(yàn)八 數(shù)制轉(zhuǎn)換方式1:不帶用戶交互功能code segmen

46、tassume cs:codemain proc farrepeat:call decibincall crlfcall binioctcall crlfjmp repeatmain endpdecibin proc nearmov bx,0newchar:mov ah,1int 21hsub al,30hjl exitcmp al,09hjg exitcbwxchg ax,bxmov cx,10dmul cxxchg ax,bxadd bx,axjmp newcharexit:retdecibin endpbinioct proc nearmov dl,0shl bx,1jnc printi

47、nc dlprint:mov ah,2int 21hmov cx,5next:push cxmov cl,3rol bx,clmov dl,bl and dl,07hadd dl,30hmov ah,2int 21hpop cxloop nextretbinioct endpcrlf proc nearmov dl,0dhmov ah,2int 21hmov dl,0ah mov ah,2int 21hretcrlf endpcode endsend main方式2:帶用戶交互功能data segmenta db Please input a decimal number0,65535:,$b db The octadic number of the decimal is:,$s db Do you want to continue? Y/N

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論