美文网首页从汇编到C++
4. 汇编-内存复制指令

4. 汇编-内存复制指令

作者: Asura_Luo | 来源:发表于2018-05-04 02:53 被阅读0次

4. 汇编-内存复制指令

标志寄存器 EFL

EFL是32位寄存器
其中的每一位,含义都是不同的

0x00000246 16进制
0000 0000 0000 0000 0000 0010 0100 0110 二进制

第十位(从下标开始算 从右往左):DF位
DF位为0的时候: MOVS 执行完毕之后 ESI和EDI的值会增加
DF位位1的时候: MOVS 执行完毕之后 ESI和EDI的值会减少

修改标志寄存器中D位的值,然后在执行下面的指令

MOV EDI,12FFD8
MOV ESI,12FFD0
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]      观察EDI和ESI的值


MOV EAX,12345678
MOV EDI,12FFC4
STOS BYTE PTR ES:[EDI]                          观察EDI的值
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]

MOVS指令:移动数据 内存-内存

BYTE/WORD/DWORD

MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]   简写:MOVSB
MOVS WORD PTR ES:[EDI],BYTE PTR DS:[ESI]    简写:MOVSW
MOVS DWORD PTR ES:[EDI],BYTE PTR DS:[ESI]   简写:MOVSD  

例子:

MOV EDI,12FFD8
MOV ESI,12FFD0
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]      观察EDI的值

在汇编中,当我们需要把内存中的数据从一个地方复制到另一个地方的时候就会用到
EDI和ESI

ESI中存储需要复制的数据的内存地址,EDI是将要复制的地方

MOVS指令每执行一次,EDI和ESI的大小就自动增加或减少 取到内存中值的数据宽度大小
如果是 movs dword *** 那么每次就增加或减少4
如果是 movs word *** 那么每次就增加或减少2
如果是 movs byte ***那么每次就增加或减少1

STOS指令:AI/AX/EAX的值存储到[EDI]指定的内存单元

STOS BYTE PTR ES:[EDI]              简写: STOSB
STOS WORD PTR ES:[EDI]              简写: STOSW
STOS DWORD PTR ES:[EDI]             简写: STOSD

将寄存器EAX中的值放到EDI指定的内存中去

这里根据取不同的宽度所以取EAX中不同的位数
BYTE = AI
WORD = AX
DWORD = EAX

MOV EAX,12345678
MOV EDI,12FFC4
STOS BYTE PTR ES:[EDI]              观察EDI的值和EDI对应内存中的值
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]

STOS 每执行一次,EDI的值就自动增加或者减少
如果是 stos byte ... 那么每次就增加或减少1
如果是 stos word ... 那么每次就增加或减少2
如果是 stos dword ... 那么每次就增加或减少4

REP指令:按计数寄存器(ECX)中指定的次数重复执行字符串指令

上面的MOVS指令和STOS指令一次最多也只能移动4个字节,如果想移动大片的内存,那么就需要REP指令了

按计数寄存器(ECX)中指定的次数重复执行字符串指令,计数完毕后ECX会置零

MOVS ECX,0x10   ->16进制 '10' 对应10进制 16 也就是执行16次
REP MOVSD
MOVS ECX,0x10 
REP STOSD

延伸

通用寄存器的通常用处:
EAX 通常用来作为返回值
ECX 通常用来作为计数器
ESP EBP 通常用来作为 堆栈的栈顶和栈低
ESI EDI 通常用做内存 复制的源地址和目标地址

相关文章

  • 4. 汇编-内存复制指令

    4. 汇编-内存复制指令 标志寄存器 EFL EFL是32位寄存器其中的每一位,含义都是不同的 第十位(从下标开始...

  • ARM汇编指令

    关于arm64汇编指令,如下图 汇编指令可以汇总如下:(后续会更新) 关于内存读写指令 注意:读/写 数据是都是往...

  • 《汇编快速入门到实战》分享笔记

    1.认识汇编 汇编语言 汇编语言组成image.png 概念 存储器 指令和数据存贮的地方,也就是内存 指令和数据...

  • 内存屏障与内存模型

    内联汇编 x 内存模型与内存屏障 program ordering vs. memory ordering 指令序...

  • 内存复制指令

    全写简写注释movs byte ptr es:[edi],byte ptr ds:[esi]movsb移动1个字节...

  • MachO与动态链接

    前置知识 符号 静态链接 汇编基础 虚拟内存 跳转指令的编码:PC相对地址与绝对地址 汇编跳转指令:直接跳转与间接...

  • arm64汇编篇-01CPU与内存简介

    CPU在汇编中的重要性 在汇编中,硬件相关最为重要是CPU/内存 在汇编中,大部分指令都是和CPU与内存相关的 a...

  • java 对象基础信息(创建过程,内存结构,如何定位,分配)

    对象创建过程 对应汇编指令 内存结构 Object o = new Object();在内存中的组成为: mark...

  • 逆向笔记(三)-汇编指令

    汇编指令 针对汇编来说,汇编指令是必须了解的,而且汇编中汇编指令比较多,但是每一个汇编指令对应的机器码是固定不变的...

  • 16位汇编简记

    汇编: 汇编即是机器指令助记符,机器指令让cpu工作。像是mov、jmp、jcxz等汇编指令都有对应的机器指令。有...

网友评论

    本文标题:4. 汇编-内存复制指令

    本文链接:https://www.haomeiwen.com/subject/wzyrrftx.html