如何在Irvine汇编语言中搜索字符串并用子字符串替换它?

时间:2012-11-28 23:39:00

标签: string assembly x86 substring

我正在编写一个程序,它读取字符串,然后搜索某些关键字,如“cat”,并将其替换为“dog”。我不确定如何启动它。我必须使用什么代码?

1 个答案:

答案 0 :(得分:3)

对于8位字符,它大致相同,有很多方法可以实现它:

  1. si设置为指向字符串的第一个字符。

  2. mov al,[si]

  3. repnz scasb找到第一个字符的第一个匹配项。

  4. 将地址存储在某处。

  5. di设置为指向替换字符串的第一个字符(在本例中为'dog')。

  6. cx/ecx/rcx设置为字符串长度。

  7. repz cmpsb

  8. 检查cx/ecx/rcx是否为零,且最后一个字符是否匹配。

  9. 如果是,则匹配,因此将'dog'复制到与rep movsb一起存储的地址(首先设置指针sidi)。请注意,此方法仅在替换字符串不长于原始字符串时才有效。如果它更长,您可能需要保留一个新的内存块以避免缓冲区溢出。如果它不匹配,则将si回溯到存储的地址,将si递增1(对于16位字符递增2),然后跳转到2.(mov al,[si])。当你到达字符串的末尾时,你还需要检查这里。

  10. 就绪。或者,如果要替换all,如sed s/cat/dog/g,则从1循环,首先设置指针(si)(取决于您希望正则表达式引擎如何工作)。

    < / LI>

    对于UTF-8(16位字符),请替换以下内容:scasb - &gt; scaswcmpsb - &gt; cmpswmovsb - &gt; movswal - &gt; ax

    对于32位代码,将si的所有引用替换为esi,将di的所有引用替换为edi

    对于64位代码,将si的所有引用替换为rsi,将di的所有引用替换为rdi