華北電力大學匯編實驗報告2_第1頁
華北電力大學匯編實驗報告2_第2頁
華北電力大學匯編實驗報告2_第3頁
華北電力大學匯編實驗報告2_第4頁
華北電力大學匯編實驗報告2_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、華北電力大學實 驗 報 告| 實驗名稱 匯編語言程序設計實驗 課程名稱 IBM-PC匯編語言程序設計 | 專業(yè)班級: 學生姓名: 學 號: 成 績:指導教師: 實驗日期 華 北 電 力 大 學 實 驗 報 告實驗一 用表格形式顯示字符一、 實驗要求按15*16列的表格形式顯示ASC碼為10H100H的所有字符,即以行為主的順序及ASC碼遞增的次序依次顯示對應的字符。每16個字符為一行,每行中的相鄰兩個字符之間用空白符隔開。二、 設計說明(1) 顯示每個字符可使用功能號為02的顯示輸出功能調用: Mov ah,02h Mov dl,輸出字符的ASC碼 Int 21h 將dl初始化為10H,然后使

2、用其加1以取得下一個字符的ASC碼。(2) 顯示空白符是,用其ASC碼置0入dl寄存器。每行結束時,用回車和換行來結束本行并開始下一行。(3) 由于逐個顯示相繼的ASC碼字符是,需要不斷修改dl寄存器的內容,而顯示空白、回車、換行也需要使用dl寄存器,為此可使用堆棧保存dx。三、 實驗程序及調試結果CODES SEGMENT;*main proc far ASSUME CS:CODESSTART: push ds sub ax,ax push ax mov di,15 mov dl,10hloo: mov cx,16next: mov ah,02h int 21h inc dl push dx

3、 mov dl,0 mov ah,02h int 21h pop dx loop next push dx mov dl,0dh mov ah,02h int 21h mov dl,0ah mov ah,02h int 21h pop dx dec di jne loo je exit exit: ret main endp CODES ENDS END START實驗二 查找匹配字符串一、 實驗要求程序接受用戶鍵入的一個關鍵字以及一個句子,如果句子中不包含關鍵字則顯示“No match!”;如果句子中包含關鍵字則顯示“match!”,且把該字在句子中的位置用十六進制數顯示出來。要求程序的執(zhí)行

4、過程如下:Enter keyword:abcEnter sentence:we are studying abcMatch at location:11H of the sentenceEnter sentence:xyzNo match!Enter sentence:二、 設計說明程序由三部分組成:(1) 輸入關鍵字和一個句子,分別存入相應的緩沖區(qū)中。(2) 在句子中查找關鍵字(3) 輸出信息。用功能調用09h分找到和未找到兩種情況分別顯示不同的信息。在“找到”時,顯示關鍵字在字符串中位置。三、 使用說明根據提示輸入關鍵字和句子,按回車鍵結束輸入。程序將顯示字符串中是否含有關鍵字,有則提示m

5、atch并顯示關鍵字位置,無則提示no match。四、 實驗程序DATAS SEGMENT para 'data' mess1 db 'match!',13,10,'$' mess2 db 'no match!',13,10,'$' mess3 db 'enter keyword:','$' mess4 db 'enter sentence:','$' mess5 db 'match at location:','$'

6、 mess6 db ' H of the sentence','$' stoknim label byte max db 10 act db ? stokn db 10 dup(?) sentence label byte ma db 100 ac db ? sto db 100 dup(?)DATAS ENDSSTACKS SEGMENT ;此處輸入堆棧段代碼STACKS ENDS;*CODES SEGMENT para 'code' ASSUME CS:CODES,DS:DATAS,es:datasmain proc farSTART: pu

7、sh ds sub ax,ax push ax MOV AX,DATAS MOV DS,AX mov es,ax;*輸入關鍵字和一個句子*k: lea dx,mess3 mov ah,09 int 21h ; 顯示字符串enter word lea dx,stoknim mov ah,0ah int 21h ;輸入關鍵字到緩沖區(qū)Word push dx mov dl,0dh mov ah,02h int 21h mov dl,0ah mov ah,02h int 21h ;回車換行 pop dxd: lea dx,mess4 mov ah,09 int 21h ;顯示字符串enter sent

8、ence lea dx,sentence mov ah,0ah int 21h ;輸入句子到緩沖區(qū)sentence push dx mov dl,0dh mov ah,02h int 21h mov dl,0ah mov ah,02h int 21h ;回車換行 pop dx;*比較查找信息* lea si,stoknim ;si指向關鍵字 lea di,sentence ;di指向句子 mov ax,0 mov bl,1 ;初始化bx mov cl,0 ;初始化外循環(huán)計數單元 mov al,act mov ah,ac sub ah,al add ah,1 mov cl,ah ;cl中循環(huán)次數

9、 cmp cl,0 je nomatcha: push cx mov cl,al repnz cmpsb jz match sub di,1 sub si,2 add bl,1 pop cx dec cl cmp cl,0 jne a je nomatch;*輸出信息*match: lea dx,mess1 mov ah,09h int 21h ;顯示match push dx mov dl,0dh mov ah,02h int 21h mov dl,0ah mov ah,02h int 21h ;回車換行 pop dx lea dx,mess5 mov ah,09h int 21h ;顯示m

10、atch at location mov al,bl and al,0fh add al,30h cmp al,3ah jl p add al,7h p: mov dl,al mov ah,02h int 21h lea dx,mess6 mov ah,09h int 21h push dx mov dl,0dh mov ah,02h int 21h mov dl,0ah mov ah,02h int 21h ;回車換行 pop dx jmp wernomatch: lea dx,mess2 mov ah,09h int 21h ;顯示no match push dx mov dl,0dh m

11、ov ah,02h int 21h mov dl,0ah mov ah,02h int 21h ;回車換行 pop dxwer: jmp d main endpCODES ENDS END START五、 程序框圖實驗三 分類統(tǒng)計字符個數一、 實驗要求程序接受用戶鍵入一行字符(字符個數不超過80個,該字符串用回車符結束),并按字母、數字、其它字符分類計數,然后將結果存入以letter、digit和other為名的存儲單元中。二、 設計說明(1) 程序可采用01H功能調用把鍵入字符先分類計數再存入緩沖區(qū)中。(2) 程序進入debug運行并查看計數結果。三、 實驗程序datarea segment

12、tou db 'enter word ',13,10,'$'letter db 'letter:','$'number db 'number:','$'other db 'other:','$'datarea ends;*codes segmentmain proc farassume cs:codes,ds:datareastart:push dssub ax,axpush axmov ax,datareamov ds,ax mov bx,0 mov cx,0 mo

13、v di,0 lea dx,tou mov ah,09h int 21h input: mov ah,1 int 21h cmp al,0dh je disp cmp al,30h jae n1 o: inc di jmp short inputn1: cmp al,39h ja n2 inc cx jmp short inputn2: cmp al,41h jae n3 jmp on3: cmp al,5ah ja n4 inc bx jmp short input n4: cmp al,61h jae n5 jmp short on5: cmp al,7ah ja short o inc

14、bx jmp short input disp: push ax mov dl,0dh mov ah,09h int 21h mov dl,0ah mov ah,09h int 21h pop ax lea dx,letter push ax mov ah,09h int 21h pop ax call binihex push ax mov dl,0dh mov ah,09h int 21h mov dl,0ah mov ah,09h int 21h pop ax lea dx,number push ax mov ah,09h int 21h pop ax mov bx,cx call b

15、inihex push ax mov dl,0dh mov ah,09h int 21h mov dl,0ah mov ah,09h int 21h pop ax lea dx,other mov ah,09h int 21h mov bx,di call binihex push ax mov dl,0dh mov ah,09h int 21h mov dl,0ah mov ah,09h int 21h pop axretmain endp;*binihex proc near push cx push ax push dx mov ch,4rotate: mov cl,4 rol bx,c

16、l mov dl,bl and dl,0fh add dl,30h cmp dl,3ah jl printin add dl,07hprintin: mov ah,02h int 21h dec ch jnz rotate pop dx pop ax pop cx retbinihex endpcodes endsend start四、 使用說明程序進入后提示輸入字符,可以輸入任意字符,輸入完成后鍵入回車鍵表示完成,則會在下一行輸出實驗結果。五、 程序框圖實驗四 查找電話號碼一、 實驗要求(1) 要求程序建立一個可存放50項的電話號碼表,每項包括人名及電話號碼兩部分;(2) 程序可接受輸入人名

17、及相應的電話號碼,并把它們加入電話號碼表中;(3) 凡有新的輸入后,程序可按人名對電話號碼表重新排序;(4) 程序可接受需要查詢電話號碼的人名,并從電話號碼表中查出其電話號碼,再在屏幕上以如下格式顯示出來。 Name tel ×××× ××××二、 設計說明(1)顯示提示符 Input name:; (2)調用子程序 input_name 接收人名; (3)調用子程序 stor_name 把人名存入電話號碼表 tel_tab 中:(4)顯示提示符 Input a telephone number:;(5)調用子程序

18、 inphone 接收電話號碼,并把它存入電話號碼表tel_tab中;(6)如輸入已結束則調用 name_sort 子程序對電話號碼表接人名排序; (7)顯示提示符 Do you want a telephone number ?(Y/N);(8)回答N收退出程序; (9)回答Y則再顯示提示符 name ?;(10)調用子程序 input_name接收人名;(11)調用子程序 name_search 在電話號碼表中查找所要的電話號碼; (12)調用子程序 printline 按要求格式顯示人名及電話號碼; (13)重復查號提示符直至用戶不要求查號為止。三、 實驗程序dataseg segmen

19、t namepar label byte maxnlen db 21 actnlen db ? _name db 21 dup(?) phonepar label byte maxplen db 9 actplen db ? phone db 9 dup(?) crlf db 13,10,'$' endaddr dw ? mess1 db 'enter name:','$' mess2 db 'enter a telephone number:','$' mess3 db 'Do you want a te

20、lephone number?(Y/N)','$' mess4 db 'name?','$' mess5 db 'name',16 dup(' '),'tel',0dh,0ah,'$' mess6 db 'Not in the table.',0dh,0ah,'$' mess7 db 'Invalid input!',0dh,0ah,'$' count db 0 tel_tab db 50 dup(20 dup(

21、' '),8 dup(' ') temp db 20 dup(' '),8 dup(' '),0dh,0ah,'$' swapped db 0dataseg ends;*codeseg segmentmain proc far assume cs:codeseg,ds:dataseg,es:datasegstart: push ds sub ax,ax push ax mov ax,dataseg mov ds,ax mov es,ax; cld lea di,tel_tab ;di中存放表首地址inputloop

22、: mov ah,09h lea dx,mess1 int 21h call input_name cmp actnlen,0 ;沒有輸入人名時 jz a1 ;直接跳到提示是否查找的地方 cmp count,50 ;輸入上限 je a1 call stor_name ;保存人名到tel_tab mov ah,09h lea dx,mess2 int 21h call input_stor_phone ;輸入并保存電話號碼 jmp inputloopa1: cmp count,1 jbe searchloop ;如果沒有輸入或者輸入一個 call name_sort ;排序 call disp_

23、all ;顯示所有searchloop: lea dx,mess3 mov ah,09h int 21h mov ah,01h int 21h cmp al,'N' je exit cmp al,'n' je exit cmp al,'Y' je showname cmp al,'y' je showname mov ah,09 lea dx,crlf int 21h lea dx,mess7 ;非法輸入 mov ah,09h int 21h jmp searchloopshowname: mov ah,09 lea dx,crl

24、f int 21h lea dx,mess4 ;當輸入Y時,顯示'name?' mov ah,09 int 21h call input_name ;輸入要查找的人名 call name_search ;查找 call printline jmp searchloop exit: ret main endp;*input_name proc near mov ah,0ah lea dx,namepar int 21h ;輸入名字 mov dl,0ah mov ah,02h int 21h ;換行 mov bh,0 ;bx高位置0 mov bl,actnlen ;bx低位置輸入名

25、字個數 mov cx,21 sub cx,bx ;計算剩下的長度i1: mov _namebx,20h inc bx loop i1 ;把bx之后剩下的填充空格 retinput_name endp ;*stor_name proc near inc count ;有人名輸入所以個數加1 cld lea si,_name ;把si指向剛才輸入名字的位置 mov cx,10 ;把name中的前20個字符放入tel_tab中每一個人信息的前20個byte中 rep movsw ;把si所指名字賦值給di所指地方tel_tab retstor_name endp ;* input_stor_phon

26、e proc near mov ah,0ah lea dx,phonepar int 21h ;把電話號碼存入phonrpar mov ah,02h mov dl,0ah ;換行 int 21h mov bh,0 mov bl,actplen mov cx,9 sub cx,bx ;計算剩下的長度s2: mov phonebx,20h ;剩下的地方填充空格 inc bx loop s2 cld lea si,phone ;再把名字放入之后di就已經移動到名字之后了 mov cx,4 ;把phone中的前8個字符放入tel_tab中每一個人信息的后8個byte中 rep movsw retinp

27、ut_stor_phone endp ;*name_sort proc near sub di,56 mov endaddr,din1: mov swapped,0 lea si,tel_tabn2: mov cx,20 mov di,si add di,28 ;下一個被比較的名字 mov ax,di mov bx,si repe cmpsb ;比較20次 jbe n3 ;小于或等于不用交換 call npxchgn3: mov si,ax cmp si,endaddr jbe n2 cmp swapped,0 jnz n1 ret name_sort endp;*npxchg proc ne

28、ar mov cx,14 ;交換名字和電話號碼 lea di,temp mov si,bx rep movsw ;move lower item to save mov cx,14 mov di,bx rep movsw mov cx,14 lea si,temp rep movsw mov swapped,1 ret npxchg endp;*disp_all proc near mov ah,09h lea dx,mess5 int 21h lea si,tel_tabd1: lea di,temp mov cx,14 rep movsw mov ah,09h lea dx,temp in

29、t 21h dec count jnz d1 ret disp_all endp ;*name_search proc near lea si,tel_tab mov bx,si add endaddr,28e1: lea di,_name ;存放待查找的人名地址 mov cx,10 repe cmpsw jcxz exit3 ;相等 add bx,28 ;表中下一個比較的人名 mov si,bx cmp si,endaddr jbe e1 mov cx,-1 retexit3: mov si,bx lea di,temp mov cx,14 rep movsw ret name_search

30、 endp ;*printline proc near cmp cx,-1 je norecord mov ah,09h lea dx,mess5 int 21h ;輸出name和tel mov ah,09h lea dx,temp int 21h ;輸出名字和電話號碼 retnorecord: mov ah,09h lea dx,mess6 int 21h ;輸出沒找到 retprintline endp ;* codeseg ends end start四、 使用說明根據提示輸入人名及電話號碼,使用回車鍵表示輸入結束,如不需輸入人名,則在提示后直接輸入回車鍵,表示輸入完成,程序將自動顯示電話號碼表。如需查詢則可輸入y(大小寫均可),否則輸入n(大小寫均可)。五、 模塊層次圖及說明(1) 主函數main:用來顯示用戶操作提示,調用子模塊,使程序完成查找電話號碼的過程;(2) 接收人名函數input_name:輸入人名,將此人名保存至緩沖區(qū),并用空格補足剩余空間;(3) 保存人名函數stor_name:將人名從緩沖區(qū)中取出,保存在電話號碼表中

溫馨提示

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

評論

0/150

提交評論