在數(shù)據(jù)區(qū)存放有一個(gè)數(shù)據(jù)序列(字型還是字節(jié)型的自行確定),編寫(xiě)程序,該程序應(yīng)該能完成以下功能:
1、(選做)數(shù)據(jù)區(qū)的數(shù)據(jù)由鍵盤(pán)錄入;
2、程序可以按有符號(hào)數(shù)由大到小,由小到大,按無(wú)符號(hào)數(shù)由大到小,由小到大排序,編寫(xiě)為多分支程序,由鍵入不同字符或數(shù)字選擇排序方法;
3、排序方法自定,可以用不同的方法排序;
4、完成排序后的數(shù)據(jù)區(qū)顯示在電腦屏幕上;
5、盡可能用調(diào)用子程序的方法來(lái)實(shí)現(xiàn)程序,主程序與子程序參數(shù)的傳遞方法自行確定。 - data segment
- data1 db -78,24,-8,94,-109,128,0
- count equ $-data1
- HINT DB 'wrong
- [/color][/font][/align]
- data ends
- code segment
- assume cs:code,ds:data
- main proc near
- start:mov ax,data
- mov ds,ax
- mov ah,1
- input: int 21h ;輸入一個(gè)數(shù)
- cmp al,31h
- jz next ;輸入數(shù)等于1調(diào)用有符數(shù)大到小排序
- cmp al,32h
- jz next1 ;輸入數(shù)等于2調(diào)用有符數(shù)小到大排序
- cmp al,33h
- jz next2 ;輸入數(shù)等于3調(diào)用無(wú)符數(shù)大到小排序
- cmp al,34h
- jz next3 ;輸入數(shù)等于4調(diào)用無(wú)符數(shù)小到大排序
- jmp WRONG ;輸入其他值時(shí)提示錯(cuò)誤
-
- WRONG: MOV DL,0DH ;回車(chē)
- MOV AH,02H
- INT 21H
- MOV DL,0AH ;換行
- MOV AH,02H
- INT 21H
- MOV DX,OFFSET HINT ;提示‘wrong’
- MOV AH,09H
- INT 21H
- MOV AH,4CH
- INT 21H
- HLT ;主程序結(jié)束
-
- next:call signe_ltos
- jmp play
- next1:call signe_stol
- jmp play
- next2:call unsigne_ltos
- jmp play
- next3:call unsigne_stol
- play:call display
- mov ax,4c00h
- int 21h
- main endp
- signe_ltos proc near ;有符號(hào)數(shù)從大到小
- mov cx,count
- dec cx
- loop1:lea si,data1
- mov di,cx
- loop2:mov al,data1[si]
- cmp al,data1[si+1]
- jge ltos ;大于等于跳轉(zhuǎn)
- xchg al,data1[si+1]
- mov data1[si],al
- ltos:inc si
- loop loop2
- mov cx,di
- loop loop1
- ret
- signe_ltos endp
- signe_stol proc near ;有符號(hào)數(shù)從小到大
- mov cx,count
- dec cx
- loop3:lea si,data1
- mov di,cx
- loop4:mov al,data1[si]
- cmp al,data1[si+1]
- jle stol ;小于等于跳轉(zhuǎn)
- xchg al,data1[si+1]
- mov data1[si],al
- stol:inc si
- loop loop4
- mov cx,di
- loop loop3
- ret
- signe_stol endp
-
- unsigne_ltos proc near ;無(wú)符號(hào)數(shù)從大到小
- mov cx,count
- dec cx
- loop5:lea si,data1
- mov di,cx
- loop6:mov al,data1[si]
- cmp al,data1[si+1]
- jae ultos ;大于等于跳轉(zhuǎn)
- xchg al,data1[si+1] ;否則交換
- mov data1[si],al
- ultos:inc si
- loop loop6
- mov cx,di
- loop loop5
- ret
- unsigne_ltos endp
- unsigne_stol proc near ;無(wú)符號(hào)數(shù)從小到大
- mov cx,count
- dec cx
- loop7:lea si,data1
- mov di,cx
- loop8:mov al,data1[si]
- cmp al,data1[si+1]
- jbe ustol ;小于等于跳轉(zhuǎn)
- xchg al,data1[si+1] ;否則交換
- mov data1[si],al
- ustol:inc si
- loop loop8
- mov cx,di
- loop loop7
- ret
- unsigne_stol endp
-
- display proc near
- mov cx,count ;數(shù)組個(gè)數(shù)給cx
- mov dl,13
- call out_chr ;回車(chē)換行
- mov dl,10
- call out_chr
- lea si,data1 ;si指向data1的首地址
- loop9: mov al,data1[si] ;data1的值給al
- call dis ;十進(jìn)制顯示al的值
- mov dl,' '
- call out_chr ;調(diào)用int 21h顯示功能
- inc si ;si值加1,指向data1的下個(gè)數(shù)
- loop loop9 ;循環(huán)
- ret
- display endp
- dis proc near
- pusha ;保護(hù)現(xiàn)場(chǎng),所有寄存器的數(shù)存下
- mov bh,al ;al值給bh
- cmp al,128 ;大于等于128為負(fù)數(shù),8位寄存器有符號(hào)數(shù)范圍-128∽127
- jb next4 ;小于128跳轉(zhuǎn)
- mov dl,'-' ;顯示負(fù)號(hào)
- call out_chr
- mov al,bh ;上面操作時(shí),al的值會(huì)變,現(xiàn)在將數(shù)組的值再給al
- neg al ;al進(jìn)行補(bǔ)碼操作,相當(dāng)于對(duì)負(fù)數(shù)al取絕對(duì)值
- next4:mov ah,0
- mov bl,100
- div bl ;div除法,默認(rèn)被除數(shù)為al,除數(shù)bl,商存在al,余數(shù)存ah
- mov bh,al ;百位數(shù)字給bh
- mov ch,ah ;余數(shù)給ch,以下操作會(huì)覆蓋ah
- cmp al,0 ;看百位是不是0
- jz next5 ;百位為0不顯示
- add al,30h ;百位數(shù)字轉(zhuǎn)成十進(jìn)制
- mov dl,al
- call out_chr
- next5: mov ah,0
- mov al,ch ;存在ch的余數(shù),小于100的數(shù)字給al
- mov bl,10
- div bl
- mov cx,ax ;商和余數(shù)給cx
- cmp al,0 ;十位數(shù)字是否為0
- jz next7 ;為0跳轉(zhuǎn)
- next6: add cl,30h ;十位數(shù)字轉(zhuǎn)十進(jìn)制
- mov dl,cl
- call out_chr
- jmp next8
- next7: cmp bh,0 ;判斷百位是否為0,確定十位是否需要顯示
- ja next6 ;百位不為0,顯示十位數(shù)字
- next8: add ch,30h ;個(gè)位數(shù)字十進(jìn)制
- mov dl,ch
- call out_chr
- popa ;恢復(fù)現(xiàn)場(chǎng),將子程序開(kāi)始時(shí)存下的寄存器的數(shù)全部恢復(fù)
- ret
- dis endp
- out_chr:
- push ax
- mov ah,2 ;dos調(diào)用
- int 21h
- pop ax
- ret
- code ends
- end start
復(fù)制代碼 全部資料51hei下載地址:
LQ2.rar
(1.6 KB, 下載次數(shù): 7)
2017-12-28 15:01 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|