アセンブリ言語での配列のソート方法


  1. バブルソート法の例:

バブルソートはアセンブリ言語で実装するのに適しています。以下は、バブルソートを使用して配列を昇順にソートする例です。

.data
array DWORD 5, 2, 8, 3, 1
arraySize DWORD 5
.code
main PROC
    mov esi, OFFSET array
    mov ecx, arraySize
    dec ecx
outerLoop:
    mov edi, ecx
    mov ebx, 0
innerLoop:
    mov eax, [esi]
    cmp eax, [esi + 4]
    jle skipSwap
    mov edx, [esi + 4]
    mov [esi], edx
    mov [esi + 4], eax
    mov ebx, 1
skipSwap:
    add esi, 4
    dec edi
    cmp edi, 0
    jg innerLoop
    cmp ebx, 0
    jne outerLoop
    loop outerLoop
    ; ソート後の配列を表示する処理を追加することもできます
    invoke ExitProcess, 0
main ENDP
  1. クイックソート法の例:

クイックソートは再帰アルゴリズムですが、アセンブリ言語でも実装可能です。以下は、クイックソートを使用して配列を昇順にソートする例です。

.data
array DWORD 5, 2, 8, 3, 1
arraySize DWORD 5
.code
main PROC
    mov esi, OFFSET array
    mov ecx, arraySize
    push ecx
    push esi
    call QuickSort
    ; ソート後の配列を表示する処理を追加することもできます
    invoke ExitProcess, 0
QuickSort PROC
    push ebp
    mov ebp, esp
    push ebx
    push edi
    push esi
    mov ecx, [ebp + 8] ; 配列の先頭アドレス
    mov edx, [ebp + 12] ; 配列の要素数
    ; ソート範囲が1以下の場合は終了
    cmp edx, 1
    jle EndQuickSort
    ; ピボットを選択
    mov eax, [ecx]
    mov ebx, ecx
    add ebx, (edx - 1) * 4
    mov edi, ebx
    ; ピボットより小さい要素を前に、大きい要素を後ろに移動
    mov esi, ecx
PartitionLoop:
    cmp esi, edi
    jge PartitionDone
    mov ebx, [esi]
    cmp ebx, eax
    jge SkipSwap
    mov edi, [edi]
    mov [esi], edi
    sub edi, 4
    mov edi, [edi]
    mov [edi + 4], ebx
    add edi, 4
SkipSwap:
    add esi, 4
    jmp PartitionLoop
PartitionDone:
    mov ebx, esi
    sub ebx, ecx
    shr ebx, 2
    ; ピボットの位置を記憶
    push edx
    push ecx
    push ebx
    ; ピボットの前半部分を再帰的にソート
    mov edx, ebx
    sub edx, 1
    call QuickSort
    ; ピボットの後半部分を再帰的にソート
    pop ebx
    add ebx, 2
    mov edx, ebx
    sub edx, ecx
    shr edx, 2
    call QuickSort
    ; ソート終了後、スタックを整理
    pop ebx
    pop ebx
EndQuickSort:
    pop esi
    pop edi
    pop ebx
    popebp
    pop ebp
    ret
QuickSort ENDP

これらのコード例は、アセンブリ言語で配列をソートするためのシンプルで簡単な方法の一部です。他のソートアルゴリズムを実装する方法もありますが、バブルソートとクイックソートは一般的で理解しやすいアルゴリズムです。

ソート後の配列を表示するためのコードを追加することもできます。例えば、WriteConsole関数を使用してコンソールに結果を出力する方法などがあります。