输入十个数并排序,升序和降序
时间: 2023-09-10 11:15:17 浏览: 153
输入10个数,然后按顺序排列
以下是一个汇编程序,可以实现输入十个数并排序,升序和降序输出。这个程序使用冒泡排序算法,将输入的数值按照从小到大的顺序排序,然后再按照从大到小的顺序输出。
```
.MODEL SMALL
.STACK 100H
.DATA
NUMS DB 10 DUP(?) ; 存储输入的十个数
MSG1 DB '请输入10个数字:$'
MSG2 DB 13,10,'升序排序结果:$'
MSG3 DB 13,10,'降序排序结果:$'
NEWLINE DB 13,10,'$'
COUNT DB 10 ; 数组长度
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 输出提示信息
MOV AH, 09H
LEA DX, MSG1
INT 21H
; 循环读入十个数值
MOV CL, COUNT
MOV SI, OFFSET NUMS
READ_LOOP:
MOV AH, 01H
INT 21H ; 读取一个字符
CMP AL, 0DH ; 判断是否输入回车键
JE END_READ ; 如果输入回车键,结束读入
SUB AL, 30H ; 将 ASCII 码转换为数值
MOV [SI], AL ; 存储数值到数组中
INC SI
LOOP READ_LOOP ; 继续读入下一个数值
; 进行升序排序
MOV CX, COUNT
DEC CX ; 最后一个元素不用比较
SORT_LOOP:
MOV BX, CX ; BX 存储当前循环次数
MOV SI, OFFSET NUMS ; SI 指向数组开头
INNER_LOOP:
MOV DL, [SI] ; DL 存储当前元素
MOV DH, [SI+1] ; DH 存储下一个元素
CMP DL, DH ; 比较两个元素
JBE SKIP_SWAP ; 如果前面的元素小于等于后面的元素,不交换
XCHG DL, DH ; 否则交换两个元素
MOV [SI], DL ; 存储交换后的前一个元素
MOV [SI+1], DH ; 存储交换后的后一个元素
SKIP_SWAP:
INC SI ; 继续比较下一个元素
DEC BX ; 循环次数减一
JNZ INNER_LOOP ; 如果还有元素需要比较,继续循环
LOOP SORT_LOOP ; 继续进行下一轮排序
; 输出升序排序结果
MOV AH, 09H
LEA DX, MSG2
INT 21H
MOV CX, COUNT
MOV SI, OFFSET NUMS
PRINT_LOOP:
MOV DL, [SI]
ADD DL, 30H ; 转换为 ASCII 码
MOV AH, 02H
INT 21H ; 输出一个字符
MOV DL, ',' ; 输出逗号分隔符
INT 21H
INC SI ; 继续输出下一个元素
LOOP PRINT_LOOP
MOV DL, '$'
MOV AH, 02H
INT 21H ; 输出换行符
; 进行降序排序
MOV CX, COUNT
DEC CX ; 最后一个元素不用比较
SORT_LOOP2:
MOV BX, CX ; BX 存储当前循环次数
MOV SI, OFFSET NUMS ; SI 指向数组开头
INNER_LOOP2:
MOV DL, [SI] ; DL 存储当前元素
MOV DH, [SI+1] ; DH 存储下一个元素
CMP DL, DH ; 比较两个元素
JGE SKIP_SWAP2 ; 如果前面的元素大于等于后面的元素,不交换
XCHG DL, DH ; 否则交换两个元素
MOV [SI], DL ; 存储交换后的前一个元素
MOV [SI+1], DH ; 存储交换后的后一个元素
SKIP_SWAP2:
INC SI ; 继续比较下一个元素
DEC BX ; 循环次数减一
JNZ INNER_LOOP2 ; 如果还有元素需要比较,继续循环
LOOP SORT_LOOP2 ; 继续进行下一轮排序
; 输出降序排序结果
MOV AH, 09H
LEA DX, MSG3
INT 21H
MOV CX, COUNT
MOV SI, OFFSET NUMS
PRINT_LOOP2:
MOV DL, [SI]
ADD DL, 30H ; 转换为 ASCII 码
MOV AH, 02H
INT 21H ; 输出一个字符
MOV DL, ',' ; 输出逗号分隔符
INT 21H
INC SI ; 继续输出下一个元素
LOOP PRINT_LOOP2
MOV DL, '$'
MOV AH, 02H
INT 21H ; 输出换行符
; 结束程序
MOV AH, 4CH
INT 21H
END_READ:
; 如果不足10个数值,则用0补充
SUB CL, COUNT
JZ SORT_LOOP ; 如果已经输入10个数值,开始排序
ADD CL, COUNT ; 计算需要补充的0的个数
MOV SI, OFFSET NUMS
ADD SI, COUNT ; 将指针移到最后一个元素的位置
FILL_LOOP:
MOV DL, '0'
MOV [SI], DL
INC SI
LOOP FILL_LOOP
JMP SORT_LOOP
MAIN ENDP
END MAIN
```
请注意,这个程序是用 8086 汇编语言编写的,可能需要在不同的汇编器中进行一些修改才能正确地运行。
阅读全文