【问题标题】:How do you search a string in Irvine Assembly Language and replace it with a substring?如何在 Irvine 汇编语言中搜索字符串并将其替换为子字符串?
【发布时间】:2012-11-28 23:38:59
【问题描述】:

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

【问题讨论】:

  • 出于好奇,irvine asm 是什么,为什么要使用它?
  • 我想这只是 asm 的一种子语言。我正在学习汇编语言课程,这就是他们出于任何原因决定教的内容。和基础没太大区别,据我了解
  • 酷!所以他们只是把这个问题扔给你,并说把它发布到 stackoverflow 上? :)

标签: string assembly x86 substring


【解决方案1】:

对于 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. 准备好了。或者,如果您想全部替换,如 sed s/cat/dog/g,从 1 开始循环,首先设置指针 (si)(取决于您希望正则表达式引擎如何工作)。

对于 UTF-8(16 位字符)替换以下内容:scasb -> scasw, cmpsb -> cmpsw, movsb -> movsw, al -> @ 987654345@.

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

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

【讨论】:

  • 非常感谢,这对您有很大帮助!
猜你喜欢
  • 2012-07-08
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 2020-01-06
相关资源
最近更新 更多