在数据区存放有一个数据序列(字型还是字节型的自行确定),编写程序,该程序应该能完成以下功能:
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)
|