汇编语言:MOVSB,MOVSW,MOVSD

本文详细介绍了80386处理器中的MOVSB、MOVSW和MOVSD指令,这些指令用于移动字符串数据,并解释了如何通过添加重复前缀REP来实现数组的批量复制。文章还提供了具体的示例代码,帮助读者理解如何正确设置方向标志以确保数据的正确移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前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,每次rep循环的时候,esi和edi自动+1。   std是将方向标志位DF设置为1,每次rep循环的时候,esi和edi自动-1。
   rep循环前缀在执行循环的时候,ecx寄存器是每次减1的。和我们的loop循环一样。

   我们在进行字符串操作时,千万要记住要首先设置方向标志,否则会发生不可预料的结果。

 

参考文献

http://hi.baidu.com/txuqbajotfnstvr/item/f80e6c079059a1e9f55ba65d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值