アセンブリ言語を使用して任意の入力文字列を並べ替える場合、私は主に、最初にグループ化してから個別に並べ替え、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
さて、具体的なコードはこんな感じです。私のコードはコメントされていないかもしれないので、見たら面倒でつまらないので、わからないことがあればプライベートメッセージを送ってください。
以前に投稿した文字列の並べ替えは、指定された文字列のみを対象とすることができ、アルゴリズムは比較的愚かです。それに比べて、このアルゴリズムはより感度が高く、軽量です。しかし、コードは比較するともっと多くなります。