塘下网站建设,站长工具网站备案,建筑工程论坛网,重庆最新新闻事件串操作指令可以方便对一组连续的数据进行操作。串操作后自动根据DF标志位修改ESI和EDI#xff0c;DF 0时#xff0c;ESI#xff0c;EDI递增#xff0c;DF 1时#xff0c;ESI#xff0c;EDI递减。串操作指令有2组#xff0c;1组实现数据串传送#xff0c;另1组实现数据… 串操作指令可以方便对一组连续的数据进行操作。串操作后自动根据DF标志位修改ESI和EDIDF 0时ESIEDI递增DF 1时ESIEDI递减。串操作指令有2组1组实现数据串传送另1组实现数据串检测。串操作指令通常需要反复执行所以常与重复指令前缀联合使用它通过计数器ECX控制重复执行串指令的次数。 1.串传送指令 这组指令实现对串的传送它们有MOVSSTOSLODS可以配合REP前缀但不影响标志。 MOVSB ;BYTE PTR[EDI] BYTE PTR[ESI] MOVSW ;WORD PTR[EDI] WORD PTR[ESI] MOVSD ;DWORD PTR[EDI] DWORD PTR[EDI] STOSB ;BYTE PTR[EDI] AL STOSW ;WORD PTR[EDI] AX STOSD ;DWORD PTR[EDI] EAX LODSB ;AL BYTE PTR[ESI] LODSW ;AX WORD PTR[ESI] LODSD ;EAX DWORD PTR[ESI] REP重复指令前缀可以表示为当ECX ! 0时则继续执行直到ECX 0。可以说ECX指明了重复次数。如果不使用REP前缀那么串指令其实是只被执行1次的这是很多新手易出错的地方。 比如我们可以使用串传送指令代替ZeroMemory。 结合上篇文章我们可以定义一个宏程序源码如下 ZeroMem MACRO Addr,Sizecld ;;CLD标志位清0表示递增正向传输xor al,almov edi,Addrmov ecx,Sizerep stosb
endm 调用格式如下 ZeroMem 数据串地址,长度 2.串检测指令 这组指令包含有CMPS和SCAS。由于串比较指令和减法的实质是一样的所以它们也影响标志位。这两个串操作指令可以和REPE/REPZ和REPNE/REPNZ联合使用通过ZF判断是否相等。 CMPSB ;BYTE PTR[ESI] - BYTE PTR[EDI] CMPSW ;WORD PTR[ESI] - WORD PTR[EDI] CMPSD ;DWORD PTR[ESI] - DWORD PTR[EDI] SCASB ;AL - BYTE PTR[EDI] SCASW ;AX - WORD PTR[EDI] SCASD ;EAX - DWORD PTR[EDI] REPE/REPZ ;每执行一次指令ECX递减1。如果ECX 0或ZF 0则结束重复执行 REPNE/REPNZ ;每执行一次指令ECX递减1。如果ECX 0或ZF 1则结束重复执行 实际运用时要注意区分串操作指令结束时因为比较完了还是因为标志位问题。 我根据串操作指令定义了一个宏可以代替ComapreMemory如下 CmpMem MACRO Addr1,Addr2,SizeLOCAL nxor eax,eaxmov esi,Addr1mov edi,Addr2mov ecx,Sizerepe cmpsb ;;当ZF 0时结束是因为有不同jnz n ;;当两数据串完全相等时则EAX 1inc eax
n:
endm 转载于:https://www.cnblogs.com/galano/p/8721794.html