汇编语言巧妙排序字符串

用汇编语言实现任意输入字符串排序,我主要是采用先分组,然后分别排序,在把两个组合起来排序的使用算法。

在我的输出结果页面中,总共会有6行,第一行表示的是你所输入的我们需要排序的字符串,第二行表示的是将字符串分为两组其中的第一组,第三行表示的是将字符串分为两组其中的第二组,第四行表示的是对分成的第一组排序得到的结果,第五行表示的是对分成的第二组排序得到的结果,第六行表示的是第四行第五行都合起来进行的排序,相当于对第一行进行排序。

具体代码如下:

DATAS SEGMENT
    BUF DB 100,?,100 DUP(?),'$'
    MES DB 'S $'   
    A DB 100 DUP(?)
    B DB 100 DUP(?)
    D DB 100 DUP(?)
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    MOV DX,OFFSET BUF
    MOV AH,10
    INT 21H
    MOV BL,BUF+1
    MOV AH,2
    MOV DL,0AH
    INT 21H
    MOV AL,BL
    MOV AH,0
    MOV CL,2
    DIV CL
    MOV DL,AL
   	MOV SI,OFFSET BUF+2

   	MOV AH,0
   	MOV AL,DL
   	MOV CX,AX
   	MOV BX,OFFSET A
   	MOV DI,CX
	
MOVSB1:
	MOV DX,[SI]
	MOV [BX],DX
	INC BX
	INC SI
	DEC CX
	CMP CX,0
	JNZ MOVSB1	
	MOV BYTE PTR [BX],'$'	
	MOV AH,9
	MOV DX,OFFSET A
	INT 21H	
	MOV BX,OFFSET B
	
	MOV AH,2
	MOV DL,0AH
	INT 21H
	
MOVSB2:
	
	MOV DX,[SI]
	MOV [BX],DX
    INC SI
	INC BX
	
	CMP BYTE PTR [SI],0DH
	JNZ MOVSB2
	
	MOV DL,[BX]
	INT 21H
	MOV BYTE PTR [BX],'$'
	
	MOV AH,9
	MOV DX,OFFSET B
 	INT 21H
 	MOV AH,2
 	MOV DL,0AH
 	INT 21H
 	
 	    MOV BX,OFFSET A
    MOV SI,OFFSET A+1
    MOV CX,SI
    
PAIA:	
	MOV DL,[BX]
	CMP [SI],DL
	JNA DA
	INC SI
	CMP BYTE PTR [SI],'$'
	JZ NEXT
	JNZ PAIA

DA:
	MOV AL,[SI]
	MOV [BX],AL
	MOV [SI],DL
	INC SI
	CMP BYTE PTR [SI],'$'
	JZ NEXT
	JNZ PAIA
NEXT:
	INC BX
	MOV SI,CX
	INC SI
	MOV CX,SI
	
	CMP BYTE PTR [SI],'$'
	JNZ PAIA
	
	MOV AH,9
	MOV DX,OFFSET A
	INT 21H
	
 	MOV AH,2
 	MOV DL,0AH
 	INT 21H

    MOV BX,OFFSET B
    MOV SI,OFFSET B+1
    MOV CX,SI
    
PAIB:	
	MOV DL,[BX]
	CMP [SI],DL
	JNA DAB
	INC SI
	CMP BYTE PTR [SI],'$'
	JZ NEXT1
	JNZ PAIB
	
DAB:
	MOV AL,[SI]
	MOV [BX],AL
	MOV [SI],DL
	INC SI
	CMP BYTE PTR [SI],'$'
	JZ NEXT1
	JNZ PAIB
NEXT1:
	INC BX
	MOV SI,CX
	INC SI
	MOV CX,SI
	
	CMP BYTE PTR [SI],'$'
	JNZ PAIB
	
	MOV AH,9
	MOV DX,OFFSET B
	INT 21H
	
 	MOV AH,2
 	MOV DL,0AH
 	INT 21H
	
	
   	MOV BX,OFFSET A
	MOV SI,OFFSET B
	MOV DI,OFFSET D
PAID:
	MOV AL,[BX]
	CMP AL,[SI]
	JNA DIYIGE

DIERGE:
	MOV AL,[SI]
	MOV [DI],AL
	INC DI
	INC SI
	CMP BYTE PTR [SI],'$'
	JZ JIESHU2
	JNZ PAID


DIYIGE:
	MOV [DI],AL
	INC DI
	INC BX
	CMP BYTE PTR [BX],'$'
	JZ JIESHU1
	JNZ PAID
	
JIESHU1:
	MOV AL,[SI]
	MOV [DI],AL
	INC DI
	INC SI
	CMP BYTE PTR [SI],'$'
	JZ JIESHU
	JNZ JIESHU1

JIESHU2:
	MOV AL,[BX]
	MOV [DI],AL
	INC DI
	INC BX
	CMP BYTE PTR [BX],'$'
	JZ JIESHU
	JNZ JIESHU2

JIESHU:
	MOV BYTE PTR [DI],'$'
	MOV AH,9
	MOV DX,OFFSET D
	INT 21H
	
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START



好啦,具体代码就是这样子,因为我的代码可能没有注释,大家看得话会比较麻烦且枯燥,所以如果有什么不懂的地方,欢迎私信。

我之前发的那个字符串排序只能针对指定的字符串,而且算法也比较笨,相比于那个,这个算法更加灵敏,轻巧。但代码相比而言也会更多。

猜你喜欢

转载自blog.csdn.net/qq_43511094/article/details/112140650