2016-05-05 190 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 

但是,我想讓這段代碼可以使用不同的以null結尾的字符串。爲此,我試圖找到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

你不需要以填補零,你只需要一個。對於編譯時常量字符串,您可以使用'LENGTHOF',因爲您不需要進行任何搜索。還要注意,'0'是'0'的ascii碼,它不是'0'而是'48',所以這不是你想要的。 – Jester

+0

您對這個問題的三次嘗試中至少有一次沒有關閉。 :) –

+0

我的榮幸。看起來,這更貼切地反映了「如何提出問題」Wiki說的事情。 –

回答

2

錯誤是,您沒有用任何值重置ECX

您設置ECX到數據的長度,在這種情況下,27。然後你發現Z,這是26號值,所以最後ECX會有價值1和你rep stosb寫出字符串中一個0。然後你打印它,第一個nul將停止打印。

在第二個你正在尋找0這是最後一個字節。退出repne scasbECX爲零,因此rep stosb不會寫入任何內容。

爲了解決這個問題,你可以在「後W¯¯所有字符店0」使用

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 edi替換mov al,0仍然打印出整個字符串。 – kc9552

+1

@JoeDoe注意它是'MOV [EDI],0',而不是'MOV EDI,0'。實際上也應該有數據大小。因此'MOV BYTE PTR [EDI],0'因此它將零存入EDI指向的存儲器中,而不是存入EDI中。 –

+0

現在有效。謝謝。感謝您在答案中的解釋。 – kc9552