目前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

汇编语言:MOVSB,MOVSW,MOVSD相关推荐

  1. movsb movsw movsd 指令详解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u013490896/article/d ...

  2. Win-MASM64汇编语言-MOV/MOVSB/MOVSW/MOVSD/REP/REPZ/REPE/REPNZ/REPNE

    MOV 传送指令,通过对第二个操作数(源操作数)直接寻址或间接寻址,放到第一个操作数(目的操作数)直接寻址或者间接寻址的位置 示例1:将常量2放到eax寄存器中 mov eax,2 示例:将eax中的 ...

  3. 汇编语言-015(PROC伪指令定义参数方式、EXTERNDEF、INCLUDE 、EXTERN 、INVOKE、PROC、PROTO 、MOVSB 、MOVSD 、CMPSD )

    1:使用PROC伪指令定义参数方式不通过寄存器传参,计算数组之和 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DW ...

  4. Intel8086处理器使用NASM汇编语言实现操作系统09-关于数组复制的实现/movsb/movsw/cld/std/rep

    本文介绍movsb和movsw指令,它是C++中memcpy函数的实现,在Java语言的ArrayList实现类中就使用了该指令,不过在Java中的方法是System.arraycopy方法 首先要了 ...

  5. 串传送指令MOVSB MOVSW

    MOVSB(move string byte)ES:DI <-- DS:SI 把ds:si所指地址内存单元中的数据送到es:di所指向的内存单元中,源地址数据保持不变,si和di指向下一个要传送 ...

  6. movsw 汇编_[转]汇编语言:MOVSB,MOVSW,MOVSD

    目前80386系列的处理器提供几组处理字节.字和双字数值的指令,尽管这些指令成为基本字符串指令,但他们的用法并不局限于字符数组. 指令: MOVSB, MOVSW, MOVSD 描述: 移动字符串数据 ...

  7. Linux内核中的汇编语言

    AT&T的汇编格式 在intel格式中大多使用大写字母,而AT&T格式中使用小写字母. 在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀:而在 Intel 汇编格式中 ...

  8. X64汇编语言指令编码

    目录 1. 指令编码概观 1.1 指令编码语法 1.1.1 遗留前缀(Legacy Prefixes) 1.1.2 REX前缀 1.1.3 操作码(Opcode) 1.1.4 转义序列 1.1.5 M ...

  9. 汇编语言笔记(待更新大作业)

    文章目录 前言 计算机系统基础 概述 微处理器/中央处理器(CPU) 概述 性能指标与总线 前端总线(Front Side Bus) 带宽 数据总线DB/地址总线AB/控制总线CB CPU软件特性与指 ...

最新文章

  1. 写一个图片预览器(react-native),温习一下初中数学
  2. 小的人工智能企业应如何解决算力服务器
  3. ASP.NET中防止页面多次加载的IsPostBack属性
  4. 选择一线一张床还是小城一套房?
  5. 使用OpenCV创建视频
  6. Quartz实现动态定时任务
  7. 【干货】人人都能看懂的LSTM
  8. android运行的线程中,android中线程是否运行在单独的进程中?
  9. oracle数字日期43841怎么转,安装0racle已崩溃,求助大佬
  10. Maven学习总结(49)——Maven Profile详解
  11. golang 对象转json
  12. 点云边界提取方法总结
  13. linux下模拟键盘的几种方法
  14. 什么是全文搜索引擎?
  15. [转]Windows服务“允许服务与桌面交互”的使用和修改方法
  16. nginx+php部署环境
  17. y40.第三章 Kubernetes从入门到精通 -- k8s 资源对象(十三)
  18. TextPad等编译器找不到或无法加载主类
  19. 阅读《Detection of EEG-Based Eye-Blinks Using A Thresholding Algorithm》小结
  20. 动手学深度学习——权重衰退及代码实现

热门文章

  1. Opencv-(35)轮廓逼近和拟合
  2. 一杯睡前牛奶,会不会让年轻人的失眠有尽头?
  3. phpmail通过qq发邮箱失败_php 利用qq邮箱发送邮件的实现
  4. 可以在线定制的安卓即时通聊天软件
  5. 学计算机的雷蛇与苹果,雷蛇做了什么 让学霸苹果也抄袭他了
  6. 阿里云网站ICP备案一定要知道的东西
  7. 真正的inotify+rsync实时同步 彻底告别同步慢
  8. Salted Password Hashing - Doing it Right
  9. 我想进阿里:通宵达旦三个月,学了这些技术点(附Java思维导图)
  10. Libra 白皮书 2.0 中文版