- バブルソート法の例:
バブルソートはアセンブリ言語で実装するのに適しています。以下は、バブルソートを使用して配列を昇順にソートする例です。
.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
- クイックソート法の例:
クイックソートは再帰アルゴリズムですが、アセンブリ言語でも実装可能です。以下は、クイックソートを使用して配列を昇順にソートする例です。
.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
関数を使用してコンソールに結果を出力する方法などがあります。