2

私はプログラムを書かなければなりません

  • キーボードバッファから文字列を取得し、文字配列に入れます
  • 削除する文字を要求します
  • 他のすべてをシフトしながら、文字配列から文字を削除します

これを達成するためにスタックを使用したいと思います。だからここに私の論理があります。

文字列の末尾から始めて、その文字を削除する文字と比較します。キャラクターでない場合は、スタックにプッシュします。存在する場合は無視して、文字列を進みます。次に、最初からすべてを所定の位置にポップします。

これを達成するための手順を使用することになっています。私が手順を踏んでいるとき、手順を終了してメインに戻ろうとするまで、すべてが正常に機能しているようです。私の手順のロジックに問題があると確信しています。今、文字列「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:

設計どおりに動作するようになりました。解決しなければならないフォーマットの問題がいくつかあります。

4

1 に答える 1

1

答え:

コンソールからキャラクターを正しく取得することを扱っていませんでした。また、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:

設計どおりに動作するようになりました。解決しなければならないフォーマットの問題がいくつかあります。

于 2013-10-23T02:09:26.567 に答える