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