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