• 【汇编】字符串处理指令 stosb、lodsb、movsw、scasb、rep


    一、字符串处理指令

    (1) lodsb、lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据DF标志增减SI

    (2) stosb、stosw:把AL或AX中的数据装入ES:DI指向的存储单元,然后根据DF标志增减DI

    (3) movsb、movsw:把DS:SI指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI

    (4) scasb、scasw:把AL或AX中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI

    (5) cmpsb、cmpsw:把DS:SI指向的存储单元中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI

    (6) rep:重复其后的串操作指令。重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。主要用在MOVS和STOS前。一般不用在LODS前。

    上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器AX、计数器CX
               涉及的标志位:DF、AF、CF、OF、PF、SF、ZF

    二、使用举例

    (1) 把当前数据段中偏移1000H开始的100个字节的数据传送到从偏移2000H开始的单元中

    复制代码
          CLD
          PUSH    DS
          POP     ES
          MOV     SI,1000H
          MOV     DI,2000H
          MOV     CX,100
    NEXT: LODSB
          STOSB
          DEC     CX
          JNZ     NEXT
    复制代码
    复制代码
          CLD
          PUSH    DS
          POP     ES
          MOV     SI,1000H
          MOV     DI,2000H
          MOV     CX,100
    NEXT: MOVSB
          DEC     CX
          JNZ     NEXT
    复制代码
    复制代码
          CLD
          PUSH    DS
          POP     ES
          MOV     SI,1000H
          MOV     DI,2000H
          MOV     CX,3
    NEXT: MOVSB
          LOOP    NEXT
    复制代码
    复制代码
          CLD
          PUSH    DS
          POP     ES
          MOV     SI,1000H
          MOV     DI,2000H
          MOV     CX,3
          REP     MOVSB
    复制代码

    (2) 判断AL中的数字是否为16进制数

    复制代码
    STRING  DB '0123456789ABCDEFabcdef'
    STRLEN  EQU $-STRING
          ...
          CLD
          MOV     DX,SEG STRING
          MOV     ES,DX
          MOV     CX,STRLEN
          MOV     DI,OFFSET STRING
    NEXT: SCASB
          LOOPNZ  NEXT
          JNZ     NOT_FOUND
    FOUND:
          ...
    NOT_FOUND:
          ...
    复制代码

    (3) 其它实例

    复制代码
    start:
        mov    ax,#BOOTSEG
        mov    ds,ax
        mov    ax,#INITSEG
        mov    es,ax
        mov    cx,#256
        sub    si,si
        sub    di,di
        rep
        movw
    复制代码
    复制代码
        movl $1024*5,%ecx 
        xorl %eax,%eax
        xorl %edi,%edi   
        cld;rep;stosl
        movl $pg0+7,_pg_dir 
        movl $pg1+7,_pg_dir+4
        movl $pg2+7,_pg_dir+8  
        movl $pg3+7,_pg_dir+12 
        movl $pg3+4092,%edi
        movl $0xfff007,%eax 
        std
    1:  stosl            
        subl $0x1000,%eax
        jge 1b
    复制代码

     

  • 相关阅读:
    笑话(真人真事)一则
    Object Builder中的Locator究竟是不是采用Composite的模式之我见
    C++AndC#我的程序员之路
    C#中各种十进制数的转换
    使用GotDotnet workSpace手记
    检索 COM 类工厂中 CLSID 为 {0002450000000000C000000000000046} 的组件失败
    CSS如何让同一行的图片和文字垂直居中对齐(FF,Safari,IE都通过)
    怎样练习一万小时成为顶级高手?
    CSS控制大小写
    做SEO权重计算公式
  • 原文地址:https://www.cnblogs.com/vinozly/p/6068444.html
Copyright © 2020-2023  润新知