私はプログラムを書かなければなりません
- キーボードバッファから文字列を取得し、文字配列に入れます
- 削除する文字を要求します
- 他のすべてをシフトしながら、文字配列から文字を削除します
これを達成するためにスタックを使用したいと思います。だからここに私の論理があります。
文字列の末尾から始めて、その文字を削除する文字と比較します。キャラクターでない場合は、スタックにプッシュします。存在する場合は無視して、文字列を進みます。次に、最初からすべてを所定の位置にポップします。
これを達成するための手順を使用することになっています。私が手順を踏んでいるとき、手順を終了してメインに戻ろうとするまで、すべてが正常に機能しているようです。私の手順のロジックに問題があると確信しています。今、文字列「The」を操作して e を削除しようとすると、「he」が表示されます。
TITLE String Manipulation
INCLUDE Irvine32.inc
.data
prompt byte "Please enter a string to manipulate : ",0
prompt2 byte "Please enter a character to remove: ",0
answerMSG byte "The new string is: ",0
string BYTE 51 DUP (0)
char BYTE ?
byteCount dword ?
.code
main PROC
call clrscr
push eax ;perserve the registers
push ecx
push edx
mov edx, OFFSET prompt ;prints the prompt
call writeString
mov edx, OFFSET string ;moves the register to the first location for the string
mov ecx, SIZEOF string ;Sets the max characters
call readString
mov byteCount,eax ;places actual count into a counting register
call crlf
mov edx, OFFSET prompt2 ;prints the prompt
call writeString
mov edx, OFFSET char
mov ecx, 1
call readString
call clrscr
mov ecx, byteCount
mov edx, OFFSET string
call stringMan
mov edx, OFFSET string
call writeString
pop edx
pop ecx
pop eax
main ENDP
;
stringMan PROC USES eax ecx edx
mov eax,0
L1:
movzx edx , string[ecx]
cmp dl, char
jz L2
push edx
inc eax
L2:
mov string[ecx],0
LOOP L1
mov ecx,eax
mov eax,0
L3:
pop edx
mov byte ptr string[eax],dl
inc eax
loop L3
ret
stringMan ENDP
END main
理解した。
答え:
コンソールからキャラクターを正しく取得することを扱っていませんでした。また、ecx = 0 の場合も扱っていませんでした。これは、文字配列の最初の位置です。したがって、正しい文字を比較したり、必要に応じて最初の文字を配列にプッシュしたりしていませんでした。削除したら直りました
mov edx, OFFSET char
mov ecx, 1
call readString
そしてそれを
call readChar
mov char,al
これを L1 ループの後に追加します。
movzx edx , string[ecx]
cmp dl,char
jz L4
push edx
inc eax
L4:
設計どおりに動作するようになりました。解決しなければならないフォーマットの問題がいくつかあります。