3

私はアセンブリにかなり慣れていません(正直に言うと、プログラミング全般)。スタックで遊んでみます。 このコードの目的:

  • 80文字に制限された文字列を取得します
  • 入力された文字列を再出力します
  • スタックにプッシュされるたびに各文字を出力します
  • スタックからポップされるたびに各文字を出力します
  • 逆文字列を出力します。

コードは最後のステップで失敗します。

入力した文字列が「Help」の場合、「pleHe」と出力されます。最後の文字列の最後の文字は、元の文字列の 2 番目の文字です。

私がどこを台無しにしているかを教えてください!

。データ
バッファー WORD 81 DUP(0)
byteCount ワード ?
。コード
メイン PROC
    Clrscr を呼び出す ; 画面をクリアする         
RS:
    mov edx, OFFSET buffer ; 文字列を edx に移動
    mov cl, [SIZEOF buffer]-1 ;ループカウンターを (バッファーのサイズ) -1 に設定する
    Call ReadString ; ユーザーの文字列を読み取る
    mov byteCount, ax ;ユーザーの文字列のサイズを byteCount に移動します
    cmp byteCount, 80 ;byteCount を 80 と比較する
    ja RS ; byteCount が 80 より大きい場合は、別の文字列を要求します
    WriteString を呼び出す ; ユーザーの文字列を画面に書き込む
    Crlf を呼び出す ;改行
    call reverseIt ;文字列の逆順
    出口

reverseIt PROC
    movzx ecx, byteCount ;ループ 1 カウンターを文字列のサイズに設定します
    mov esi, 0 ;ESI をゼロにする

L1: ;Loop1 - 文字列を一度に 1 文字ずつスタックにプッシュします

    movzx eax, buffer[esi] ; バッファを逆参照して eax に配置する
    Crlf を呼び出す ;改行
    call WriteChar ; 現在の文字を画面に出力する
    push eax ; 現在の文字をスタックにプッシュ
    inc esi ;次の文字に移動
    ループ L1

    Crlfを呼び出す
    movzx ecx, byteCount ;ループ 2 カウンターを文字列のサイズに設定します
    mov esi, 0 ;ESI をゼロにする

L2: ;Loop2 - 逆の順序で文字を文字列にポップします

    pop eax ; スタックの一番上から文字を取り出す
    Crlf を呼び出す ;改行
    call WriteChar ; 現在の文字を画面に出力する
    mov buffer[esi], ax ; 文字を文字列に書き込みます
    inc esi ;esi を増やす
    ループ L2

    Crlf を呼び出す ;改行
    Crlf を呼び出す ;改行    
    mov edx, OFFSET buffer ;文字列を WriteString の edx に移動
    WriteString を呼び出します。文字列を画面に出力します
    Crlf を呼び出す ;改行
    ret ;メインに戻る
    リバースイットENDP
メインENDP
ENDメイン
4

2 に答える 2

5

問題

ASCII 文字をバイトではなく WORD として扱っているため、一度に 2 つの文字を逆にすることになります。

一度に 2 文字ずつ文字列を反転すると、これらの値がバッファに書き込まれます。

esi+0: p-
esi+1: lp
esi+2: el
esi+3: He

各反復中、バッファーは次のようになります。

Help--
p-lp--
plpp--
plel--
pleHe-

そのため、余分な e をバッファーに書き込むことになります。e が WriteChar ループに表示されないと思います。

解決

私はあなたのコードをテストしていないので、確かなことはわかりませんが、次の行を変更する必要があるようです:

mov buffer[esi], ax         ;Writes character to String

mov ptr byte buffer[esi], al         ;Writes character to String

この行も変更することをお勧めします。

buffer WORD 81 DUP(0)

そのため、代わりに BYTE を使用します。

buffer BYTE 81 DUP(0)
于 2010-02-22T07:35:32.143 に答える
0

これありがとう!文字列のサイズを制限する最初の部分が BYTE では機能しなかったため、BYTE の代わりに WORD を使用していることはわかっていました。弦を途中で切ってしまったのです。

そのため、バッファを BYTE に変更しませんでした。

そうは言っても、他の変更を試みましたが(以前にも試したと思います)、両方のオペランドが同じサイズでなければならないというコンパイルエラーが発生し続けました。

buffer[esi] をバイトとしてキャストすることでこれを修正しました! 今では完璧に動作します!ありがとう!

mov byte ptr buffer[esi], al

于 2010-02-22T11:59:55.237 に答える