X86汇编正确的数据段使用



我一直在开发一个32位操作系统,刚刚实现了一个ELF加载器。我可以加载可执行文件,但我想运行程序,每个都有自己的数据段。现在,从我从32位保护模式的研究中收集到的数据段指的是一个64k块,对吗?假设我将DS设置为16,并拥有像mov dword eax,[test]这样的代码。处理器得到什么是在测试像(DS * 0xFFFF) +测试对吗?所以如果test是0那么它实际读取的地址应该是983025还是0xEFFF1?这是正确的还是我完全错了

既然您正在开发自己的操作系统,那么数据段、代码段和堆栈段几乎可以是任何您喜欢的。

在386 PE中,段寄存器"指向"一个驻留在物理内存中的描述符表,其中每个段被分配8个字节(x64中可能是16个字节)来定义基址,读/写/执行标志和段大小。

通常这些极限被设置为0和2^32(-1),这也被称为平坦模式。

即使在使用linux/cygwin等兼容的gcc时,也很可能从分段架构中受益,因为知道每个内存访问都使用一个默认段,这取决于基本寄存器。只要使用mov [ebp + ... ]mov [esp + ...]作为基寄存器访问所有局部变量,就使用堆栈段。这可以在异常处理中用于区分堆栈损坏与堆损坏。它可以用于自动增长数据/堆栈段等。它可以用于为应用程序提供分离的数据区域——也许可以通过分段实现内存映射文件API——而不是linux,其中fs:和gs:是为内核保留的。

相关内容

  • 没有找到相关文章

最新更新