【发布时间】:2014-05-21 12:54:40
【问题描述】:
假设您处于 x86 保护模式,因此启用了分段。
考虑这段代码:
// main
int stackvar, *ptr;
// ptr may contain the address of a variable located in the stack segment
ptr = &stackvar;
// ptr may contain the address of a variable in the heap (data segment)
ptr = (int *) malloc(sizeof(int));
我读到ptr 只包含偏移量(即虚拟地址),不包含段的指示。这意味着它应该与段基地址结合以获得线性地址。是真的吗?
// let %eax = ptr
asm("movl (%eax), %ebx"); // which segment is used by this instruction?
如果%eax 只包含偏移量,而不包含段的指示,机器如何知道应该应用哪个段基地址(例如数据或堆栈段基地址)?
【问题讨论】:
-
printf("%p\n", (void*)ptr); -
286操作模式被广泛忽视。用操作系统的名称和使用它的编译器来招待我们。
-
也许添加一个编译器/OS标签,这肯定不是标准C规定的。
-
@HansPassant - OS2/Warp 和适当的编译器不是答案吗?一眼看去,也许 EMX 作为编译器。
-
关于默认段寄存器的知识是在处理器中硬编码的。段寄存器也适用于其他保护模式,但它们包含的不是线性地址的一部分,而是描述符表 (e&oe) 中的一个条目。
标签: c assembly x86 memory-address