汇编内存分配

时间:2010-08-17 00:07:27

标签: assembly memory-management

我正在尝试学习汇编语言,我需要澄清一些事情。如果我错了,请纠正我,因为我对装配知之甚少。

我观看的所有教程都将汇编程序的变量分配给内存地址,如0x0000,我可以理解你必须在程序集中手动分配内存地址,但是你怎么知道要使用哪个地址?

显然从可能的最低内存地址开始是有意义的,但是如果你分配的变量大于0x0000的可用内存呢?有问题的变量会延伸到0x00010x0002吗?如果它确实不会弄乱其他变量分配具有相似编号的空格(或者你不应该将它们分配给它们那么近)?

如果我在程序集中同时运行两个程序(在现代操作系统中)并且我在两个程序中使用了相同的内存地址,那么一个程序是否与另一个程序发生冲突,或者操作系统是否只分配了一个程序内存地址,无论程序中实际写入了什么内容?

感谢有关该主题的任何信息。

3 个答案:

答案 0 :(得分:19)

问题的第二部分(在大多数现代操作系统上)的答案是虚拟内存。

您从具有物理内存的硬件层开始。那是你用手指实际戳的东西。这就是操作系统所看到的。操作系统允许您在称为虚拟内存的抽象上运行进程。

每个进程都有自己的虚拟内存空间。所以它可以假装它是唯一运行的进程,它有大量的内存。然后,每次访问内存时,都会提供一个虚拟地址,该地址将映射到物理地址。操作系统保存一个表,其中哪个虚拟地址映射到RAM中的实际物理地址。通常,出于性能原因,这也是通过一些特殊硬件(MMU,内存管理单元)完成的,但您也可以在软件中100%完成。

所以当你在程序中说0x000时,那是一个虚拟地址。当您读取或写入时,计算机会将其转换为物理地址。因此在另一个进程中,相同的虚拟地址0x000映射到不同的物理地址。该系统允许您编写程序,而无需确切知道可用的RAM数量,或者程序将加载到哪个地址。它还可以防止程序破坏属于另一个程序的内存。

至于第一部分,绝对。不同类型的数据占用不同的内存量。在布局数据结构时,您必须知道需要多少空间。还要记住字节对齐问题。多字节数据类型(例如浮点数)通常必须从可被2或4整除的地址或存储浮点所需的字节数开始 - 这是处理器或RAM的要求。因此,您不能只是将所有数据压缩在一起,一个字节在下一个字节之后,您必须按照特定的顺序进行布局,例如,如果您想最大限度地减少未使用的内存,那么将它拼凑在一起。

答案 1 :(得分:5)

这不是答案,但在本书中有答案。我只能推荐它。它将教你基础知识,就像名字从头开始编程一样。

ProgrammingGroundUp

答案 2 :(得分:1)

取决于您正在谈论的目标和内存类型(RAM,ROM等)。如果您正在谈论RAM是一个小型嵌入式项目,您可能只需要跟踪一些文件,并且micro的数据表将告诉您各种内存区域寻址。在存在多个“模块”的情况下,您将使用链接器将目标文件链接到可执行文件中。链接器可以重新分配内存地址,使它们不重叠,或者您可以拥有一个中心文件,其中定义了所有内存位置,其他模块将其用作资源。抱歉。这是一个有很多答案的大问题。