汇编实验----电话号码
1.題目:查找電話號(hào)碼phone
2.實(shí)驗(yàn)要求:
(1)建立一個(gè)可存放50項(xiàng)的電話號(hào)碼表,每項(xiàng)包括任命(20個(gè)字符)及電話號(hào)碼(8個(gè)字符)兩部分;
(2)程序可接收輸入人名及相應(yīng)的電話號(hào)碼,并把它們加入電話號(hào)碼表中;
(3)凡有新的輸入后,程序應(yīng)按照人名對(duì)電話號(hào)碼表重新排序;
(4)程序可接收需要查找電話號(hào)碼的人名,并從電話號(hào)碼表中查出其電話號(hào)碼,再在屏幕上以如下格式顯示出來。
???????????? name???????????? tel.
???????????? ××× ??????????×××
3.結(jié)構(gòu)
input_name
接收從鍵盤輸入的名字,并將其存入結(jié)構(gòu)體namin中;
stor_name
將結(jié)構(gòu)體namin中的名字存入臨時(shí)電話表項(xiàng)單元temp_tab的前20字節(jié);
inphone
接收從鍵盤輸入的電話號(hào)碼,并將其存入結(jié)構(gòu)體phonein中,然后再從此結(jié)構(gòu)體重將電話號(hào)碼存入臨時(shí)電話表項(xiàng)單元temp_tab的23號(hào)位置開始的8字節(jié);
name_sort
根據(jù)名字對(duì)電話表項(xiàng)中的項(xiàng)進(jìn)行排序(其實(shí)是向已經(jīng)排好序的電話表項(xiàng)中插入一項(xiàng)到合適的位置)。首先找到插入位置并存入cx中,然后調(diào)用insert將其插入。
insert
??根據(jù)插入位置(cx中存儲(chǔ)著插入位置),從電話表項(xiàng)的最后一項(xiàng)開始,前一項(xiàng)復(fù)制到后一項(xiàng)直至到達(dá)插入位置,然后將si指向temp_tab,di指向插入位置,進(jìn)行插入;
name_search
??首先將結(jié)構(gòu)體namin中的名字存入單元temp_nam,然后將si指向該單元,然后使di指向電話表項(xiàng)tel_tab,循環(huán)比較,如果找到,將位置存入cx,如果沒有找到,令cx為0;
printline
??首先需要輸出“name?????? ??????tel.”,然后換行再根據(jù)cx中的位置輸出對(duì)應(yīng)名字和電話號(hào)碼。
clear
??清空臨時(shí)單元temp_nam和tel_tab中的內(nèi)容;
crlf
??在終端打印換行和回車;
代碼如下
;*************************************************************************** datarea segment ;define data segmentmess1 db 'Input name:',13,10,'$'mess2 db 'Input a telephone number:',13,10,'$'mess3 db 'Do you want a telephone number?(Y/N)',13,10,'$'mess4 db 'name?',13,10,'$'mess5 db 'name',19 dup(0),'tel.',13,10,'$'mess6 db 'Not find!',13,10,'$'num dw 0 ;用來標(biāo)識(shí)電話表中數(shù)據(jù)個(gè)數(shù);yonin label byte;max db 1;act db ?;yon db 1 dup(?)phonein label bytepmax db 8pact db ?phone db 8 dup(?)namin label bytenmax db 20nact db ?nam db 20 dup(?)temp_nam db 20 dup(?)temp_tab db 20 dup(?),4 dup(?),8 dup(?),13,10,'$';排序用,臨時(shí)儲(chǔ)存tel_tab中的一項(xiàng)tel_tab db 50 dup(20 dup(?),4 dup(?),8 dup(?),13,10,'$');每一項(xiàng)35(20+8+4+3)字節(jié)datarea ends ;***************************************************************************prognam segment ;define code segment ;--------------------------------------------------------------------------- main proc far assume cs:prognam,ds:datarea,es:datarea start: ;starting execution address ;set up stack for return push ds ;save old data segmentsub ax,ax ;put zero in AXpush ax ;save it on stack ;set DS register to current data segmentmov ax,datarea ;datarea segment addrmov ds,ax ; into DS registermov es,ax ; into ES register ;MAIN PART OF PROGRAM GOES HERE begin:mov ah,09lea dx,mess1 ;提示輸入名字int 21hcall clearcall input_name ;輸入名字cmp nact,0je search ;如果沒有輸入名字,表明輸入結(jié)束,開始排序、查詢call stor_name ;存儲(chǔ)名字到對(duì)應(yīng)單元mov ah,09lea dx,mess2 ;提示輸入電話號(hào)碼int 21hcall inphone ;輸入電話號(hào)碼并存儲(chǔ)到對(duì)應(yīng)單元call name_sort ;開始按照名字排序jmp begin ;繼續(xù)輸入 search:mov ah,09 lea dx,mess3 ;提示是否進(jìn)行查詢int 21hmov ah,01int 21hcmp al,'N'je exitcall crlfmov ah,09lea dx,mess4 ;提示輸入名字以進(jìn)行查詢int 21hcall input_name ;輸入名字cmp nact,0je exitcall name_search ;查詢call printline ;輸出jmp search ;exit:ret ;return to DOSmain endp ;end of main part of program;--------------------------------------------------------------------------- ;接收從鍵盤的輸入名字,存儲(chǔ)到存儲(chǔ)單元namin input_name proc nearmov ah,0ahlea dx,naminint 21hcall crlfret input_name endp ;--------------------------------------------------------------------------- ;從存儲(chǔ)單元nam的姓名存儲(chǔ)到臨時(shí)表項(xiàng)temp_tab stor_name proc nearcmp nact,0je exit1lea si,namlea di,temp_tabsub ch,chmov cl,nactcldrep movsb exit1:ret stor_name endp;--------------------------------------------------------------------------- ;接收鍵盤輸入的電話號(hào)碼,并存儲(chǔ)到phonein,然后在存儲(chǔ)到臨時(shí)表項(xiàng)temp_tab inphone proc nearmov ah,0ahlea dx,phoneinint 21hcmp pact,0je exit2call crlflea si,phonelea di,temp_tabadd di,23sub ch,chmov cl,pactcldrep movsb exit2:ret inphone endp;--------------------------------------------------------------------------- ;根據(jù)名字進(jìn)行排序,首先找到插入位置,然后從最后一個(gè)表項(xiàng)開始前面的一個(gè)表項(xiàng)復(fù)制到 ;后面的表項(xiàng),到達(dá)插入位置后,將臨時(shí)表項(xiàng)(temp_tab)中的內(nèi)容復(fù)制到對(duì)應(yīng)位置 name_sort proc nearcmp num,0jnz sortlea si,temp_tab ;如果表項(xiàng)中沒有內(nèi)容,直接插入lea di,tel_tabmov cx,35cldrepz movsbjmp exit3 sort: ;否則,進(jìn)行排序mov cx,numlea di,tel_tab lea si,temp_tabloopsort:push dipush cxmov cx,20repz cmpsbja move ;如果>0,則使si指向下一個(gè)表項(xiàng),繼續(xù)循環(huán)pop cxpop dicall insert ;如果<=0,則進(jìn)行插入(cx中保存要插入的“位置”)jmp exit3 ;插入結(jié)束,退出 move:pop cxpop diadd di,35 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;lea si,temp_tabloop loopsortmov cx,35 ;正常退出循環(huán),說明需要插入在最后rep movsbexit3:inc num ;表項(xiàng)個(gè)數(shù)加1ret name_sort endp;;;;;;;;;;;;此處,沒有正確返回,因?yàn)閜ush進(jìn)去沒有pop出來 ;--------------------------------------------------------------------------- ;進(jìn)入此子程序后,cx存儲(chǔ)著需要移動(dòng)的表項(xiàng)個(gè)數(shù),從后往前進(jìn)行復(fù)制(移動(dòng)) insert proc nearmov ax,num ;num-cx+1是位置,cx是需要移動(dòng)的表項(xiàng)個(gè)數(shù)loopinsert:push axmov bx,35mul bxlea di,tel_tab ;di=tel_tab+ax*31add di,ax ;si=di-31mov si,disub si,35push cxmov cx,35rep movsbpop cxpop axdec axloop loopinsertlea si,temp_tab ;si=temp_tablea di,tel_tab ;di=tel_tab+ax*31mov bx,35mul bxadd di,axmov cx,35rep movsbretinsert endp ;--------------------------------------------------------------------------- name_search proc nearcall clearmov ch,0mov cl,nactlea si,nam ;si=nam;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;lea di,temp_nam ;需要清空temp_namrep movsbmov cx,numlea di,tel_tablea si,temp_nam loopfind: push dipush cxmov ch,0mov cl,20repz cmpsbje findpop cxpop diadd di,35lea si,temp_namloop loopfind mov cx,0jmp exit4 find:pop cx pop di exit4:retname_search endp ;--------------------------------------------------------------------------- printline proc nearcmp cx,0jnz nextmov ah,09 lea dx,mess6 ;提示未找到int 21hjmp exit5 next:lea dx,mess5mov ah,09int 21hmov ax,numsub ax,cxmov bx,35mul bxlea dx,tel_tabadd dx,axmov ah,09int 21hexit5:retprintline endp ;--------------------------------------------------------------------------- crlf proc nearmov dl,0ahmov ah,02hint 21hmov dl,0ahmov ah,02hint 21hret crlf endp ;--------------------------------------------------------------------------- clear proc nearlea di,temp_tabxor al,almov cx,32rep stosblea di,temp_namxor al,almov cx,20rep stosbret clear endp ;--------------------------------------------------------------------------- prognam ends ;end of code segment ;***************************************************************************end start ;end assembly?
總結(jié)
以上是生活随笔為你收集整理的汇编实验----电话号码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单例设计模式-静态内部类
- 下一篇: 泰安第一中学2021年高考成绩查询,等级