初學匯編,老師讓寫個冒泡排序出來,帶提示語句的,於是我就寫了一個。
這個程序目前只支持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