1

你好!目前我正在学习组装的基础知识。早些时候我使用的是 TASM 和 Intel 语法。在那里我不得不以某种方式初始化堆栈。但现在我使用的是 GNU 汇编器和 AT&T 语法。我查看了很多示例,没有看到任何堆栈的声明/初始化。我想知道我是否必须这样做?或者,可能是,它是在没有我帮助的情况下制作的?如果是这样,它究竟是如何自动初始化的?在数据段中获取重要信息是否存在风险?我也没有注意到任何关于堆栈的指令。

提前感谢您的回答!哦,还有一件事:有没有关于类 Unix 系统的 ASM (GAS) 编程的好书?

4

1 回答 1

0

具有虚拟内存的操作系统处理堆栈的方式与没有虚拟内存的操作系统处理堆栈的方式有些不同。

  • 没有 VM(例如 DOS、µClinux !MMU):您为堆栈保留了一些物理空间。在 DOS 中,这取决于您使用的内存模型,对于较大的内存模型,您将分配一些内存并将 SS(堆栈段)指向它。在 µClinux 中,您会将堆栈大小保存在可执行文件格式头的字段中,请参见bFLT格式的示例。
  • VM → 堆栈动态增长,达到可配置的限制(参见ulimit -sLinux)。由于每个进程都有自己的虚拟地址空间,因此堆栈和任何其他映射的虚拟内存区域之间存在大量空间。
于 2011-05-29T14:05:48.677 回答