アセンブリ言語は文字列を巧みにソートします

アセンブリ言語を使用して任意の入力文字列を並べ替える場合、私は主に、最初にグループ化してから個別に並べ替え、2つを組み合わせて並べ替えるアルゴリズムを使用します。

出力結果ページには、合計6行が表示されます。最初の行は、並べ替える必要のある入力文字列を表し、2行目は、2つのグループの最初のグループを表します。3行目は、の2番目のグループです。 2つのグループ、4行目は最初のグループの並べ替えの結果であり、5行目は2番目のグループです。その結果、6行目は、4行目と5行目が一緒に実行される並べ替えを表します。これは、最初の行。

具体的なコードは次のとおりです。

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
おすすめ