我必须从字符串的末尾删除一定数量的字符(比方说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
答案 0 :(得分:2)
错误是您没有使用任何值重置ECX
。
您将ECX
设置为数据的长度,在本例中为27.然后您找到Z,这是第26个值,因此最后ECX
将具有值1
并且您的rep stosb
会在字符串中写一个0
。然后你打印它,第一个将停止打印。
在第二个中,你正在寻找0
这是最后一个字节。退出repne scasb
ECX
为零,因此rep stosb
不会写任何内容。
要解决此问题,您可以使用
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
请注意,在第一个“中存储W之后的所有字符为0”不成立。在ADD ECX, 3
之后你必须SUB EDI, 3
才能做到这一点。
还要注意'0'
是字符0,而不是值0.