汇编语言:键盘输入20个数据,完成对附加段数据传送并排序,显示最大和最小数值
输出效果图
代码部分,汇编语言。
DATAS SEGMENT
mes0 DB 'Please input 20 numbers:',0ah,0dh,'$'
mes1 DB 0ah,0dh,'The sorted numbers in ES:',0ah,0dh,'$'
mes3 DB 0ah,0dh,'The biggest number: ','$'
mes2 DB 0ah,0dh,'The smallest number: ','$'
msr db 20 dup(?)
len equ 20
ten db 10
count dw 0
DATAS ENDS
mystack SEGMENT stack
dw 20 dup(?)
mystack ENDS
exda SEGMENT
msd db 20 dup(?)
exda ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,es:exda
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,EXDA
MOV ES,AX
mov dx,offset mes0
mov ah,09h
int 21h
;写数据到数据段
mov cx,len
mov di,offset msr
put: mov ah,1
int 21h
sub al,30h
mul ten
mov dl,al
mov ah,1
int 21h
sub al,30h
add al,dl
mov ds:[di],al
MOV AH,2;空格
MOV DL,20H
INT 21h
inc count
inc di
dec cx
jnz put
;送数据到附加段
MOV SI,OFFSET MSR
MOV DI,OFFSET MSD
MOV CX,LEN
NEXT:MOV AL,ds:[SI]
MOV ES:[DI],AL
INC SI
INC DI
DEC CX
JNZ NEXT
;对es中的数据排序
EXIT:;这是外循环
DEC COUNT ;第一次循环应该是N-1次,类似冒泡排序法
MOV cx,COUNT
MOV dI,offset msd
;内循环
LP1:
MOV AL,es:[dI]
MOV BL,es:[dI+1]
CMP AL,BL
JG CHANGE;大于则送change 交换位置,小于等于了不作为,继续循环
INC dI
LOOP LP1
s0: CMP COUNT,1
JZ OVER ;外循环为1时,跳出循环,已经排好序了
JMP EXIT
CHANGE:
XCHG AL,BL
MOV es:[dI],AL
MOV es:[dI+1],BL
INC dI
LOOP LP1
jmp s0
OVER:
mov dx,offset mes1
mov ah,09h
int 21h
MOV SI,offset msd
MOV CX,20;循环20次,输出20个数
;输出附加段排好序的20个数据
SHUCHU:
MOV AL,es:[SI]
call shuc
mov ah,2
MOV DL,20H
INT 21H
INC SI
LOOP SHUCHU
;输出最小值
mov dx,offset mes2
mov ah,09h
int 21h
mov di,offset msd
mov al,es:[di]
call shuc
;输出最大值
mov dx,offset mes3
mov ah,09h
int 21h
mov di,offset msd
mov al,es:[di+19]
call shuc
KEY: MOV AH,1
INT 16H
JZ KEY
MOV AH,4CH
INT 21H
shuc proc ;把一个数输出
mov ah,0
div ten
mov dx,ax
add dx,3030h
mov ah,2
int 21h
mov dl,dh
int 21h
ret
shuc endp
CODES ENDS
END START