DATAS SEGMENT
DATA DB 74,68,58,66,69,254,186,6,10,98,34,90,128,222,33,0
COUNT DB 10H
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
MOV BL,1 用BL来检验是否排序完成,减少循环次数
LOOP1:
CMP BL,0
JE CMPEND 若相等则跳转
XOR BL,BL 将BL清零
MOV CL,COUNT COUNT用于外层的计数
DEC CL CL减一,CL用于内层的计数
PUSH CX将CX压入堆栈
LEA DI,DATA将数据段首地址赋值给DI
LOOP2:
MOV AL,[DI]
CMP AL,[DI+1] 将前一个数与后一个数比较
JLE LOOP3 若前一个数小于或等于后一个数,则跳转到LOOP3
XCHG [DI+1],AL前者大于后者,则交换两数
MOV [DI],AL 如果前一个数字大于后一个数字,则交换
MOV BL,1
LOOP3:
INC DI指针加一
LOOP LOOP2循环L00P2,直到CX==0成立
POP CX将CX从堆栈中d出
MOV COUNT,CL 改变外层计数器的值
JMP LOOP1
CMPEND:
MOV AH,4CH 带返回码结束功能
INT 21H返回系统
CODES ENDS
END START
以下是冒泡排序子程序,可直接调用:(请设置es与ds相同)
===============================
SORTWORD PROC NEAR
数组长度置入cx,数组首地址置入 si
PUSH AX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
PUSH CX
POP DX
DEC DX
@SORTWL1:
MOV CX,DX
MOV DI,SI
@SORTWL2:
MOV AX,[DI+2]
CMP AX,[DI]
JL @SORTWNEXT 从大到小(无符号换成 JB)
XCHG AX,[DI]
MOV [DI+2],AX
@SORTWNEXT:
INC DI
INC DI
LOOP @SORTWL2
DEC DX
JNZ @SORTWL1
POPF
POP DI
POP SI
POP DX
POP CX
POP AX
RET
SORTWORD ENDP
===============================================
字节数组排序(有符号数冒泡排序)
SORTBYTE PROC NEAR
数组长度置入cx,数组首地址置入 si
PUSH AX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
PUSH CX
POP DX
DEC DX
@SORTBL1:
MOV CX,DX
MOV DI,SI
@SORTBL2:
MOV AL,[DI+1]
CMP AL,[DI]
JL @SORTBNEXT 从大到小(无符号换成 JB)
XCHG AL,[DI]
MOV [DI+1],AL
@SORTBNEXT:
INC DI
LOOP @SORTBL2
DEC DX
JNZ @SORTBL1
POPF
POP DI
POP SI
POP DX
POP CX
POP AX
RET
SORTBYTE ENDP
===============================================
以下是输入20个以下的字符,用冒泡法按从小到大排列输出的程序,希望对你用所帮助:data segment
da1 db 20,?,20 dup (0)
data ends
stack segment stack
dw 20 dup (0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,data
mov ds,ax
lea dx,da1
mov ah,0ah
int 21h
lea bx,da1+1
mov cl,[bx] ;保存字符个数
inc bx ;ds:bx指向第一个字符
mov ch,1
goon1:
cmp ch,cl
jnb over1
mov dl,1
mov si,0
goon2:
mov al,cl
sub al,ch
cmp dl,al
ja over2
mov al,[bx+si]
cmp al,[bx+si+1]
jna over3
mov al,[bx+si]
xchg al,[bx+si+1]
mov [bx+si],al
over3:
inc dl
inc si
jmp goon2
over2:
inc ch
jmp goon1
over1:
mov dx,bx
mov ch,0
add bx,cx
mov al,'$'
mov [bx],al 把结束标志变为$
mov ah,9
int 21h
mov ax,4c00h
int 21h
code ends
end start
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)