我正在编写一个程序,它读取字符串,然后搜索某些关键字,如“cat”,并将其替换为“dog”。我不确定如何启动它。我必须使用什么代码?
答案 0 :(得分:3)
对于8位字符,它大致相同,有很多方法可以实现它:
将si
设置为指向字符串的第一个字符。
mov al,[si]
repnz scasb
找到第一个字符的第一个匹配项。
将地址存储在某处。
将di
设置为指向替换字符串的第一个字符(在本例中为'dog'
)。
将cx/ecx/rcx
设置为字符串长度。
repz cmpsb
检查cx/ecx/rcx
是否为零,且最后一个字符是否匹配。
如果是,则匹配,因此将'dog'
复制到与rep movsb
一起存储的地址(首先设置指针si
和di
)。请注意,此方法仅在替换字符串不长于原始字符串时才有效。如果它更长,您可能需要保留一个新的内存块以避免缓冲区溢出。如果它不匹配,则将si
回溯到存储的地址,将si
递增1(对于16位字符递增2),然后跳转到2.(mov al,[si]
)。当你到达字符串的末尾时,你还需要检查这里。
就绪。或者,如果要替换all,如sed s/cat/dog/g
,则从1循环,首先设置指针(si
)(取决于您希望正则表达式引擎如何工作)。
对于UTF-8(16位字符),请替换以下内容:scasb
- > scasw
,cmpsb
- > cmpsw
,movsb
- > movsw
,al
- > ax
。
对于32位代码,将si
的所有引用替换为esi
,将di
的所有引用替换为edi
。
对于64位代码,将si
的所有引用替换为rsi
,将di
的所有引用替换为rdi
。