汇编实验:查找电话号码
生活随笔
收集整理的這篇文章主要介紹了
汇编实验:查找电话号码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?實驗2.4? 查找電話號碼
????? 1.題目:查找電話號碼
? 2.實驗要求:
(1)要求程序建立一個可存放50項的電話號碼表,每項包括人名(20個字符)以及電話號碼(8個字符)兩部分;
(2)程序可接收輸入人名及相應的電話號碼,并把它們加入電話號碼表中;
(3)凡有新的輸入后,程序按照人名對電話號碼重新排序;
(4)程序可接收需要查找電話號碼的人名,并從電話號碼表中查出其電話號碼,再在屏幕上按照格式輸出。
;******************************************************************** datarea segment mess1 db 'Please input name:','$' mess2 db 'Please input telephone number:','$' mess3 db 'Do you want to search a telephone number?(y/n)','$' mess4 db 0dh,0ah,'what is the name?','$' mess5 db 'Not find',0dh,0ah,'$' mess6 db 'the number you want to store:','$' crlf db 0dh,0ah,'$' stokin1 label byte max1 db 21 act1 db ? stokn1 db 21 dup(?) stokin2 label word max2 db 9 act2 db ? stokn2 db 9 dup(?) numtable db 50 dup(28 dup(?)) name_count dw 0 endaddr dw ? swapped dw ? totalnum dw ? savenp db 28 dup(?),0dh,0ah,'$' searchaddr dw ? flag db ? flagb db ? show db 'name phone',0dh,0ah,'$' datarea ends ;******************************************************************** codesg segmentassume ds:datarea,cs:codesg,es:datarea main proc farmov ax,datareamov ds,axmov es,axlea di,numtable ;di must be protectedlea dx,mess6 ;顯示信息,請輸入想存入的電話號碼總數mov ah,09 int 21hmov bx,0newchar: ;這個是參考書上例2.6,從鍵盤接收數字,然后轉換成ASCII碼mov ah,1 ;從鍵盤接收totalnum,并回顯AL=輸入字符int 21hsub al,30h ;ascii to binaryjl next ;jump if<0cmp al,9 ;is it >9d?jg next ;yes jumpcbw ;byte in AL to word in AX;(digit is now in AX)xchg ax,bx ;交換mov cx,10 ;put 10 dec in CXmul cx ;number times 10 (DX,AX)<-(AX)*srcxchg ax,bx ;交換add bx,ax ;add digit to numberjmp newchar ;get next digitnext:mov totalnum,bxlea dx,crlfmov ah,09int 21ha10: lea dx,mess1 ;顯示請輸入名字mov ah,09int 21hcall input_name inc name_countcall stor_name lea dx,mess2 ;顯示請輸入電話mov ah,09int 21hcall inphonecall stor_phonecmp name_count,0je exitmov bx,totalnumcmp name_count,bx ;輸入與之前輸入總數相等的姓名,電話jnz a10call name_sorta20:lea dx,mess3 ;顯示是否需要查找電話號碼mov ah,09int 21hmov ah,08 ;鍵盤輸入,無回顯,檢測ctrl-break 或 Ctrl-C,AL=輸入字符int 21hcmp al,'y'jz a30cmp al,'n'jz exitjmp a20 a30:mov ah,09lea dx,mess4 ;顯示詢問名字int 21hcall input_namea40:call name_search;call printline;dec flag;sub flag,0 ;要是沒結束的話;jnz a40jmp a20exit:mov ax,4c00h ;;;;帶返回碼終止,AL=子出口碼,AH=返回代碼,00=正常終止,01=用Ctrl-c終止,02=嚴重設備錯誤終止,03=用功能調用31H終止int 21hmain endp ;-------------------------------------------------------------------- input_name proc nearmov ah,0ahlea dx,stokin1int 21hmov ah,09lea dx,crlfint 21hsub bh,bhmov bl,act1mov cx,21sub cx,bx ;;dst<-dst-src,cx為計數功能寄存器呀 b10:mov stokn1[bx],' ' ;補全空格inc bxloop b10 ; b20:; call name_search; sub flag,0; jz b30; lea dx,mess5; mov ah,09; int 21h ; b30:ret input_name endp ;-------------------------------------------------------------------- stor_name proc nearlea si,stokn1mov cx,20rep movsbret stor_name endp ;-------------------------------------------------------------------- inphone proc nearmov ah,0ahlea dx,stokin2int 21hmov ah,09lea dx,crlfint 21hsub bh,bhmov bl,act2mov cx,9sub cx,bx c10:mov stokn2[bx],' 'inc bxloop c10ret inphone endp ;-------------------------------------------------------------------- stor_phone proc nearlea si,stokn2mov cx,8rep movsb ;movs 串傳送指令 cmps 串比較操作ret stor_phone endp ;-------------------------------------------------------------------- name_sort proc near ;;;;;;;;sub di,28mov endaddr,dic1:mov swapped,0lea si,numtablec2:mov cx,20mov di,siadd di,28mov ax,dimov bx,si ;cmpsb si-di movsb di<-sirepz cmpsb ;repz 當為0時重復串操作;repe 當相等時重復串操作;rep 重復串操作直至計數寄存器count reg 的內容為0為止jbe c3 ;CF與ZF=1,小于等于則轉移;chang order mov si,bxlea di,savenpmov cx,28rep movsbmov cx,28mov di,bxrep movsbmov cx,28lea si,savenprep movsbmov swapped,1c3:mov si,axcmp si,endaddrjb c2 ;CF=1,則轉移,小于等于則轉移cmp swapped,0jnz c1 ;結果不為0則轉移ret name_sort endp ;-------------------------------------------------------------------- name_search proc nearlea bx,numtablemov flag,0 ;;;立個flag;mov flagb,0 d: ;mov flag,0 ;;;立個flag;mov flagb,0 mov cx,20lea si,stokn1mov di,bxrepz cmpsbjz d2;jb dexitadd bx,28 ;下一條cmp bx,endaddr jbe d ;未結束,繼續找;add flagb,flagsub flag,0 ;要是沒有找到的話jz nofjmp dexit ;結束,退出nof: lea dx,mess5mov ah,09int 21h d2:mov searchaddr,bx;mov flag,1 ;標志找到了inc flagcall printline; dec flag;sub flag,0 ;要是沒結束的話add bx,28 ;下一條cmp bx,endaddr jbe d ;未結束,繼續找jmp dexit ;結束,退出jnz ddexit:ret name_search endp ;-------------------------------------------------------------------- printline proc nearsub flag,0 ;要是沒有找到的話jz nop10:mov ah,09lea dx,showint 21hmov cx,28mov si,searchaddrlea di,savenprep movsblea dx,savenpmov ah,09int 21hjmp fexit no: lea dx,mess5mov ah,09int 21h fexit: ret printline endp ;-------------------------------------------------------------------- codesg ends ;-------------------------------------------------------------------- end main
問題及收獲
這個代碼需要自己動手編寫實現,也是寫了很久,調了很久,然后終于能運行啦,然而還是有不滿意的地方,最開始我實現的代碼只能每次顯示一個人名,如果有重復的時候,那么同樣也是只顯示一個人名(見下圖),所以我就著手這個問題開始解決。最開始我寫的代碼在查找的部分,只是查找到了就返回輸出,所以只能輸出一個名字,后來我修改之后,每次都是查找到結束位置再返回,這樣就可以實現輸出重復的人名了。我后來還考慮過插入重復人名的時候,顯示提示,已經插入過了,不過這部分我改了好久,不知道為什么沒有實現,它就是始終不能輸出“插入重復”這句話,而且還會有其他的問題(見下圖)。還有,在這個實驗中,我用到的排序算法是參考書上的冒泡排序實現的,字符的輸入,轉換等這部分程序在書上也有參考,所以這部分沒有遇到什么難題。
修改后:
關于顯示“插入重復”信息無法解決的運行結果:
總結
以上是生活随笔為你收集整理的汇编实验:查找电话号码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3位格雷码的顺序编码_格雷码编码规则_格
- 下一篇: python编辑器_没有人比它更懂少儿编