匯編版冒泡排序


初學匯編,老師讓寫個冒泡排序出來,帶提示語句的,於是我就寫了一個。

這個程序目前只支持8個數及以內的排序,排序的數值范圍最大為255。

用到的東西都很簡單,只用了基本的寄存器和jmp運算。
更新補充:我自己的電腦上\n即可實現回車換行,但是有的機器不支持,需要\r\n才可以回車換行。如果測試時出現沒有回車的情況,可以在對應部分的輸出語句加上mov dl,13 int 21h。

DATAS SEGMENT
	;用於存放用戶輸入
    a1 db 0,0,0,0,0,0,0,0
    tips db "input a number:$"
    confirm db "Your input:$"
    sort_output db "After sorted:$"
    input_tip db "Input datas:$"
      
DATAS ENDS

STACKS SEGMENT
    ;此處輸入堆棧段代碼
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
	;程序說明
	;先輸入一個8以內的數
	;輸入完畢以后空格分隔,每次輸入一個100以內的數
	;輸入第n個數后回車即可
	;該程序按照非降序排列
    MOV AX,DATAS
    MOV DS,AX
    ;打印提示
    mov bx,offset tips
    call print_tip
    ;輸入需要排序多少個數,存在cx中
    mov ah,1
    int 21h
    mov cl,al
    mov ch,0
    sub cl,48
    ;換行輸入
    mov dl,10
    mov ah,2
    int 21h
    mov bx,offset input_tip
    call print_tip
    ;循環進行輸入 以空格進行分開
    mov bx,offset a1
    ;入口參數是內存的位置bx和輸入的數量cx
    call input
    
    mov bx,offset confirm
    call print_tip
    
    
    mov bx,offset a1
    call loop_print
    
    
    mov bx,offset sort_output
    call print_tip
    ;排序 cx中存在排序個數,bx存待排序數字的起始位置
    mov bx,offset a1
    call sort
    
    mov bx,offset a1
    call loop_print
    
    MOV AH,4CH
    INT 21H
print_tip proc
	;設置一個入口參數
	;這里設計字符串的偏移地址的首地址作為入口參數
	;用到的入口參數的寄存器為bx
	push ax
	push bx
	push dx

s:	
	mov al,ds:[bx]
	cmp al,'$'
	je e
	mov dl,al
	mov ah,2
	int 21h
	inc bx
	jmp s
e:	
	mov dl,10
    mov ah,2
    int 21h
	pop dx
	pop bx
	pop ax
	ret
print_tip endp

input proc
	push ax
	push cx
	push dx
	mov dx,0
inputs:
muladd:
    mov ah,1
    int 21h
    ;遇到空格或者回車視為一個數字
    cmp al,32
    je next
    cmp al,13
    je next
    sub al,48
    ;內存中數據移動到al,al中數據暫存到dl
    mov dl,ds:[bx]
    mov dh,al
    mov al,dl
    ;al*10+dl
    mov dl,10
    mul dl
    add al,dh
    ;al數據放回內存
    mov ds:[bx],al
    ;不是空格,接着讀
    jmp muladd
    ;遇到空格,讀下一個數
next:
    inc bx
    loop inputs
    pop dx
    pop cx
    pop ax
	ret
input endp


print_num proc
	push ax
	push cx
	push bx
	push dx
	;先隨便給ax一個值
    ;cx作為計數器
    mov cx,0
    ;do-while循環求每一位
s:  mov bl,10
    div bl
    push ax
    inc cx
    cmp al,0
    je n
    mov ah,0
    jmp s
    ;輸出
n:  pop ax
	mov dl,ah
	add dl,48
	mov ah,2
	int 21h
	loop n
	pop dx
	pop bx
	pop cx
	pop ax
	ret
print_num endp

loop_print proc
	;循環打印內存中的數據
	;入口參數為bx,即內存的偏移地址
	;無出口參數
	push ax
	push dx
	push cx
	push dx
    cal:
    mov ah,0
    mov al,ds:[bx]
    ;函數入口是ax,數據來源為內存
    call print_num
    mov dl,32
    mov ah,2
    int 21h
    inc bx
    loop cal
    mov dl,10
    mov ah,2
    int 21h
    
    pop dx
    pop cx
    pop bx
    pop ax
	ret
loop_print endp

sort proc
	push ax
	push bx
	push cx
	push dx
	push si
	push di
	;ax bx用於存內存中數據地址及比較
	;di存儲數據首地址
	mov di,bx
	;dx存n-1,冒泡的第二個循環比較n-1-i的值
	mov dx,cx
	sub dx,1
sort_loop:
	;si作為計數器,用於存儲i的值
	mov si,0
begins:
	;取出兩個數並比較
	mov ah,ds:[bx]
	inc bx
	mov al,ds:[bx]
	cmp ah,al
	jns replace
	inc si
	cmp dx,si
	jna hh
	jmp begins
replace:
	;內存中的值進行互換
	mov ds:[bx],ah
	sub bx,1
	mov ds:[bx],al
	inc bx
	inc si
	cmp dx,si
	jna hh
	jmp begins
hh:	
	mov bx,di
	loop sort_loop
	
	pop di
	pop si
	pop dx
	pop cx
	pop bx
	pop ax
	ret
sort endp
CODES ENDS
    END START


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM