2016-05-05 22 views
0

文字列の最後から特定の数の文字を削除する必要があります(3としましょう)。この特定の文字列については、私は 'Z'を見つけたときに動作し、sub edi、3でWを指すようにして、残りの文字列を0で保存します。文字列の最後から数える文字を削除するには?

INCLUDE Irvine32.inc 

.data 
source BYTE "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0 

.code 
main PROC 

mov edi, OFFSET source 
mov al, 'Z'     ; search for Z 
mov ecx, LENGTHOF source 
cld 
repne scasb  ; repeat while not equal 
sub edi, 3   ; now points to W 

mov al, 0   
rep stosb  ; stores all characters after W with 0. 

mov edx, OFFSET source 
call WriteString 
call CrlF 

exit 
main ENDP 
end main 

ただし、このコードを別のヌル終了文字列で動作させたいとします。その目的のために私はコードが以下に示すように、0(文字列の最後)を見つけようとしました。しかし、それは動作しません、それはちょうど全体の文字列を出力します。

文字列の末尾の検索を毎回変更しなくても文字列が変更されてもコードが確実に機能するようにするにはどうすればよいですか?

INCLUDE Irvine32.inc 

.data 
source BYTE "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0 

.code 
main PROC 

mov edi, OFFSET source 
mov al, '0'     ; search for end of string 
mov ecx, LENGTHOF source 
cld 
repne scasb  ; repeat while not equal 
sub edi, 3   ; now points to W ?? 

mov al, 0   
rep stosb  ; stores all characters after W with 0. 

mov edx, OFFSET source 
call WriteString 
call CrlF 

exit 
main ENDP 
end main 
+3

で、あなただけの1を必要とすることにも注意してください。コンパイル時定数文字列の場合、検索の必要がないので 'LENGTHOF'を使うことができます。また、 '' 0 'は '0'のASCIIコードで' 0'ではなく '48'であることに注意してください。 – Jester

+0

この3つの試みのうち、少なくとも1つは閉じられませんでした。 :) –

+0

私の喜び。これは、「質問する方法」wikiが何をするかをより詳しく示しているようです。 –

答えて

2

エラーは、ECXを任意の値にリセットしないことです。

あなたは最後にECX1を持つことになりますし、あなたのrep stosbは、文字列内の1つの0を書きますので、その後、26日値であるZを、お探しこの場合27には、データの長さにECXを設定します。それからあなたはそれを印刷し、最初のヌルは印刷を止めるでしょう。

第2のものでは、最後のバイトである0を探しています。 repne scasbECXの終了は0なので、rep stosbは何も書き込まれません。

はは真実ではありませんあなたは「0ですべての文字Wの後に店」最初の1 であることに注意ください

mov edi, OFFSET source 
mov al, 0     ; search for end of string 
mov ecx, LENGTHOF source 
cld 
repne scasb  ; repeat while not equal 
sub edi, 3   ; now points to W ?? 

mov byte ptr [edi], 0  ; store a single nul since that's enough 

を使用することができ、これを修正するには。それを行うにはSUB EDI, 3の後にADD ECX, 3をしなければなりません。

'0'が文字0、ではないあなたがゼロで入力する必要はありません値0

+0

mov al、mov ediを0に置き換える2番目の部分については、0はまだ文字列全体を出力します。 – kc9552

+1

@JoeDoe MOV [EDI]、0'ではなく、MOV EDI、0であることに注意してください。実際にはデータサイズもあるはずです。 MOV BYTE PTR [EDI]、0は 'EDI'ではなく、' EDI'が指すメモリにゼロを格納するためです。 –

+0

これで動作します。ありがとう。あなたの答えの説明にも感謝します。 – kc9552

関連する問題