用汇编语言实现排序,通常使用冒泡法。将数据段DATA开始的16个数排序,前小后大,程序示例如下:
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从堆栈中弹出
MOV COUNT,CL ;改变外层计数器的值
JMP LOOP1
CMPEND:
MOV AH,4CH ;带返回码结束功能
INT 21H ;返回系统
CODES ENDS
END START
;此程序也支持有符号数
.286
.model small
;---------------------------------------------------------------
.code
start:
push cs
pop ds
push cs
pop es
mov ah,09h
mov dx,offset msg1
int 21h
;输入功能从这里开始
mov dx,offset InputBuffer
sub bx,bx
mov ah,3fh
mov cx,80h
int 21h
mov si,offset InputBuffer
mov di,offset numbers
sub ax,ax
mov cx,0ah
@InputLoop:
sub bx,bx
sub bp,bp
call Skip
cmp al,'+'
je @Positive
cmp al,'-'
jne @SignEnd
inc bp
@Positive:
mov al,[si]
inc si
@SignEnd:
@ReadBegin:
sub al,'0'
jl @ReadEnd
cmp al,9
jg @ReadEnd
imul bx,bx,0ah
add bx,ax
mov al,[si]
inc si
jmp @ReadBegin
@ReadEnd:
or bp,bp
je @SignChanged
neg bx
@SignChanged:
mov [di],bx
inc di
inc di
loop @InputLoop
;输入数字到这里结束
;排序开始,用冒泡排序
mov cx,9*2
mov si,offset numbers
@Outer:
sub bx,bx
@Inner:
mov ax,[bx+si]
cmp ax,[bx+si+02h]
jng @Changed
push [bx+si+02h]
mov [bx+si+02h],ax
pop [bx+si]
@Changed:
inc bx
inc bx
cmp bx,cx
jl @Inner
dec cx
dec cx
jg @Outer
;排序结束
;输出数字开始
mov ah,09h
mov dx,offset msg2
int 21h
mov di,offset numbers
mov cx,0ah
mov bp,cx
@OutputLoop:
sub si,si
mov ax,[di]
mov bx,ax
inc di
inc di
cmp ax,0
jnl @PushNumber
neg ax
@PushNumber:
sub dx,dx
div bp
add dl,'0'
push dx
inc si
or ax,ax
jne @PushNumber
cmp bx,0
jnl @PopNumber
push '-'
inc si
@PopNumber:
pop dx
mov ah,02h
int 21h
dec si
jnz @PopNumber
mov ah,02h
mov dl,' '
int 21h
loop @OutputLoop
;输出数字到这里结束
mov ah,4ch
int 21h
;---------------------------------------------------------------
Skip proc near
@Skip: ;Skip blank and table
mov al,[si]
inc si
cmp al,' '
je @Skip
cmp al,09h
je @Skip
ret
Skip endp
;---------------------------------------------------------------
msg1 db 'Please enter the 10 digits:$'
msg2 db 'After the arrangement is as follows:$'
numbers dw 0ah dup(?)
InputBuffer db 80h dup(?)
;---------------------------------------------------------------
end start
下图程序,就可以实现。
反相显示的,就是排序部分。
本程序已经经过实验。