datas segment
message db 'sorted: ',0ah,0dh,'$' ; 提示信息
space db ' ','$' ; 空格
data dw 0,1,2,3,4,6,5,7,8,9,10,11,12,13,14 ; 数组元素
count dw 15 ; 数组的长度
datas ends
stacks segment
dw 256 dup(?)
stacks ends
codes segment
start:
mov ax,datas
mov ds,ax
mov si, 0 ;偏移地址初始化
mov cx, count ;循环次数
;----------排序-----------
mov cx, count ; 循环次数
mov di, 0
loop1:
call sort
add di, 2 ; 数组偏移位加一
loop loop1
mov dx, offset message ; 打印提示文字
mov ah, 9
int 21h
mov cx, count ; 循环次数
mov di, 0 ; 数组偏移位
loop2:
call print ; 打印数字
call PrintSpace ; 打印空格
add di , 2
loop loop2
exit: ; 退出
mov ah, 4ch
int 21h
; 在每个数字后输出空格
PrintSpace proc near
push ax ; 保存数据
push dx
mov dx, offset space ;' '
mov ah, 9
int 21h
pop dx ; 数据还原
pop ax
ret
PrintSpace endp
; 将数组中的元素一一输出
print proc near
push ax ; 保存数据
push bx
push cx
push dx
mov cx, 0
mov bx, 10
mov ax, data[di]
last:
mov dx, 0
div bx ; DIV商放AX,余数放入DX
push dx
inc cx ; 循环次数,表示数字的位数
cmp ax, 0 ;
jnz last
age:
pop dx
or dx, 30h ; 将dx中的数值转换成ASCII编码以输出在屏幕上
mov ah, 2
int 21h
loop age
pop dx ; 数据还原
pop cx
pop bx
pop ax
ret
print endp
;---------数字排序---------------------
sort proc near
push bx
push dx
mov si,di ; 将SI赋值为DI
loop1:
add si,2 ; 偏移加2,因为数字定义为DW
mov bx,data[di] ; 第一个数
cmp bx,data[si]
ja swap ; 取的第一个数大于第二个数?
jmp next ; 否则不修改,判断是否为最后一个数字
swap:
mov dx,data[si] ; 将这两个数进行调换
mov data[di],dx
mov data[si],bx
next:
mov ax, count
add ax,ax
cmp si,ax ; 如果SI偏移位大于最大的偏移位,则退出循环
jl loop1
pop dx
pop bx
ret
sort endp
codes ends
end start
汇编冒泡排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.