Сегменты и смещения - это устаревшие функции до появления защищенного режима на чипах x86.
Получив защищенный режим, они начали использовать селекторы , чтобы уйти от того факта, что адреса памяти теперь виртуальные, а не физические. И в настоящее время они обычно используют плоскую модель, у которой очень мало селекторов, каждый с большим (а иногда и одинаковым) резервным блоком памяти.
Способ получения адреса переменной в C - с помощью оператора &
. Например:
#include <stdio.h>
int main (void) {
int xyzzy = 42;
printf ("Address is %p\n", &xyzzy);
return 0;
}
выводит Address is 0xbfe8232c
в моей системе.
Поскольку язык C не поддерживает напрямую этот устаревший сегмент / смещение, он был оставлен для реализации и сильно зависел от используемой модели памяти. Например, некоторые компиляторы предоставляют функции, такие как getDS()
, для предоставления вам регистра сегмента данных, другие вынуждены прибегать к встроенной сборке.
В зависимости от модели (крошечная, маленькая, средняя, большая и т. Д.), Существуют различные способы ее решения, ни один из которых я не буду здесь подробно описывать, поскольку они бесполезны для подавляющего большинства разработчики вокруг в настоящее время: -)
Один пример обручей, через которые нам пришлось прыгать, можно найти в статье 10-битного руководства по компиляции 80x86 Алексея Фрунзе , в которой подробно описывается, как все процессы сегментации работают в реальных условиях. режим и различные модели памяти, используемые для его поддержки.