2

ユーザーから 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    
終わる

メインを終了します。エントリポイントを設定し、アセンブラを停止します。

これらの文字列全体をソートするための他のアルゴリズムも高く評価されます。

4

1 に答える 1

3

I actually figure out the answer myself, I use string commands to compare the strings 2 by 2 with each other to see if they're bigger, smaller or equal. Something like the code below in the specific macro that takes two strings to check them and do the required operation like swapping the strings to make them sorted:

check macro a, b
    local next, finish
    cld
    mov cx, 64  ; the size of our buffer that saves the string
    mov si, a
    mov di, b

    repe cmpsb  ; comparing two strings with each other
    ja next
    jmp finish

next:
    ; swaping our strings if needed
    mov cx, 64
    mov si, a
    lea di, change
    rep movsb 

    mov cx, 64
    mov si, b
    mov di, a
    rep movsb

    mov cx, 64
    lea si, change
    mov di, b
    rep movsb 

finish:

endm
于 2013-02-03T20:04:50.777 に答える