zoukankan      html  css  js  c++  java
  • 【汇编】字符串处理指令 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
    复制代码

     

  • 相关阅读:
    JavaScript实现类的private、protected、public、static以及继承
    OSS网页上传和断点续传(STSToken篇)
    OSS网页上传和断点续传(OSS配置篇)
    Linq sum()时遇到NULL
    SQLSERVER事务日志已满 the transaction log for database 'xx' is full
    笔记本高分辨软件兼容问题,字体太小或模糊
    H5上传图片之canvas
    An error occurred while updating the entries. See the inner exception for details.
    无限级结构SQL查询所有的下级和所有的上级
    SQLserver 进程被死锁问题解决
  • 原文地址:https://www.cnblogs.com/vinozly/p/6068444.html
Copyright © 2011-2022 走看看