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