微机原理与汇编--输入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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值