如何删除从字符串末尾开始计算的一定数量的字符?

时间:2016-05-04 21:18:40

标签: 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

但是,我想让这个代码使用不同的字符串,即如果用户更改了源代码以说某些不同的东西(E.g.source byte“This is a string”,0)。为此我尝试找到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 :(得分:0)

我认为你需要使用重复移动字符串字节。我从另一个网站得到了这个。在你的情况下,你将你的字符串的长度 - 10移动到cx。

mov     ax,@data 
mov     ds,ax     ;initialize ds 
mov     es,ax     ;and es 
lea     si,[str1] ;si points to source string 
lea     di,[str2] ;di points to dest string 
cld               ;set df=0 (increasing) 
mov     cx,5      ;# of chars in string1 
rep movsb         ;copy the string