實驗五 循環(huán)程序設(shè)計_第1頁
實驗五 循環(huán)程序設(shè)計_第2頁
實驗五 循環(huán)程序設(shè)計_第3頁
實驗五 循環(huán)程序設(shè)計_第4頁
實驗五 循環(huán)程序設(shè)計_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗五 循環(huán)程序設(shè)計一、試編制一程序:從鍵盤輸入一行字符,要求第一個鍵入的字符必須是空格符,如不是空格符,則退出程序;如果是空格符,則開始接收鍵入的字符并順序存放在首地址為BUUFER的緩沖區(qū)中(空格不保存),直到接收到第二個空格為止。datarea segmentrl db 0dh,0ah,'$'buffer db 80 dup(?),$flag db ?datarea endsprogname segmentassume cs:progname,ds:datareamain proc farstart:push dssub ax,axpush axmov ax,datare

2、amov ds,axlea bx,buffermov flag,0next:mov ah,01int 21htest flag,01h ;是第一個字符嗎?標志單元為1,表示輸入的不是第一個字符jnz follow ;不是第一個字符則轉(zhuǎn)。cmp al,20h ;第一個字符是空格嗎?jnz exit ;第一個字符不是空格則退出mov flag,1 ;第一個字符是空格標志單元置1jmp next ;等待輸入下一個字符follow:cmp al,20h;非第一次輸入的字符是空格嗎?jz disp ;exit;movbx,al;不是空格,則將輸入的字符保存到首地址為BUFFER的緩沖區(qū)。inc bxjm

3、p nextdisp:lea dx,rlmov ah,9int 21hlea dx,buffermov ah,9int 21hexit:retmain endpprogname endsend start二、從鍵盤輸入兩個十進制數(shù),轉(zhuǎn)換成二進制數(shù)進行加法運算,兩數(shù)相加的結(jié)果輸出在屏幕上. (空格或逗號作為兩數(shù)的的分隔符). data segmentbini dw ?result dw ?decasc db 5 dup(?)flag db 0data endscode segmentassume cs:code,ds:datamain proc farpush dssub ax,axpush a

4、xmov ax,datamov ds,axmov bx,0;BX中保存轉(zhuǎn)化的中間結(jié)果,初始BX=0.(Di*10)+Di-1)*10+.+D0)new:mov flag,0newchar:mov ah,1int 21h;等待鍵盤輸入push axsub al,30h;jl s1;輸入字符小于零,為非0-9的數(shù),則轉(zhuǎn)移cmp al,9jg s1 ;輸入字符大于9,為非0-9的數(shù),則轉(zhuǎn)移cbw;將AL中的字節(jié)字符擴展到AX為字xchg ax,bx;AX和BX中的數(shù)進行交換(原AX中為Di-1,BX中為Di)mov cx,10;mul cx;xchg ax,bx;乘十后的結(jié)果交換到BX中,既為(Di

5、*10)add bx,ax;作(Di*10)+Di-1)運算,結(jié)果在BX中jmp newchar;轉(zhuǎn)等待鍵盤輸入s1:pop axcmp flag,1 ;標志位為1嗎?jz add1;為1轉(zhuǎn)cmp al,20hjz sf;是空格轉(zhuǎn)cmp al,','jnz sbini;sf: mov bini,bx; mov flag,1;置標志位mov bx,0 jmp newchar;add1:add bx,binisbini:mov result,bx;保存二進制數(shù)結(jié)果到內(nèi)存單元 mov ax,0000h;*binidec:mov dx,result ; 將二進制數(shù)取到DX中,準備轉(zhuǎn)換成

6、十進制ASCAII碼mov si,offset decasc-1;skip:inc simov ax,dx;把要轉(zhuǎn)換的二進制數(shù)送到AXmov dx,0000hmov cx,10div cx;AX中的二進制數(shù)除以十xchg ax,dx;將余數(shù)從DX中交換到AX中,而商交換到DX中add al,30h;轉(zhuǎn)換成ASCAII碼mov si,al;保存一位十進制ASCAII碼cmp dx,0000h;判斷商為零嗎jne skipnext:cmp si,offset decasc+4 ;不滿五位高位補零jz dispinc simov al,30hmov si,aljmp next;*disp:mov c

7、x,5mov dl,0dhmov ah,2int 21hmov dl,0ahmov ah,2int 21hlop: mov dl,simov ah,2int 21hdec siloop lopexit: mov ah,4chint 21hmain endpcode endsend main三、從鍵盤上輸入十個人名,當(dāng)所有人名都進入后,按字母上升的次序?qū)⑷嗣判颉?data segmentnameperlabel byte ;人名參數(shù)表maxnlen db 21 ;人名的最大長度(包括一個回車鍵)namelen db ? ;實際輸入的字符個數(shù)namefld db 21 dup(?) ;存放鍵盤輸

8、入的字符crlfdb 13,10,'$'endaddrdw ?messg1db 'Name?','$'messg2db 'Sorted names:',13,10,'$'namectrdb 0 ;記錄人名個數(shù)nametabdb 10 dup(20 dup(' ') ;存放10個人名字的緩沖區(qū)namesavdb 20 dup(?),13,10,'$' ;swappeddb 0data endscode segment assume cs:code,ds:databegin proc f

9、armov ax,datamov ds,axmov es,axcldlea di,nametab ;a20lop:call b10read ;從鍵盤輸入人名cmp namelen,0 ;有人名嗎jz a30 ;沒有鍵盤輸入轉(zhuǎn)cmp namectr,30 ;有30個人名嗎 je a30 ;有,則轉(zhuǎn)排序call d10stor ;將人名存入人名緩沖區(qū),并且人名個數(shù)加一jmp a20lop ;繼續(xù)輸入人名a30: cmp namectr,1 ;只有一人或沒有人名輸入jbe a40;則退出call g10sort ;>1個人名 轉(zhuǎn)排序a40:mov ax,4c00hint 21hbegin en

10、dp;b10read proc near ;從鍵盤輸入人名mov ah,09lea dx,messg1int 21hmov ah,0ah ; 鍵盤度字符串lea dx,nameper ;名字參數(shù)表首地址存入DXint 21hmov ah,09 ;顯示回車換行l(wèi)ea dx,crlfint 21h;mov bh,0 ;mov bl,namelen ;實際輸入的一個人名的長度 mov cx,21sub cx,bx ;滿21個字符嗎b20:mov namefldbx,20h ;不滿20個字符,后面用空格補齊inc bx loop b20 retb10read endp;d10stor proc nea

11、r ; 人名存入人名緩沖區(qū)inc namectr ;人名個數(shù)加1cld lea si,namefld ;鍵盤輸入緩沖區(qū)地址送SI mov cx,10rep movsw ;將人名從鍵盤輸入緩沖區(qū)傳送到人名緩沖區(qū)retd10stor endp;g10sort proc near ;人名排序sub di,40 ;指向最后一個人名的地址mov endaddr,dig20:mov swapped,0 ;交換標志lea si,nametab ; 人名緩沖區(qū)首地址g30:mov cx,20 ;一個人名的長度mov di,si ;add di,20 ;指向下一位人名的地址mov ax,dimov bx,sir

12、epe cmpsb ;比較人名jbe g40 ;若<= 則不交換call h10xchg g40:mov si,ax ;取下一位人名的地址,準備下一次比較cmp si,endaddr ;是最后一位名字嗎jbe g30 ;不是,則進行下一輪比較cmp swapped,0 jnz g20 ;有交換,則繼續(xù)比較ret ; 沒有,退出排序g10sort endp;h10xchg proc nearmov cx,10lea di,namesav ;交換時使用的人名暫存區(qū)mov si,bx rep movsw ;將人名保存到暫存區(qū);此時SI已指向下一個人名的地址(循環(huán)執(zhí) ; 行了10次,每次地址加2

13、,即SI+20)mov cx,10 mov di,bx ;指向前一位人名地址rep movsw ;將下一位人名存到前一個人名存儲區(qū);mov cx,10 lea si,namesavrep movsw ; 將前一位人名存到下一位人名存儲區(qū),實現(xiàn)了交換mov swapped,1 ;reth10xchg endpcode endsend begin四、將20個學(xué)生的成績存入以Grade 為首地址的20個字數(shù)組中,另一個數(shù)組RANK為20個學(xué)生的名次表,編寫一個程序?qū)W(xué)生成績進行排序,排名次,將排好的名次存放到RANK數(shù)組中。.model small.stack 80h.datagrade dw 78

14、,76,86,88,93,91,65,60,90,99,92,100,83,89,71,73,84,95,97,71rank dw 20 dup (0) ;每人初始計名次為零grade1dw 20 dup(?)count dw 20mess1 db 'grade: $'mess2 db 13,10,'input error!',13,10,'$'mess3 db 'rank: $'.codemain proc farstart:push dsmov ax,0push axmov ax,datamov ds,axcall rankp

15、call outputretmain endprankpproc nearmov di,countmov bx,0;成績、名次的偏移首地址loop1:mov ax,gradebx;取要排名次的成績;mov word ptr rankbx,0;每人開始計名次為零mov cx,count;內(nèi)循環(huán)次數(shù),即每個人要比較的人數(shù)lea si,grade;取第一個人的成績存放的地址next:cmp ax,si;比較成績放在AX中,從第一個人開始依次比較jg no_count;比較的成績高則取下一個成績inc word ptr rankbx;名次加一no_count:add si,2;修改地址,指向下一個成績

16、的地址loop next;add bx,2;指向下一個要排名次的成績地址dec di;修改外循環(huán)次數(shù)jne loop1retrankpendpoutputproc nearmov si,0mov di,0 ;mov di,countmov cx,0 ;mov cx,countnexth:lea dx,mess1 ;顯示成績mov ah,9int 21hpush si;保存偏移地址 next1:mov bx,gradesi ;取一個成績call binidecmov dl,','mov ah,2 ;int 21hadd si,2inc dicmp di,count ;成績顯示完嗎

17、jz nextm ;轉(zhuǎn)顯示名次mov ax,diand al,0fh ;每行顯示16個成績test al,0fhjnz next1nextm:call crlf;*lea dx,mess3 ;顯示名次mov ah,9int 21hpop si;取出顯示名次的偏移地址next2:mov bx,ranksi;取一個名次 call binidecmov dl,','mov ah,2int 21hadd si,2inc cxcmp cx,count ;顯示完嗎jz exit1 mov al,cland al,0fh ;每行顯示16個名次test al,0fhjnz next2call crlfjmp nexthexit1:retoutputendpbinidec proc near ;二進制轉(zhuǎn)換成十進制push bxpush cxpush sipush dimov cx,100dcall dec_div

溫馨提示

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

評論

0/150

提交評論