在數據區存放有一個數據序列(字型還是字節型的自行確定),編寫程序,該程序應該能完成以下功能:
1、(選做)數據區的數據由鍵盤錄入;
2、程序可以按有符號數由大到小,由小到大,按無符號數由大到小,由小到大排序,編寫為多分支程序,由鍵入不同字符或數字選擇排序方法;
3、排序方法自定,可以用不同的方法排序;
4、完成排序后的數據區顯示在電腦屏幕上;
5、盡可能用調用子程序的方法來實現程序,主程序與子程序參數的傳遞方法自行確定。 - 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 ;輸入一個數
- cmp al,31h
- jz next ;輸入數等于1調用有符數大到小排序
- cmp al,32h
- jz next1 ;輸入數等于2調用有符數小到大排序
- cmp al,33h
- jz next2 ;輸入數等于3調用無符數大到小排序
- cmp al,34h
- jz next3 ;輸入數等于4調用無符數小到大排序
- jmp WRONG ;輸入其他值時提示錯誤
-
- WRONG: MOV DL,0DH ;回車
- 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 ;主程序結束
-
- 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 ;有符號數從大到小
- mov cx,count
- dec cx
- loop1:lea si,data1
- mov di,cx
- loop2:mov al,data1[si]
- cmp al,data1[si+1]
- jge ltos ;大于等于跳轉
- 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 ;有符號數從小到大
- mov cx,count
- dec cx
- loop3:lea si,data1
- mov di,cx
- loop4:mov al,data1[si]
- cmp al,data1[si+1]
- jle stol ;小于等于跳轉
- 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 ;無符號數從大到小
- mov cx,count
- dec cx
- loop5:lea si,data1
- mov di,cx
- loop6:mov al,data1[si]
- cmp al,data1[si+1]
- jae ultos ;大于等于跳轉
- 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 ;無符號數從小到大
- mov cx,count
- dec cx
- loop7:lea si,data1
- mov di,cx
- loop8:mov al,data1[si]
- cmp al,data1[si+1]
- jbe ustol ;小于等于跳轉
- 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 ;數組個數給cx
- mov dl,13
- call out_chr ;回車換行
- mov dl,10
- call out_chr
- lea si,data1 ;si指向data1的首地址
- loop9: mov al,data1[si] ;data1的值給al
- call dis ;十進制顯示al的值
- mov dl,' '
- call out_chr ;調用int 21h顯示功能
- inc si ;si值加1,指向data1的下個數
- loop loop9 ;循環
- ret
- display endp
- dis proc near
- pusha ;保護現場,所有寄存器的數存下
- mov bh,al ;al值給bh
- cmp al,128 ;大于等于128為負數,8位寄存器有符號數范圍-128∽127
- jb next4 ;小于128跳轉
- mov dl,'-' ;顯示負號
- call out_chr
- mov al,bh ;上面操作時,al的值會變,現在將數組的值再給al
- neg al ;al進行補碼操作,相當于對負數al取絕對值
- next4:mov ah,0
- mov bl,100
- div bl ;div除法,默認被除數為al,除數bl,商存在al,余數存ah
- mov bh,al ;百位數字給bh
- mov ch,ah ;余數給ch,以下操作會覆蓋ah
- cmp al,0 ;看百位是不是0
- jz next5 ;百位為0不顯示
- add al,30h ;百位數字轉成十進制
- mov dl,al
- call out_chr
- next5: mov ah,0
- mov al,ch ;存在ch的余數,小于100的數字給al
- mov bl,10
- div bl
- mov cx,ax ;商和余數給cx
- cmp al,0 ;十位數字是否為0
- jz next7 ;為0跳轉
- next6: add cl,30h ;十位數字轉十進制
- mov dl,cl
- call out_chr
- jmp next8
- next7: cmp bh,0 ;判斷百位是否為0,確定十位是否需要顯示
- ja next6 ;百位不為0,顯示十位數字
- next8: add ch,30h ;個位數字十進制
- mov dl,ch
- call out_chr
- popa ;恢復現場,將子程序開始時存下的寄存器的數全部恢復
- ret
- dis endp
- out_chr:
- push ax
- mov ah,2 ;dos調用
- int 21h
- pop ax
- ret
- code ends
- end start
復制代碼 全部資料51hei下載地址:
LQ2.rar
(1.6 KB, 下載次數: 7)
2017-12-28 15:01 上傳
點擊文件名下載附件
|