计算机内存

引言

计算机的内存是一块连续的存储空间,存储空间按编号划分为存储单元了,每一个单元都有独立的编号,每一个独立的编号分别存储一个字节(8bit)的数据。

寄存器与内存的区别

我们可以简单的认为:快速算盘叫做寄存器。慢速的称为内存。

其实他们的结构差不多,都是定宽的,最重要的一点,寄存器速度非常快,价格非常昂贵,所以在 CPU 内部。

做的数量也很有限。常用的只做了 8 个:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。

内存速度慢,很便宜,所以数量做的非常庞大。寄存器做的数量非常少,就可以为每个寄存器取个名字。

寄存器,内存

而内存数量太庞大了,没办法给每一个都取上名字,所以只能编号。最后重要的是内存中寄存器的编号是32 位的。这也是我们现在的计算机叫 32 位计算机的主要原因。如果按寄存器的宽度是 32位的话,是不对的,因为还有很多寄存器是大于 32 位的。我们通用的 8 个是 32 位的。而内存地址是固定的 32 位。以前的计算机之所以称为 16 位计算机,就是因为他的内存单元编号是 16 位的。

我们学过的指令 MOV,能操作寄存器和内存。

所以说,汇编可以用一句话概括:汇编就是在寄存器和寄存器或寄存器和内存之间来回移动数据。就是指数据在内存和寄存器间来回流动,流动的多了,代表程序很复杂,比如office 等一些大型软件。

mov eax,0x401000//给 eax 初始化MOV 也可以改成ADD(加),SUB(减),XOR(异或),OR(或),AND(与)。

后面的操作数为源操作数,前面的操作数为目标操作数,最开始是操作码。其实 ADD......这些也是移动指令:把源加上目标然后移动到目标操作数里面去。前面表示操作方式,后面表示寄存器和寄存器或寄存器和内存,但是只能出现一个内存。

比如:ds:[]里面写个数,表示内存单元。ptr 指的是指针 point。word 是两个字节,还有 byte 是一个字节,dword 是四个字节。

写法:byte/word/dword ptr ds:[32 位的数]。

内存修改

其实[]里面不但可以写具体的一个数,还可以写某一个寄存器的值。方括号的通用格式:reg+reg*数+立即数,只要这个值算出来指向哪一个内存单元,就是那个内存单元(现在先记住,不要管为什么,后面会讲)。

第一个寄存器叫做 BASE 寄存器(8 个寄存器都可以),第二个寄存器是 INDEX 也是 8个寄存器之一,后面乘一个数 scale(1,2,4 或 8,也就是 2 的 0 次方,2 的 1 次方,2的 2 次方,2 的 3 次方),后面再加一个数(DISP)。

BASE+INDEX*(1,2,4,8)+DISP

可以有以下5种组合:

BASE

INDEX×(1,2,4,8)

DISP

BASE+INDEX×(1,2,4,8)

BASE+INDEX×(1,2,4,8)+DISP 

每一种组合都可以。 

Q/A

Q:内存地址的用处是什么?

A:当用户运行程序时,cpu 需要不停地去从存储区取代码和数据,这样非常耗时,于是cpu 先将可能用到的代码和数据从存储区全部放入内存,再从内存中取数据和代码。看似多了一个过程,但是从内存中获取比存储区快得多,所以节省了很多时间。

Q:如何使用内存地址?

A:将 32 位数 0x12345678 存入内存中的 0x12FFB8 地址处:

图2-4:内存存储方式

从图 2-4 可以看出:数值的高位存储在内存地址中的高位。

Q:内存地址的表示方法有哪些?

A:内存地址的表示方法有很多,除了上图中的表示方法外,还有其它四种表示方法。以下是内存地址表示方法的组成成员:

  • 位移(Displacement):8位,16位或32位值
  • 基(Base):通用目的寄存器
  • 索引(Index):除ESP外的通用目的寄存器。
  • 比例因子(Scale Factor):1,2,4或8

    下列五种地址模式为常用组合(图 2-3):

  • 位移
  • 基 + 位移
  • (索引×比例因子)+ 位移
  • 基 + (索引×比例因子)+ 位移
图2-5:偏移(有效地址)计算

 

Q:为什么只有5种表示方法,而且比例因子还有限制?

A: 极有可能的原因是(猜测):计算机只识别机器语言,所以我们要将内存地址的表示方法翻译成机器语言才能得到执行。

       组合越多,翻译起来越麻烦,cpu 的技术员们只好订个规矩:只能使用五种表示方法,否则一律不识别。

Q:Scale Factory可以是其它值吗?

A: 不可以是其它值,因为这和存储设计相关。

Q:如果算出的内存地址结果超过32位会怎么样?

A: 如果结果超过32位,则会溢出,则计算机只要取32位。

总结

内存的通用格式:Reg+Reg*比例因子+立即数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值