如何从字符串末尾删除字符数?

时间:2016-05-05 13:06:24

标签: assembly x86 masm masm32 irvine32

我必须从字符串的末尾删除一定数量的字符(比方说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

1 个答案:

答案 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.