我在url https://cs.senecac.on.ca/~btp100/pages/content/compu.html上读了一些关于C语言的文章。在“分段”一节中,它说:“管理大量字节寻址的一种逻辑技术是分段。分段将内存的某些区域与其他区域区分开来。例如,操作系统将程序信息存储在专用的分段中。”
我不太明白。
例如,如果我有以下程序:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int x = 4;
int y = 5;
printf("%d\n", x+y);
system("PAUSE");
return 0;
}
那么,段代码中存储了什么,段数据中存储了什么,堆栈中存储了什么?请。
非常感谢
发布于 2011-03-03 09:28:27
堆栈是您的局部变量(例如x和y)。代码段用于实际执行的二进制代码。最后,数据段用于您的程序使用的值(例如那里的暂停字符串)。
发布于 2011-03-03 09:28:17
这是依赖于编译器的。但总的来说,假设你有一个实际使用分段的操作系统,你的局部变量x
和y
被引用到SS,你的字符串文字"%d\n“和"PAUSE”被引用到DS,而你的实际汇编代码被引用到CS。
发布于 2011-03-03 09:28:20
这个问题是特定于系统的。例如,段描述符也在32位Windows上使用,但用于传统的16位系统以外的其他目的,在16位系统中需要分段以同时引用不同的存储器区域。
当使用32位宽的指针类型时,32位系统可以寻址整个虚拟地址空间,这就是为什么Windows中的fs
持有诸如TEB和PEB等特殊结构的密钥。然而,在严格意义上,对于平面内存模型,不需要段寄存器。
示例(Windows特定,32位):
mov eax, dword ptr fs:[18h] ; pointer to TEB
mov eax, dword ptr fs:[30h] ; pointer to PEB
例如,在许多现代系统中,cs
和ds
指的是同一区域。
https://stackoverflow.com/questions/5175575
复制相似问题