逆向之汇编(3),内存

  • 数据存哪??
    一个是cpu的寄存器中,
    当数据量大时,还可以存内存

1.每个应用程序都会有自己的独立的4GB空间

如图:
在这里插入图片描述

  • 进程:运行中的程序
    在这里插入图片描述
    这里的4GB并非“真正的分了4GB内存条”,
    意味着,在这个进程A中,当真正读、取某个内存时,操作系统将要用的内存映射到真正的物理内存中。
  • 物理内存:不是真正的内存条,与它还有一个映射。

我们在编程时所说的“内存”就是所谓的“假的”4GB内存

1字节=8bit
1kb=1024字节
1MB=1024KB
1GB=1024MB

2.内存地址

  1. 内存太大没法起名字子(不像32位寄存器),所以只能编号。
    当我们想从内存中存储数据,或者从内存中读取数据时,必须要用到这个编号,就像写信必须要写收信人地址一样。
  2. 编号也叫内存地址
    在这里插入图片描述

内存地址(编号)指向的内存单元 大小
一个字节

8位(十六进制)*

为什么最大内存是4GB??

---------与内存地址的数据宽度有关
{ FFFF FFFF+1(当无存储时)}*8(一个字节8位)十六进制--------->十进制X
X/8---------------整个代表的内存共有多少字节
X/8/1024-------------共有多少KB
X/8/1024/1024
X/8/1024/1024/1024

二.MOV指令

1.立即数------------》内存

mov 数据类型 ptr ds:[ 内存地址],数据

注:上式中的内存不能随意调用,必须是已申请了的。

在这里插入图片描述
注:

  • 存的是一位:byte(对应寄存器后面的个数字,8位—二进制)
  • 二字节:word(对应寄存器后面的个数字,16位–二进制)
  • 四字节:dword(对应寄存器的个数字,32位—二进制)

注:(上图中)
DWORD:表明存储的数据是四个字节(32位),
【22FFC4】:是一个编号,代表一个字节。
此时,内存从该编号开始连续存储。
在这里插入图片描述
2.寄存器—》内存

mov dword ptr ds[0022FFC4],ecx

在这里插入图片描述

mov word ptr ds:[0022FFC4],ax

  • 已将该内存地址的数据初始化FFFFFFFF
    在这里插入图片描述

mov byte ptr ds:[0022FFC4],AL
在这里插入图片描述

3.立即数----》内存

mov dword ptr ds:[0022FFC4],1234
在这里插入图片描述

4.汇编语言一般没有内存到内存的

三.内存地址的五种形式

  1. 【立即数】
  2. 【reg】,reg是寄存器(的数值),可以是8个通用寄存器的任意一个

MOV EBX,0022FFC4
MOV DWORD PTR DS:[0022FFC4],12345678
MOV EAX,DWORD PTR DS:[EBX]

在这里插入图片描述

  1. 【reg+立即数】
  2. 【reg+reg*{1,2,4,8}】
  3. 【reg+reg*{1,2,4,8}+立即数】

这是c语言中数组定义的常见方式
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_51325053/article/details/117575771
Recommended