获取字符串的偏移量和段地址

时间:2011-06-09 06:53:53

标签: c


  我想使用C程序打印偏移量和段地址

示例: -

char st[4096]="Stack Over Flow\0";
char st1[4096]="Knowledge beyond boundaries";
void main (void)
{
}

""Stack Over Flow\0"
"Knowledge beyond boundaries"

这两个字符串,我想用c程序计算这些字符串的偏移量和段地址并打印出来。他们是否有办法做到这一点  * 请回答*

1 个答案:

答案 0 :(得分:2)

在保护模式进入x86芯片之前,段和偏移是过时的功能。

一旦他们获得了保护模式,他们就开始使用选择器来摆脱内存地址现在是虚拟而非物理的事实。他们现在通常使用扁平模型,它只有很少的选择器,每个选择器都有一个大的(有时是相同的)后备内存块。

在C中获取变量的地址的方式是使用&运算符。例如:

#include <stdio.h>
int main (void) {
    int xyzzy = 42;
    printf ("Address is %p\n", &xyzzy);
    return 0;
}

在我的系统上输出Address is 0xbfe8232c

由于C语言不直接支持这个过时的段/偏移量,因此它留给了实现,并且在很大程度上取决于使用的内存模型。例如,一些编译器提供getDS()之类的函数来为您提供数据段寄存器,其他编译器则必须使用内联汇编。

根据模型(小型,小型,中型,大型等),有各种方法可以解决这个问题,由于它们对绝大多数人没用,所以我在这里都没有详述如今的开发者: - )

我们不得不跳过的箍的一个例子可以在80x86 16-bit Compiling How-to, by Alexei A. Frounze中找到,这篇文章详细说明了所有分段内容在实模式下的工作原理以及用于支持它的各种内存模型。