我决定要教我自己组装的语言。

我已经意识到,我的计划将不是编纂,如果我试图改变价值的任何部分注册。

每一篇文章我已经找到说,我的确可以改变的价值至少4段注册,所以为什么?

我真的只关心为什么在这点上,我没有任何真正的目的在改变这些地址。

有帮助吗?

解决方案

你说你有兴趣为什么,以便:

在真实的模式,一个分段是64K"窗口"的物理存储器,这些窗口被分隔的16个字节分开。在保护模式,一段是一个窗口,无论是实际或虚拟存储器,其大小和位置确定的操作系统,并有其他许多属性,包括哪些权限级别的一个进程必须具有进行访问。

从这里开始,我说的一切指的是受保护的模式。

有一个表,内存在所谓的全球性描述表(报告),它是在信息的有关这些窗的大小和位置和其他性被保留。有也可以是当地描述表在每个进程的基础上,他们的工作在一个类似的方式,因此,我将只集中在该报告.

你的价值负载入一段登记被称为 分段选择.这是一个索引入报告或加,有一点的额外安全的信息。当然如果一个程序试图载描述其范围之外的报告,则会发生异常。此外,如果过程中没有足够的权限访问段,或者别的东西是无效的,发生异常。

出现异常时,内核处理。这种例外可能会被视为分割的错误。所以OS杀死你的节目。

还有一个最后的警告:在x86指示设置的,你不能负荷立即价值观纳入段寄存器。你必须使用中间登记或存储器操作或出入的段注册。

MOV DS, 160  ;INVALID - won't assemble

MOV AX, 160  ;VALID - assembles, but will probably result in an
MOV DS, AX   ;exception, and thus the death of your program

我认为这应该指出的是,该结构允许堆段。但据我所知,当涉及到的主流x86操作系统段寄存器的作用只是几个目的:

  • 安全机制,这样作为用户保持空间的过程伤害的每一个其他的或操作系统
  • 处理多个/多核处理器
  • 线当地的存储:作为一个优化,一些操作系统(包括Linux和Windows)段使用登记册线的地方储存(TLS)。由于线共用同一地址的空间,它是很难的一线"知道"在其TLS区域没有采用一个系统调用或浪费的一个登记册...但是,由于分段的注册实际上是无用的,有没有伤害"浪费"他们为了快速TLS。注意到在设置这样一个操作系统可能会跳过这段登记和直接写的描述符缓寄存器,这是"隐蔽"登记使用缓存管/司查找触发引用的段注册,在这种情况下,如果你尝试从阅读该段寄存你不会看到它。

除了从一个分段,每线TLS,真的,只有极少数的分段(倍的数量处理器)的使用,并仅由操作系统。应用程序可以 完全 忽略该段寄存器。

这是由于操作系统的设计,不到任何技术上的限制。有可能是嵌入操作系统要求用户的空间方案的工作与本段的注册,虽然我不知道的任何。

其他提示

您在编写Windows可执行文件吗?

在保护模式(Win32)中,不再使用段寄存器。

参考

  

内存模型也非常重要   不同于过去的日子   16位世界。在Win32下,我们不需要   关心记忆模型或   细分已经!只有一个   内存模型:平面内存模型。   没有更多的64K细分市场。该   记忆是一个很大的连续空间   4GB。这也意味着你没有   使用段寄存器。您   可以使用任何段寄存器   解决内存空间中的任何一点。   这对程序员来说是一个很大的帮助。   这就是Win32组装的原因   编程就像C一样简单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top