代码之家  ›  专栏  ›  技术社区  ›  ubiquibacon

程序集内存分配

  •  13
  • ubiquibacon  · 技术社区  · 14 年前

    我正在努力学习汇编语言,我需要澄清一些事情。如果我在这方面有任何错误,请纠正我,因为我对装配了解不多。

    我看的所有教程都将汇编程序的变量分配给内存地址,如 0x0000

    很明显,从尽可能低的内存地址开始是有意义的,但是如果分配的变量大于当前可用的内存怎么办 0x0000个 ? 有问题的变量会转到 0x0001 0x0002 ? 如果是这样的话,会不会把其他变量分配给类似编号的空间(或者你不应该把它们分配得这么近)?

    如果我有两个写在汇编中的程序同时运行(在现代操作系统中),并且我在两个程序中使用了相同的内存地址,那么一个程序会与另一个程序冲突吗,或者操作系统只是分配了一个可用的内存地址,而不管程序中实际写了什么?

    任何关于这个问题的信息都将不胜感激。

    3 回复  |  直到 14 年前
        1
  •  19
  •   Alex Martini    14 年前

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

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

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

    所以当你在程序中说0x000时,那是一个虚拟地址。当你读或写的时候,它被计算机翻译成一个物理地址。所以在另一个进程中,相同的虚拟地址0x000映射到不同的物理地址。这个系统可以让你写你的程序,而不知道到底有多少内存可用,或你的程序将加载到什么地址。它还可以防止程序破坏属于另一个程序的内存。

    至于第一部分,绝对是。不同类型的数据占用不同的内存量。您必须知道在布局数据结构时需要多少空间。还需要记住字节对齐问题。多字节数据类型(如浮点数)通常必须从可被2或4整除的地址或存储浮点所需的字节数开始—这是处理器或RAM的要求。所以你不能一个字节接一个字节地把所有的数据放在一起,如果你想最小化未使用的内存,你就必须按照特定的顺序来排列数据,就像把拼图拼凑在一起一样。

        2
  •  5
  •   Octavian Helm    14 年前

    这不完全是一个答案,但在这本书中有答案。我只能推荐它。它会教你一些基础知识,就像名字上说的,它是从头开始编程。

    ProgrammingGroundUp

        3
  •  1
  •   jacknad    14 年前

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