【问题标题】:Is a data segment always required in a program?程序中是否总是需要数据段?
【发布时间】:2014-04-14 14:05:16
【问题描述】:

我正在学习关于 x86 Pentium 处理器的汇编语言课程,并且正在研究 Linux 系统。我知道程序会被加载到内存中,并且您可以直接在寄存器中执行操作,但我不确定您是否可以完全避免创建数据段。

是或否,然后简要解释为什么会很好。

【问题讨论】:

  • 能否在“...an assembly language course...”上稍微解释一下(两句话就够了) 比如;您是否专注于单个微处理器?它是基于 x86 PC 的吗?根据所讨论的微处理器,“数据段”一词的含义明显不同。
  • 有更好的措辞还是我最近的编辑就足够了?
  • 好动作;现在有道理了。您在本课程中使用哪种操作系统?
  • Linux。再次修改问题。

标签: memory assembly x86 cpu-registers segment


【解决方案1】:

这不是必需的。数据段只是为数据分配的一块内存,因此可以写入和读取。代码段是只读的。如果您尝试写入代码段,硬件将产生中断。但是,汇编代码可以输入内存中的任何地址,如果禁用保护模式,则硬件不会产生中断。

例如,引导扇区在启动时加载到一个非常有限的空间中,在代码字节之间放置变量是很常见的(因为空间非常有限)。有一次我什至编写了一个引导扇区,它调整了自己的字节码以适应从不同磁盘引导的差异。所以这是一个代码使用代码地址作为变量的例子。

但是,虽然您绝对可以避免创建数据段,但 99.99% 的时间您确实会分离出数据段。

您可能还想阅读protected mode 以更好地理解这一点。

【讨论】:

  • 所以基本上你是说在实模式下我可以将变量分配和初始化给数据段以外的段?参考您的第一段。
  • 是的。机器码让你。您的汇编器可能不取决于其设置和版本。此外,这有时是特定于架构的。嵌入式微处理器可以有不同的方式来处理内存页面。
  • 再次;什么芯片?到目前为止,所有 cmets 都是正确的(即使它们相互矛盾),直到我们针对特定芯片建立概念参考框架。
  • 本课程适用于奔腾。我会修改我的问题。
  • 我说的是:x86。没错,其他架构可以有自己的内存访问框架,并且会有所不同。
猜你喜欢
  • 2016-11-29
  • 2013-03-08
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 2021-03-22
相关资源
最近更新 更多