汇编基础一日一学习25 大家好今天我们来学习与我们字符串处理相关的指令,今天这节课程非常重要学好了以后就可以使自己的代码优化的更加完美。、 我们的目前80386系列的处理器提供给我们几组处理字节、字和双字数值的指令,尽管这些指令成为基本字符串指令,但他们的用法并不局限于字符数组。 指令: MOVSB, MOVSW, MOVSD 描述: 移动字符串数据,复制由ESI寄存器寻址的内存地址处的数据至EDI寻址的内存地址处。 在保护模式程序中,也就是我们80386默认的启动模式,ESI自动作为由DS寻址的段内偏移,EDI自动作为由ES寻址的段内偏移,ES和DS总是具有同样的值且无法改变它们。(在实地址模式(8086)模式下ES和DS是我们程序员操纵的)。 我们来看这三个指令:MOVSB, MOVSW, MOVSD ,我们可以发现它们就最后一个字母不同,其实最后一个字母也就表示的是我们每次移动的数据字节大小。第一个MOVSB是每次一个字节,其次是一个字、接着一个双字。 我们从它的'B','W','D'就可以看出来。 B代表Byte,W代表WORD, D代表DWORD。 上面这3个字符串操作指令本身每次只能处理一个或一对值,但如果增加一个重复前缀,指令就会使用ecx寄存器作为计数器进行重复。重复前缀可以仅用一条指令处理整个数组。 重复前缀REP : 当ECX>0时重复 (和我们的loop循环相似)。 看了上面的理论,我们来个演示吧。 cld ;方向标志 mov esi, 内存地址1 ;(也就是存放字符串的内存地址) mov edi, 内存地址2 ;(要移动到目的处的地址) mov ecx, 要移动的数量 ; rep movsb 我们来分析下,先来看这个cld指令,它有什么用呢。它其实是来控制我们重复移动时候的esi 和edi的递增方式。 cld是将我们的方向标志位DF设置为0,为0的话,每次我们rep循环的时候,esi和edi自动+1。 如果我们的DF标志位为1的话,每次我们rep循环的时候,esi和edi自动减去1。那么置DF标志位为1的指令是std。 rep循环前缀在执行循环的时候,ecx寄存器是每次减1的。和我们的loop循环一样。 我们在进行字符串操作时,千万要记住要首先设置方向标志,否则会发生不可预料的结果。 好,今天的课程就这么多。 留个小作业: 1.假设此时00400000内存单元处存放一系列字符串'hello world', 此时我想将hello移动到起始00400010内存单元处,用今天学到的知识来写一段汇编指令来完成上述操作。
字符串处理相关的指令: MOVSB, MOVSW, MOVSD 汇编基础一日一学习25
最新推荐文章于 2024-08-25 14:59:24 发布