X86 Assemble指令--MOVS指令簇

介绍

MOVS系列的指令簇主要用来复制字符串(move string)。

作用

主要将DS:SI地址的数据复制到ES:DI地址中。

该指令簇包括: MOVS mem16,mem16:显式指定源操作数与目的操作数 MOVSB:每次移动一个字节 MOVSW:每次移动一个字 MOVSD:每次移动两个字

描述

从第二个操作数(源操作数)地址开始移动byte,word或者double word到第一个操作数(目的操作数)所指定的位置。源操作数与目的操作数都处于内存中。

源操作数的地址从DS:ESI寄存器中读取,或者从DS:SI寄存器中读取。(这取决于该指令集的地址宽度是32位还是16位)。

目的操作数的地址则从ES:EDI寄存器或者ES:DI寄存器中获取(同样取决于该指令集的地址宽度)。DS段可以被段前缀重写,而ES段则不允许被重写。

在Assemble代码级别,该指令有两种形式:显示操作数隐式操作数

显式操作数的形式通过使用MOVS符号,允许源操作数与目的操作数被显式指定。这种方式源操作数与目的操作数需要标明移动大小以及源操作数与目的操作数的地址。源操作数与目的操作数必须指定正确的操作数大小(bytes,words,doublewords),但是不用指定正确的地址。

源操作数与目的操作数总是在DS:(E)SI以及ES:(E)DI寄存器中指定,而这寄存器中的地址必须在move string指令执行前被正确加载。

而无操作数的move string指令同样也是使用DS:(E)SI与ES:(E)DI寄存器来指定源操作数与目的操作数的地址。并且移动的大小在指令中体现:MOVSB(byte move),MOVSW(word move),MOVSD(double word move)。

在Move操作结束后,(E)SI与(E)DI寄存器会自动的增加或者减少,而依据则是根据EFLAGS寄存器中的DF标志位来判断增加还是减少。

  • 如果DF标志位为0,则(E)SI与(E)DI寄存器则自增
  • 如果DF标志位为1,则(E)SI与(E)DI寄存器则自减

CLD(clear direction flag)该指令使DF=0,使地址自动增量 STD(set direction flag)该指令使DF=1,使地址自动减量

而每次自增/自减的长度根据指令而定:

  • MOVSB则增加/减少一个字节
  • MOVSW则增加/减少一个字
  • MOVSD则增加/减少两个字

MOVS,MOVSB,MOVSW,MOVSD指令会先于REP前缀的指令集执行bytes,words,doublewords的内存块移动。

异常

当目的操作数的地址在不能写的段中时,会出现#GP(0)异常 当目的操作数的地址不在内存中时,会发生缺页中断,出现#PF异常

实例

MOV CX ,100
LEA SI,FIRST
LEA DI,SECOND
REP MOVSB
  1. 先将100加载到CX寄存器中
  2. FIRST标号的地址加载到DS:SI寄存器中,将SECOND标号的地址加载到ES:DI寄存器中
  3. 执行MOVSB,将FIRST标号作为基址大小为一个字节的数据复制到SECOND标号位置
  4. 执行完后,将CX-1,重复执行MOVSB
  5. 直到CX寄存器为0时,再往下执行

该段代码主要完成了从FIRST标号地址开始复制100个字节到SECOND标号地址位置

参考资料

MOVS/MOVSB/MOVSW/MOVSD

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

yield在WCF中的错误使用——99%的开发人员都有可能犯的错误[上篇]

在定义API的时候,对于一些返回集合对象的方法,很多人喜欢将返回类型定义成IEnumerable<T>,这本没有什么问题。这里要说的是另一个问题:对于返回类型为...

1818
来自专栏jessetalks

Javascript基础回顾 之(二) 作用域

参数传递的问题   在Javascript中所有的参数传递都是按值传递的。也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。...

2816
来自专栏专注 Java 基础分享

字节码文件的内部结构之谜

如果计算机的 CPU 只有「x86」这一种,或者操作系统只有 Windows 这一类,那么或许 Java 就不会诞生。Java 诞生之初就曾宣扬过它的初衷,「一...

4009
来自专栏大内老A

关于CLR内存管理一些深层次的讨论[上篇]

半年之前,PM让我在部门内部进行一次关于“内存泄露”的专题分享,我为此准备了一份PPT。今天无意中将其翻出来,觉得里面提到的关于CLR下关于内存管理部分的内存还...

1988
来自专栏Kevin-ZhangCG

[ Java面试题 ]算法篇

20411
来自专栏desperate633

共享资源的线程安全性Local VariablesLocal Object ReferencesObject Member VariablesThe Thread Control Escape Rul

如果某段代码可以正确的被多线程并发的执行,那么我们就称这段代码是线程安全的,如果一段代码是线程安全的那么他肯定不会出现资源竞速的问题。资源竞速的问题只发生在多个...

581
来自专栏轮子工厂

一篇文章帮你解决中文乱码问题---JavaWeb中文编码问题全面解析

这就是为什么我们在浏览器的地址栏中能看到中文,但是把地址拷贝出来后中文就变成了一些奇怪的串了。

6024
来自专栏喵了个咪的博客空间

zephir-(8)类和对象1

#zephir-类和对象1# ? ##前言## 先在这里感谢各位zephir开源技术提供者 zephir全面使用对象编程,这就是为什么拓展的使用方式只能是方法和...

2853
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列8

? 一、heap和stack有什么区别 栈是一种线形集合,其添加和删除元素的操作应在同一段完成。 栈按照后进先出的方式进行处理。 堆是栈的一个组成元素 ...

3065
来自专栏日常学python

再有人问什么是元类,就把这篇文章扔给他!

我之前在深入理解python中的类和对象中说过,python中的类也是一个对象,可以说是类对象,可以由 type() 来创建类对象的。有了这个知识我们先看看下面...

1152

扫码关注云+社区

领取腾讯云代金券