Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory x86程序集是否正确使用了数据段?_Memory_Assembly_X86_Segments - Fatal编程技术网

Memory x86程序集是否正确使用了数据段?

Memory x86程序集是否正确使用了数据段?,memory,assembly,x86,segments,Memory,Assembly,X86,Segments,我一直在开发一个32位操作系统,刚刚实现了一个ELF加载程序。我可以加载可执行文件,但是我希望运行的程序每个都有自己的数据段。现在从我在32位保护模式下的研究中收集到的数据段指的是64k块,对吗?假设我将DS设置为16,代码类似于mov dword eax,[测试]。处理器得到的测试是什么样的(DS*0xFFFF)+测试对吗?所以,如果test为0,那么它读取的实际地址将是983025或0xEFFF1?这是对的,还是我完全错了?既然您正在开发自己的操作系统,数据段、代码段和堆栈段几乎可以是您喜欢

我一直在开发一个32位操作系统,刚刚实现了一个ELF加载程序。我可以加载可执行文件,但是我希望运行的程序每个都有自己的数据段。现在从我在32位保护模式下的研究中收集到的数据段指的是64k块,对吗?假设我将DS设置为16,代码类似于mov dword eax,[测试]。处理器得到的测试是什么样的(DS*0xFFFF)+测试对吗?所以,如果test为0,那么它读取的实际地址将是983025或0xEFFF1?这是对的,还是我完全错了?既然您正在开发自己的操作系统,数据段、代码段和堆栈段几乎可以是您喜欢的任何内容

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

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


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

现在您正在开发自己的操作系统,数据段,代码段和堆栈段几乎可以是您喜欢的任何内容

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

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


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

否数据段不是64KB。在32位模式下,这些几乎是过时的。是的,我认为内存地址完全关闭了,我不知道我读过了,但它一定是其他架构。那么你是说这是没有必要的?CPU如何计算char*ptr;ptr[0]=2;?请参阅否。数据段不是64KB。在32位模式下,这些几乎是过时的。是的,我认为内存地址完全关闭了,我不知道我读过了,但它一定是其他架构。那么你是说这是没有必要的?CPU如何计算char*ptr;ptr[0]=2;?看见