微机原理与汇编--输入n个数进行排序并输出

存n个数据(n<=100),如果多了的话会把后面的数据篡改(比如a2),如果想改可以直接在数据段代码这里进行修改
🎈🎈🎈


DATAS SEGMENT
    ;此处输入数据段代码
    a1 word 100 dup(?);这是存n个元素
    a2 byte 'Please input five number:!'
    a3 byte 'The number before sorting is:!'
    a4 byte 'The number after sorting is:!'
    a5 byte 'please input a number:!'
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    ;这个用来写排序函数的通用函数
    ;第一行输入要排序元素的个数
    ;第二行输入要排序的元素
    ;第三行输入原排序的元素
    ;第四行输入排序完成的元素
    
    ;输入字符串a5
    mov si,offset a5
    call outputstr
    
    ;输入要排序的个数
    call inputnum;出口参数di
    call wrap
    
    ;输出字符串a2
	mov si,offset a2
	call outputstr
	
	;输入n个数
	mov si,offset a1
	call inputn
	call wrap;换行
	
	;输出字符串a3
	mov si,offset a3
	call outputstr
    
    ;输出原顺序
	mov si,offset a1
	call outputn
	call wrap
	
	;排序
	mov si,offset a1
	call paixu
	
	;输出字符串a4
	mov si,offset a4
	call outputstr
	
	;输出排序后的
	mov si,offset a1
	call outputn
    
    MOV AH,4CH
    INT 21H
    
    inputn proc;输入n个数,入口参数应该是di
    push ax
    push bx
    push cx
    push dx
	mov cl,0
ifn1:
	cmp cx,di
	je ifnover
    call input
    mov [si],bx
    add si,2
    add cl,1
    jmp ifn1
ifnover:
	pop dx
	pop cx
	pop bx
	pop ax
	ret 
	inputn endp
	
	input proc;输入函数
    push ax
    push cx
    push dx
    mov bx,0
    mov dh,10
    jmp i0
i0:
	mov ah,1
	int 21h
	sub al,48
	cmp al,0
	jb i8
	je i2
i2:
	cmp al,9
	ja i8
	jb i3
i3:
	mov cl,al
	mov ch,0
	mov ax,bx
	mul dh
	add cx,ax
	mov bx,cx
	jmp i0
i8:
	pop dx
	pop cx
	pop ax
	ret
    input endp
    
    outputn proc;输出n个数,di为入口参数
	push ax
    push bx
    push cx
    push dx
	mov bx,0
ofn1:
	cmp bx,di
	je ofnover
	mov ax,[si]
    call output
    add si,2
    add bl,1
    jmp ofn1
ofnover:	
	pop dx
	pop cx
	pop bx
	pop ax
	ret
	outputn endp
	
	output proc;输出函数
    push bx
    push cx
    push dx
    mov bh,0
    mov cl,10
    div cl
    cmp al,0
    ja o1
    je o2
o1:
	push ax
	add bh,1
	mov ah,0
	div cl
	cmp al,0
	ja o1
	je o2
o2:
	mov dl,ah
	add dl,48
	mov ah,2
	int 21h
	cmp bh,0
	ja o3
	je o4
o3:
	pop ax
	sub bh,1
	jmp o2
o4:
	pop dx
	pop cx
	pop bx
	ret ;返回
    output endp;结束
    
    paixu proc;排序函数,si,di为入口参数
    push ax
    push bx
    push cx
    push dx
	mov bx,di;用bx存一下di的值一会用
	mov di,si;用di存si
	mov al,0;遍历参数1
	mov cl,bl
p1:	
	inc al
	mov bl,cl
	cmp al,bl
	jnb pover
	mov si,di
	mov ah,0;遍历参数2
	sub bl,al
	sub si,2
p2:
	inc ah
	add si,2
	cmp ah,bl
	ja p1
	mov dh,[si]
	mov dl,[si+2]
	cmp dh,dl
	ja pswap
	jmp p2
pswap:
	mov [si],dl
	mov [si+2],dh
	jmp p2
pover:
	mov ch,0
	mov di,cx;cx的值存着di的值一直没变
	pop dx
	pop cx
	pop bx
	pop ax
	ret
	paixu endp
    
    outputstr proc;字符串输出函数
    push ax
    push dx
oscontinue:
    mov dl,[si]
    cmp dl,'!'
    je osover
    mov ah,2
    int 21h
    add si,1
    jmp oscontinue
osover:
	pop dx
	pop ax
    ret
    outputstr endp
    
    wrap proc;换行函数
    push dx
    push ax
    mov dx,13
	mov ah,2
	int 21h
	mov dx,10
	mov ah,2
	int 21h
    pop ax
    pop dx
    ret
    wrap endp
    
    inputnum proc;输入元素个数函数
    ;出口参数di
    push ax
    push dx
    push bx
    call input
    mov di,bx
    pop bx
    pop dx
    pop ax
    ret
    inputnum endp
    
CODES ENDS
    END START

如有问题请私聊
qq3543998195

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值