首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

GNU汇编总结 07

GNU汇编总结 07

# 八,字符串处理
   
    ################################################################################################
   
    1, 传送字符串
   
    movs 有三种格式
   
    movsb     传送单一字节
   
    movsw     传送一个字
   
    movsl     传送双字
   
    movs指令使用隐含的源和目的操作数, 隐含的源操作数是ESI, 隐含的目的操作数是EDI, 有两种方式加载内存地址到
   
    ESI和EDI, 第一种是使用标签间接寻址 movl $output, %ESI, 第二种是使用lea指令, lea指令加载对象的地址到指定
   
    的目的操作数如lea output, %esi, 每次执行movs指令后, 数据传送后ESI和EDI寄存器会自动改变,为另一次传送做
   
    准备, ESI和EDI可能随着标志DF的不同自动递增或者自动递减, 如果DF标志为0则movs指令后ESI和EDI会递增, 反之会
   
    递减, 为了设置DF标志, 可以使用一下指令:
   
    CLD    将DF标志清零
   
    STD    设置DF标志
   
    2,rep前缀
   
    REP 指令的特殊之处在与它不执行什么操作, 这条指令用于按照特定次数重复执行字符串指令, 有ECX寄存器控制,
   
    但不需要额外的loop指令, 如rep movsl
   
    rep的其他格式:
   
    repe    等于时重复
   
    repne 不等于时重复
   
    repnz 不为零时重复
   
    repz    为零时重复
   
    3, 存储和加载字符串
   
    LODS     加载字符串, ESI为源, 当一次执行完lods时会递增或递减ESI寄存器, 然后把字符串值存放到EAX中
   
    STOS     使用lods把字符串值加载到EAX后, 可以使用它把EAX中的值存储到内存中去:
   
    stos使用EDI作为目的操作数, 执行stos指令后, 会根据DF的值自动递增或者递减EDI中的值
   
    4, 比较字符串
   
    cmps 和其他的操作字符串的指令一样, 隐含的源和目标操作数都为ESI和EDI, 每次执行时都会根据DF的值把
   
    ESI和EDI递增或者递减, cmps指令从目标字符串中减去源字符串, 执行后会设置EFLAGS寄存器的状态。
   
    5,扫描字符串
   
    scas 把EDI作为目标, 它把EDI中的字符串和EAX中的字符串进行比较 ,然后根据DF的值递增或者递减EDI
返回列表