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