-1

このコードは、文字列が回文かどうかをチェックする必要があります。

ただし、どの文字列に対しても常に「yes」が出力されます。この問題を解決するにはどうすればよいですか?

エラーはいくつかのジャンプ命令にあると思います。

エラーは何ですか?

include inout.asm
.model small,c
.stack 200h
.data
    pal       db "rear"
    ;pal      db 200 dup("mohammad")
    pal_len   equ $ - pal  - 1
    szYes     db "yes$"
    szNo      db "no$"
.code
.startup

;call gets,offset pal
call puts,offset pal

    lea     si, pal
    lea     di, pal
    add     di, pal_len
    mov     cx, 0
CheckIt:
    mov     al, byte ptr [si]
    mov     dl, byte ptr [di]
    cmp     al, dl
    jne     No
    inc     si
    dec     di
    inc     cx
    cmp     cx, pal_len
    JNE     CheckIt
    lea     dx,szYes

    jmp done

No:
    lea     dx,szNo
done:   
    .exit
end
4

1 に答える 1

0

あなたの質問には印刷コードがありません。だから私は自分自身を追加しました:

いいえ:
    lea dx,szNo
終わり:
    動くああ、9
    整数 21h
    。出口
終わり

MASM 6.11で組み立てたところ、「リア」には「いいえ」と表示され、私が試した他の弦でも正しく機能しました。あなたが使用している印刷コードについては知りません。

ただし、コードには他のバグがあります。長さ 1 の文字列を適切に処理しませんが、メモリ内にあるバイトを比較し続けますpalこれは、文字列lengthではなく、最後の文字のpal_len相対オフセットに格納し、既に等しいかどうかを確認する前にwithをインクリメントするために発生します。cxinc cxcxpal_len

だからここに:

pal_len equ $ - pal - 1

pal_lenは、1 を減算するため、4 ではなく3 の値を持つように定義し"rear"ます。ここでは 1 以外の文字列の長さでは問題なく動作します (とにかく、最後の文字は最初の文字とすでに比較されます)。ただし、文字列の長さが 1 の場合は失敗します。長さとして「len」のような名前を付けて変数またはマクロに名前を付け、それをオフセットを意味するために使用することは、混乱を招くため、良い考えではありません。

したがって、修正されたコード全体は次のとおりです。

.モデル小、c
.スタック 200h
。データ
    pal db "a"
    pal_len eq $ - pal
    szYes db "はい$"
    szNo db "no$"
。コード
。起動

    リーシ、パル
    リーディ、パル
    di を追加 (pal_len-1)
    mov cx, 0
チェックイット:
    移動、バイト ptr [si]
    mov dl、バイト ptr [di]
    cmp al、dl
    いいえ
    株式会社シ
    十二月日
    株式会社cx
    cmp cx、pal_len
    JNE チェックイット
    lea dx,szはい

    jmp完了

いいえ:
    lea dx,szNo
終わり:
    動くああ、9
    整数 21h
    。出口
終わり
于 2013-03-26T11:53:13.763 に答える