汇编字符串处理指令 一

http://www.cnblogs.com/JCSU/articles/2137802.html
一、字符串处理指令
(1) lodsb、lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据DF标志增减SI(CLD递增, STD递减)
(2) stosb、stosw:把AL或AX中的数据装入ES:DI指向的存储单元,然后根据DF标志增减DI(CLD递增, STD递减)
(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

    
搬移字串指令有两种,分别是 MOVSB 和 MOVSW,先说 MOVSB。MOVSB 的英文是 move string byte,意思是搬移一个字节,它是把 DS:SI 所指地址的一个字节搬移到 ES:DI 所指的地址上,搬移后原来的内容不变,但是原来 ES:DI 所指的内容会被覆盖而且在搬移之后SI 和 DI 会自动地址向下一个要搬移的地址

一般而言,通常程序设计师一般并不会只搬一个字节,通常都会重复许多次,如果要重复的话,就得把重复次数 ( 也就是字串长度 ) 先记录在 CX 寄存器,并且在 MOVSB 之前加上 REP 指令,REP 是重复 (repeat) 的意思。这种写法很是奇怪,一般而言汇编语言源文件的每一行都只有一个指令,但 REP MOVSB 却可以在同一行写两个指令,当然分开写也是一样的。

http://hi.baidu.com/elevin/blog/item/211ac0b4ffbb1d7a8bd4b2a4.html
1、操作指令功能
   移动 movsb, movsw, movsd   从 ESI 指向的内存位置向 EDI 指向的内存位置拷贝数据 
   比较 cmpsb, cmpsw, cmpsd   把 ESI 指向内存位置的数据和 EDI 指向内存位置拷的数据比较(ESI,EDI都指向相匹配元素的后面的那个元素) 
   搜索 scasb, scasw, scasd   把 al/ax/eax 中的数据与 EDI 寻址的内存数据比较(EDI指向查找到的元素的后面的那个元素) 
   储存 stosb, stosw, stosd   把 al/ax/eax 中的数据保存在 EDI 寻址的内存单元 
   加载 lodsb, lodsw, lodsd   把 ESI 寻址的内存数据加载到 al/ax/eax 中

2、重复执行前缀
   rep           当 ecx>0 时重复 
   repe, repz    当 ecx>0 ,且 ZF==1 时重复(只用在比较和搜索中) 
   repne,repnz   当 ecx>0 ,且 ZF==0 时重复(只用在比较和搜索中)
 
3、重复执行方向
   cld    清除 DF 标志,ESI 和 EDI  递增 
   std    设置 DF 标志,ESI 和 EDI  递减
 
4、字符操作指令格式
   方向               cld, std 
   数据来源             esi,al/ax/eax 
   数据目的             edi,al/ax/eax 
   循环次数             ecx 
   重复前缀 操作指令  rep, repe, repne  movsb, cmpsb, scasb, stosb, lodsb


二、使用举例
(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
============================================================

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值