桂電匯編實驗報告_第1頁
桂電匯編實驗報告_第2頁
桂電匯編實驗報告_第3頁
桂電匯編實驗報告_第4頁
桂電匯編實驗報告_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

實驗報告實驗名稱匯編語言程序設(shè)計||實驗一匯編語言上機過程和Debug常用調(diào)試命令一、實驗?zāi)康膶W(xué)習(xí)程序設(shè)計的基本方法和技能,熟練掌握用匯編語言設(shè)計、編寫、調(diào)試和運行程序的方法。二、實驗題目熟悉與實驗有關(guān)的系統(tǒng)軟件(如編輯程序、匯編程序、連接程序和調(diào)試程序等)的使用方法。在調(diào)試過程中,學(xué)習(xí)及掌握debug程序的各種操作命令。三、問題描述試編寫一程序:比較兩個字符串string1和string2所含的字符是否相同,若相同則顯示‘match’;否則,顯示‘nomatch’。四、方法說明使用ws、tc或EDIT編輯程序來建立源文件,然后存盤,使系統(tǒng)返回DOS。用匯編程序masm(或asm)對源文件匯編產(chǎn)生目標文件obj如:匯編指示出錯則需重新調(diào)用編輯程序修改錯誤,直至匯編通過為止。用連接程序link產(chǎn)生執(zhí)行文件EXE.執(zhí)行程序,可直接從DOS執(zhí)行程序。使用debug程序調(diào)試程序的方法。五、實驗步驟調(diào)用字處理程序EDIT建立以sample.asm文件datareasegmentstring1db‘movethecursorbackward.’string2db‘movethecursorbackward.’mess1db‘Match..’,13,10,’$’mess2db‘Nomatch!..’,13,10,’$’datareaendsprognamsegmentmainprocfarassumecs:prognam,ds:datarea,es:datareastart:pushdssubax,axpushaxmovax,datareamovds,axmoves,axleasi,string1leadi,string2cldmovcx,25repzcmpsbjzmatchleadx,mess2jmpshortdispmatch:leadx,mess1disp:movah,09int21hretmainendpprognamendsendstart對源文件匯編產(chǎn)生目標文件objD:\masm文件名。Asm3.用連接程序link產(chǎn)生執(zhí)行文件exeD:\link文件名。Obj4.執(zhí)行程序D:\文件名5.使用debug程序調(diào)試程序的方法。d>debug文件名.exe_用G命令運行程序用U命令顯示程序?qū)W會設(shè)置斷點。學(xué)會查看數(shù)據(jù)段的內(nèi)容情況d用E命令修改數(shù)據(jù)區(qū)的字符串。用A命令把數(shù)據(jù)區(qū)的內(nèi)容恢復(fù)原狀T命令逐條跟蹤程序的執(zhí)行學(xué)會使用F命令、R命令、Q命令等等實驗二循環(huán)程序設(shè)計1循環(huán)結(jié)構(gòu)是控制重復(fù)執(zhí)行某一程序段的基本程序結(jié)構(gòu).在匯編語言程序設(shè)計中,循環(huán)程序的地位也是極為重要,從本質(zhì)上來看,循環(huán)程序結(jié)構(gòu)是分支程序結(jié)構(gòu)的一種手特殊形式,也是使用條件轉(zhuǎn)移指令來控制執(zhí)行循環(huán)的.一、實驗?zāi)康膶W(xué)會用循環(huán)結(jié)構(gòu)進行程序編程。二、實驗題目設(shè)計一個按表格形式顯示ASC||碼為10H—100H的所有字符的程序。三、實驗要求按15行*16列的表格形式顯示ASC||碼為10H----100H的所有字符,即以行為主的順序及ASC||碼遞增的次序依次顯示對應(yīng)的字符。每16個字符為一行,每行中的相鄰兩個字符之間用空白符(ASC||為0)隔開。四、方法說明(1)顯示每個字符可使用功能號為02的顯示輸出功能調(diào)用,使用方法如下:movah,02hmovdl,輸出字符的ASC||碼int21h本題中可把dl初始化為10H,然后不斷使其加1(用INC指令)以取得下一個字符的ASC||碼。(2)顯示空白符時,用其ASC||碼0置入dl寄存器,每行結(jié)束時,用顯示回車(ASC||為0dh)和換行符(ASC||為oah)來結(jié)束本行并開始下一行。(3)由于逐個顯示相繼的ASC||字符時,需要保存并不斷修改dl寄存器的內(nèi)容,而顯示空白、回車、換行符時也需要使用dl寄存器,為此可使用堆棧來保存相繼的ASC||字符。具體用法是:在顯示空白或回車,換行符前用指令pushdx把dl的內(nèi)容保存到堆棧中去。在顯示空白或回車,換行符后用指令popdx恢復(fù)dl寄存器的原始內(nèi)容。五、實驗代碼codesegmentassumecs:codestart:movbx,15;外循環(huán)次數(shù)movcx,16;內(nèi)循環(huán)movdx,10h;10h是待顯示的第一個字符Lop:movah,02h;輸出單個字符int21h;中斷incdx;下一個pushdxmovdx,20h;空格movah,2int21hpopdxLoopLopLop1:pushdx;循環(huán)16次后,把最后的數(shù)送入堆棧段movdx,0dh;輸出回車鍵int21hmovdx,0ah;輸出換行符int21hmovcx,16;重新定義內(nèi)循環(huán)次數(shù)popdxdecbx;bx-1cmpbx,0;decbxjneLop;沒有完成外循環(huán)時進入lopmovah,4chint21hcodeendsendstart實驗三循環(huán)程序設(shè)計2一、實驗?zāi)康膶W(xué)會用循環(huán)程序設(shè)計進行程序編程。二、實驗題目設(shè)計查找匹配字符串SEARCH的程序。三、問題要求程序接收用戶鍵入的一個關(guān)鍵字以及一個句子。如果句子中不包含關(guān)鍵字則顯示’nomatch’;如果句子中包含關(guān)鍵字則顯示‘match’,且把該字在句子中的位置用十六進制數(shù)顯示出來,要求程序的執(zhí)行過程如下:enterkeyword:abcentersentence:wearestudyingabcmatchatlocation:11Hofthesentenceentersentence:xyz,ok?nomatchentersentence:^c四、方法說明程序可由三部分組成:(1)輸入關(guān)鍵字和一個句子,分別存入相應(yīng)的緩沖區(qū)中,可用功能調(diào)用0AH。在句子中查找關(guān)鍵字。關(guān)鍵字和一個句子中相應(yīng)字段的比較可使用串比較指令,為此必須定義附加段,但附加段和數(shù)據(jù)段可以定義為同一段,以便于串指令的使用,這樣,相應(yīng)的寄存器內(nèi)容也有了確定的含義,如下:SI寄存器為關(guān)鍵字的指針DI寄存器為句子中正相比較的字段的指針CX寄存器存放關(guān)鍵字的字母個數(shù)(長度)整個句子和關(guān)鍵字的比較過程可以用一個循環(huán)結(jié)構(gòu)來完成。循環(huán)次數(shù)為:(句子長度--關(guān)鍵字長度)+1在計算循環(huán)次數(shù)時,如遇到句子長度小于關(guān)鍵字長度的情況則應(yīng)轉(zhuǎn)向顯示“nomatch”,循環(huán)中還需要用到BX寄存器,它用來保存句子中當前正在比較字段的首地址。輸出信息:用功能調(diào)用09h分“找到”或“找不到”兩種情況分別顯示不同的信息。在“找到”時,還要求顯示出匹配字符串在句子中的位置,在“找到”時BX寄存器的內(nèi)容為匹配字符串的首地址,將此值減到句子的首地址,再將差值加1即是所要的匹配字符串在句子中的位置,可將位置轉(zhuǎn)換為十六進制數(shù)從屏幕上顯示出來。五、實驗代碼ssegsegmentstackdw256dup(?)ssegendsdatasegmentmsg1db'Enterkeyword:',24hmsg2db'EnterSentence:',24hcrdb13,10,24hkeyworddb250,?,250dup(?)Sentencedb250,?,250dup(?)matchdb'Matchatlocation:',24hmatch1db'ofthesentence',13,10,24hnomatchdb'Nomatch',13,10,24hdataendscodesegmentassumecs:code,ds:data,ss:ssegdisp_hexprocnearpushaxpushcxpushdxpushaxmovcl,4roral,clandal,0fhaddal,30hcmpal,39hjnad1addal,7d1:movdl,almovah,2int21hpopaxandal,0fhaddal,30hcmpal,39hjnad2addal,7d2:movdl,almovah,2int21hmovdl,'h'movah,2int21hpopdxpopcxpopaxretdisp_hexendpbegin:movax,datamovds,axmoves,axmovdx,offsetmsg1movah,9int21hmovdx,offsetkeywordmovah,0ahint21hcmpkeyword+1,0jequitmovdx,offsetcrmovah,9int21hb1:movdx,offsetmsg2movah,9int21hmovdx,offsetSentencemovah,0ahint21hmovdx,offsetcrmovah,9int21hmovdl,Sentence+1cmpdl,0jequitmovdh,keyword+1movdi,offsetSentence+2b2:cmpdh,dlja_nomatchmovsi,offsetkeyword+2movcl,dhmovch,0cldpushdirepecmpsbpopdije_matchincdidecdljmpb2_match:movax,disubax,offsetSentence+2incaxpushaxmovdx,offsetmatchmovah,9int21hpopaxcalldisp_hexmovdx,offsetmatch1movah,9int21hjmpb1_nomatch:movdx,offsetnomatchmovah,9int21hjmpb1quit:movah,4chint21hcodeendsendbegin實驗四分支程序設(shè)計在實際應(yīng)用的程序中,通常遇到根據(jù)某一條件是否成立來進行邏輯判斷,以便確定程序的下一步執(zhí)行,這就形成了分支結(jié)構(gòu)程序,在匯編語言程序設(shè)計中,分支結(jié)構(gòu)程序設(shè)計是一種很重要的程序設(shè)計方法.一、實驗?zāi)康膶W(xué)會用分支程序設(shè)計進行程序編程。二、實驗題目設(shè)計一個程序能分類統(tǒng)計字符個數(shù)三、實驗要求程序接收用戶鍵入的一行字符(字符個數(shù)不超過80個,該字符串用回車符結(jié)束),并按字母、數(shù)字及其它字符分類計數(shù),然后將結(jié)果存入以letter、digit和other為名的存儲單元中。四、方法說明程序可采用0AH功能調(diào)用把鍵入字符直接送到緩沖區(qū)中,然后再逐個取出分類計數(shù),也可采用01H功能調(diào)用在接收字符后先分類計數(shù)然后再存入緩沖區(qū)中。程序需進入debug運行并查看計數(shù)結(jié)果。五、實驗代碼datasegmentletterdb0digitdb0otherdb0dataendscodesegmentmainprocfarassumecs:code,ds:datastart:movletter,0movdigit,0movother,0input:movah,01hint21hcmpal,0dhjzexitcmpal,'a'jbokcmpal,'z'jaothdkh:incletterjmpinputok:cmpal,'A'jbhellocmpal,'Z'jbdkhjaothhello:cmpal,'0'jbothcmpal,'9'jaothincdigitjmpinputoth:incotherjmpinputexit:movah,4chint21hmainendpcodeendsendstart

實驗五子程序設(shè)計子程序(過程)是程序設(shè)計中常用的方法.子程序結(jié)構(gòu)是模塊化程序設(shè)計的重要工具。設(shè)計子程序主要考慮參數(shù)傳遞的方法,參數(shù)傳遞是主程序和子程序之間的接口。一、實驗?zāi)康膶W(xué)會用子程序設(shè)計進行程序編程。二、實驗題目設(shè)計一個能查找電話號碼phone的程序。三、實驗要求要求程序建立一個可存放50項的電話號碼表,每項包括人名(20個字符)及電話號碼(8個字符)兩部分;程序可接收輸入人名及相應(yīng)的電話號碼,并把它們加入電話號碼表中;凡有新的輸入后,程序應(yīng)按人名對電話號碼表重新排序;程序可接收需要查找電話號碼的人名,并從電話號碼表中查出其電話號碼,再在屏幕上以如下格式顯示出來。nametel********四、實驗提示程序采用子程序結(jié)構(gòu),主程序的主要部分如下:.顯示提示符‘inputname:’;.調(diào)用子程序input_name接收人名;.調(diào)用子程序stor_name把人名存入電話號碼表tel_tab中;.顯示提示符‘inputatelephonenumber:’;.調(diào)用子程序inphone接收電話號碼,并把它存入電話號碼表tel_tab中;.如輸入已結(jié)束則調(diào)用name_sort子程序?qū)﹄娫捥柎a表按人名排序;.顯示提示符‘DOyouwantatelephonenumber?(y/n)’;.回答N則退出程序;.回答Y則再顯示提示符‘name?’;.調(diào)用子程序input_name接收人名;.調(diào)用子程序name_search在電話號碼表中查找所要的電話號碼;.調(diào)用子程序printline按要求格式顯示人名及電話號碼;.重復(fù)查號提示符直至用戶不再要求查號為止。五:實驗代碼data segmenttel_tab db 50dup(28dup('')) ;tel_tab電話本空間tab_len dw 0 ;已存聯(lián)系人數(shù)目endaddr dw 0 ;最后一個聯(lián)系人的地址+28tname db 21,?,20dup(''),? ;姓名緩沖區(qū)tphone db 9,?,8dup(''),? ;號碼緩沖區(qū)temp db 28dup(?) ;一個聯(lián)系人的臨時空間iname db 13,10,'Inputname:',13,10,'$' iphone db 13,10,'Inputatelephonenumber:',13,10,'$' go_on db 13,10,'Continueinsert?<Y/N>',13,10,'$';提示是否繼續(xù)插入聯(lián)系人sname db 13,10,'Name?',13,10,'$' name_e db 13,10,13,10,'Thenamehasbeeninthetable!Pleaseinputagain!',13,10,'$'text2 db 13,10,'NameTel.',13,10,'$'text3 db 13,10,'Thenameisnotinthetelephonetable!',13,10,'$'text4 db 13,10,13,10,'Doyouwantatelephonenumber?<Y/N>',13,10,'$'data endscode segment;****************************************************************************;主程序;-------------------------------------------------------------------------------------main proc far assume cs:code,ds:data,es:datastart: push ds ;保存舊數(shù)據(jù)用于返回 sub ax,ax push ax mov ax,data ;數(shù)據(jù)段、附加段初始化 mov ds,ax mov es,ax inname: lea dx,iname ;提示輸入姓名 mov ah,09h int 21h call input_name ;調(diào)用讀入姓名子程序 call name_search ;調(diào)用查找子程序, cmp bx,-1 ;如表中不存在該聯(lián)系人 je stor ;則跳轉(zhuǎn)到stor call crlf ;回車換行 lea dx,name_e ;否則提示該聯(lián)系人已在表中,提示重新輸入 mov ah,09h int 21h jmp inname stor: call stor_name ;調(diào)用姓名轉(zhuǎn)存子程序,把姓名移動到表中 lea dx,iphone ;提示輸入電話號碼 mov ah,09h int 21h call inphone ;調(diào)用讀入號碼子程序 call name_sort ;排序 call crlf lea dx,go_on ;提示是否繼續(xù)插入 mov ah,09h int 21h choice1: mov ah,07 ;讀取用戶選擇 int 21h cmp al,'y' je inname cmp al,'Y' je inname cmp al,'n' je print_all ;如選擇不插入,則顯示所有記錄 cmp al,'N' je print_all jmp choice1 print_all: call printall ;顯示所有記錄 want_search: call crlf lea dx,text4 ;提示是否查找號碼 mov ah,09 int 21h call crlf choice2: mov ah,07 ;讀取用戶選擇 int 21h cmp al,'y' je search ;如果為y或Y則跳轉(zhuǎn)到查找search cmp al,'Y' je search cmp al,'n' ;為n或N則退出程序 je exit_m cmp al,'N' je exit_m jmp choice2 search: lea dx,sname ;提示用戶輸入要查找的姓名 mov ah,09 int 21h call input_name ;讀入姓名 call name_search ;查找 call crlf call crlf cmp bx,-1 ;是否查找到? je not_find ;(bx)=1則跳轉(zhuǎn)到未找到not_find lea dx,text2 ;找到則輸出'NameTel.' mov ah,09 int 21h call printline ;顯示查找到的聯(lián)系人 jmp want_search ;跳轉(zhuǎn)到提示查找not_find: ;未找到 call crlf lea dx,text3 ;輸出'Thenameisnotinthetelephonetable!' mov ah,09h int 21h jmp want_search exit_m: retprintall proc near;**************************************************************************;顯示所有電話。顯示電話表中的所有姓名和號碼,查看排序結(jié)果是否正確;---------------------------------------------------------------------------------------------- call crlf call crlf lea dx,text2 ;輸出'NameTel.' mov ah,09 int 21h lea bx,tel_tab ;號碼表基址rept1: call printline ;顯示聯(lián)系人 add bx,28 ;求下一個聯(lián)系人首地址 cmp bx,endaddr ;是否到達表尾? jb rept1 ;未到達則繼續(xù)顯示 retprintall endp ;*******************************************************************;輸入姓名子程序:讀入姓名到tname緩沖區(qū),并把不滿20位的部分;補上空格(方便查找時的比較);---------------------------------------------------------------------------------- input_name proc near call crlfnoinputn: lea dx,tname ;姓名緩沖區(qū) mov ah,0ah ;調(diào)用dos0ah讀入字符串功能 int 21h cmp tname[1],0 ;如果輸入為回車 je noinputn ;繼續(xù)等待輸入 xor bx,bx mov bl,tname[1] mov cx,20 sub cx,bx set_blank: mov tname[bx+2],20h ;把不滿20位的部分補空格 inc bx loop set_blank call crlf retinput_name endp;*****************************************************************;stor_name,該子程序把tname緩沖區(qū)的姓名轉(zhuǎn)存入號碼表中;---------------------------------------------------------------------------------stor_name proc near xor cx,cx mov cl,tname[1] ;字符個數(shù) lea si,tname[2] mov di,endaddr cld rep movsb inc tab_len ;聯(lián)系人人數(shù)增1 add endaddr,28 ;最后一個聯(lián)系人地址增28 retstor_name endp;***************************************************************;獲取號碼子程序:讀入用戶輸入的號碼到tphone緩沖區(qū),然后;轉(zhuǎn)存入號碼表對應(yīng)位置;------------------------------------------------------------------------------------inphone proc nearnoinputp: call crlf lea dx,tphone mov ah,0ah int 21h ;調(diào)用dos0a號功能輸入字符串 cmp tphone[1],0 ;判斷輸入是否為回車 je noinputp ;是,則繼續(xù)等待輸入 xor cx,cx mov cl,tphone[1] lea si,tphone[2] mov di,endaddr sub di,8 ;待插入位置 cld rep movsb ;移動 ret inphone endp;**********************************************************************;排序子程序(用直接插入排序),對號碼表進行按人名從小到大排序;--------------------------------------------------------------------------------------------------name_sort proc near cmp [tab_len],1 ;記錄數(shù)1,不用排序 je exitn lea di,tel_tab ;第一個記錄地址 mov si,endaddr sub si,28 ;最后一個記錄-待排序記錄的地址next1: mov cx,20 mov ax,si ;暫存兩個地址 mov dx,di cld repe cmpsb ;查找插入位置 jb insert mov si,ax mov di,dx add di,28 ;比較下一個 cmp di,si ;是否比較完 jb next1 ;沒有則繼續(xù)比較 jmp exitn ;否則排序完成insert: mov cx,28 mov si,ax lea di,temp rep movsb ;待排序數(shù)據(jù)放到緩沖區(qū) mov di,axnext2: mov cx,28 mov si,di sub si,28 rep movsb ;記錄后移 sub di,56 cmp di,dx ja next2 mov cx,28 mov di,dx lea si,temp rep movsb ;插入到待插位置exitn: ret name_sort endp;******************************************************************************;姓名查找子程序。入口參數(shù)為tname緩沖區(qū)的人名,用寄存器bx返回結(jié)果,找到則返回該;

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論