我使用OllyDbg拆解了一个文件,它的指令如下:

#1 楼

SCAS指令用于扫描字符串(SCAS = SCan A String)。它将累加器的内容(ALAXEAX)与ES:[EDI]指向的当前值进行比较。搜索等于累加器中值的第一个字符串元素。

英特尔手册(第1卷,第231页)说:


SCAS指令从EAX,AX的内容中减去目标字符串元素或AL寄存器(取决于操作数长度)并根据结果更新状态标志。字符串元素和寄存器内容未修改。 SCAS指令的以下“短格式”指定操作数长度:SCASB(扫描字节串),SCASW(扫描字串)和SCASD(扫描双字串)。基本上,此指令扫描字符串并寻找与存储在REPNE中的字符相同的字符。它不会触摸除ECX(计数器)和EDI(地址)以外的任何寄存器,而是根据结果显示状态标志。

评论


EAX指向的值还是EAX的值?另外,它会更新哪些累加器? REPNE SCAS应该如何处理?

–aclowkay
2013年9月9日20:43



EAX的值,由ES:[EDI]指出。字符串与累加器中存储的字符不同的地址是当前存储在ES:[EDI]中的地址。

–恐怖
2013年9月9日在21:14

在找到与EAX匹配的值之前,不应该重复REPNE SCAS吗?因此,我认为应该是“寻找与EAX中存储的字符相同的字符”?

–user2797
2013年9月10日下午3:36

@guestme:是的。抱歉,我确实写了与我相反的意思。我编辑文本。

–恐怖
2013年9月10日在12:45

@dnivra:但这还不是全部。具体来说,repnz scasb与memchr()等效。

–彼得·弗里
2013年9月11日17:36