每个进程拥有4GB的虚拟内存空间,在真正使用到时才会映射到物理内存上。
为什么是4GB?
4GB是由内存地址决定的,当内存地址为32位时(0x00000000),决定了寻址范围最大为0xFFFFFFFF+1(因为0x00000000也是一个地址,所以需要+1),最终结果为0x100000000。一个字节占8位,乘以8计算出0x800000000,将其转换为十进制为34359738368,除以8(得到整块内存能寻找的字节)结果为4294967296,再除以1024(得到KB),再除以1024(得到MB),再除以1024(得到GB)。
内存必须有地址,这个地址的宽度是32位(bit)的。每个内存地址对应的内存有1个字节也就是8位(bit),可存放8个0和1(二进制)。
【MOV指令】
需要注意宽度必须相等
1.立即数到寄存器
2.寄存器到寄存器3.寄存器到内存
4.内存到寄存器
5.立即数到内存
在汇编中,绝大部分的指令是不允许从内存到内存的。
注意:当MOV指令操作寄存器时,计算机是知道宽度的。但是当我们操作内存地址时,需要告诉计算机我们要操作的宽度是多少。
例:
写1个字节
mov byte ptr ds:[0x00004000],0x1
解:
mov:操作指令
byte:一个字节
word:两个字节
dword:四个字节
ptr ds:[0x00004000]:告诉计算机,我要操作内存地址了。要操作的内存地址是0x00004000。
每个进程都有自己4GB的虚拟内存空间,当我们操作内存地址时不能乱写,我们需要找到程序已经申请的,或者在我们开发的时候申请内存以后才来使用,使用OD做练习时可以看OD右下角的堆栈窗口,堆栈窗口出现的地址一定是程序申请过的,我们是可以使用的。