ユーザーから 5 つの文字列を入力として取得し、これらの文字列を並べ替えて、並べ替えた結果を出力として出力する 8086 アセンブリ プログラムを作成したいと考えています。私は実際にすべてを行いますが、ソート部分に大きな問題があります。たとえばバブルソートを使用して、特定のアドレスから始まる配列内のアイテムをソートする方法を知っていますが、ここには同じ配列にない5つの異なる文字列があります。各文字列には、独自のアドレスと独自の文字があります。各文字列の最後の文字を互いに比較しようとし、一方が他方よりも大きい場合は、文字列全体を交換し、すべての文字列の文字全体に対してそれを最初の文字列と比較します。
たとえば、入力文字列が次の場合:
eab
abe
cbd
cda
adb
最初にすべての文字列の最後の文字をソートすると、次のようになります。
cda
eab
adb
cbd
abe
次に、それらを真ん中の文字で比較します。
eab
cbd
abe
cda
adb
そして最後に最初の文字ですべてがソートされます:
abe
adb
cbd
cda
eab
しかし、それは実際に私の頭の中にあるものであり、私の仕事のために誰がそれを実装するのかわかりません.
; マルチセグメント実行可能ファイル テンプレート。
データセグメント
data1 デシベル 64,?,64 重複(?)
data2 デシベル 64,?,64 複製(?)
data3 デシベル 64,?,64 重複(?)
data4 デシベル 64,?,64 重複(?)
data5 デシベル 64,?,64 重複(?)
change db 66 複製(?)
msg db 0ah,0dh,"間違ったオプションを入力しました",0ah,0dh,"再試行",0ah,0dh,"$"
prompt db 0ah,0dh,"オプションを選択してください:",0ah,0dh,"$"
prompt1 db ".a: 昇順で並べ替え",0ah,0dh,"$"
prompt2 db ".d: 降順で並べ替え",0ah,0dh,"$"
prompt3 db ".q: 終了",0ah,0ah,0dh,"$"
enter db 0ah,0ah,0dh,"5 つの文字列を入力してください:",0ah,0dh,"$"
pkey db 0ah,0dh,"任意のキーを押してください...$"
終わる
スタック セグメント
dw 128 デュプ(0)
終わる
コード セグメント
メインプロセスファー
; セグメント レジスタを設定します。
移動斧、データ
ムーブDS、斧
移動、斧
また:
; ユーザーへのプロンプトの出力
lea dx、プロンプト
移動ああ、09h
整数 21h
lea dx、prompt1
移動ああ、09h
整数 21h
lea dx、prompt2
移動ああ、09h
整数 21h
lea dx、prompt3
移動ああ、09h
整数 21h
; 入力としてユーザーから文字を取得する
移動ああ、01h
整数 21h
; ユーザーが選択するオプションの決定
cmp al、「a」
昇順
cmp al、「d」
降りて
cmp al, 'q'
やめた
; これは、ユーザーが間違った文字を入力したときのためのものです
lea dx、メッセージ
移動ああ、09h
整数 21h
jmp 再び; 再びアプリケーションを呼び出して開始する
上昇:
通話入力
AscendSort を呼び出す
jmp 再び; 再びアプリケーションを呼び出して開始する
降順:
通話入力
DescendSort を呼び出す
jmp 再び; 再びアプリケーションを呼び出して開始する
終了する:
lea dx、pkey
動くああ、9
int 21h ; ds:dx の出力文字列
; キーを待ちます....
移動ああ、1
整数 21h
移動斧、4c00h ; オペレーティング システムを終了します。
整数 21h
メインエンド
;................................................................
; このサブルーチンはユーザーからの入力を取得します
入力プロシージャ
lea dx、入力してください
移動ああ、09h
整数 21h
改行を呼び出す
動くああ、0ああ
lea dx、data1
整数 21h
改行を呼び出す
動くああ、0ああ
lea dx、data2
整数 21h
改行を呼び出す
動くああ、0ああ
lea dx、data3
整数 21h
改行を呼び出す
動くああ、0ああ
lea dx、data4
整数 21h
改行を呼び出す
動くああ、0ああ
lea dx、data2
整数 21h
改行を呼び出す
戻る
入力端
;................................................................
; 文字列を昇順にソートする
AscendSort プロシージャ
mov si, 65
リー dx、変更
移動、data1[si]
cmp al, data2[si]
ja l1
???????
戻る
AscendSort endp
;................................................................
; 文字列を降順にソートする
DescendSort プロシージャ
戻る
DescendSort endp
;................................................................
; 改行
改行プロシージャ
ムーブああ、02h
mov dl、0ah
整数 21h
mov dl, 0dh
整数 21h
戻る
改行 endp
終わる
メインを終了します。エントリポイントを設定し、アセンブラを停止します。
これらの文字列全体をソートするための他のアルゴリズムも高く評価されます。