To by pak už nešlo programovat v C. V C může tentýž pointer ukazovat na read-only data, na read-write data, na zásobník nebo na haldu (nebo i na funkci ... ale ten nemůžeš dereferencovat, pouze volat). A když bys ten pointer dereferencoval, tak bys musel rozhodnout, kam ten pointer patří a podle toho použít segmentový registr.
Buď bys to testoval automaticky ve vygenerovaném kódu --- to by ti zpomalovalo každé hrábnutí do paměti přes pointer.
Nebo bys musel programátora nutit, aby ke každému pointeru určoval, do jakého segmentu patří --- a pak by ti na tom obyčejné C programy nechodily.
Třeba by to šlo programovat ve starém Fortranu (nemá pointery vůbec) nebo v původním Wirthově Pascalu (má pointery, ale nejde tam pointerem ukazovat na jiné proměnné nebo pole, pouze na haldu; ukazování pointerem na proměnné tam přidal snad až Borland v jejich Turbo Pascalu).
Třeba OS/2 v kernel módu má odlišnou bázi SS a DS segmentu. Má to blbý důsledek, nejde tam napsat něco jako void f() { int X; int *P = &X; ... } --- protože do P se uloží adresa vůči SS segmentu, ale v momentě, kdy se to dereferencuje, tak se použije segment DS --- takže v momentě, kdy se odkaz na zásobník v kódu vyskytne, musí se ten kód ručně upravovat a musí se k tomu uměle přičítat rozdíl DS a SS bází.
Čtyřmi segmentovými registry DS,ES,FS,GS vlastně stejně současně nenaadresuješ 16GB. Každý z nich má totiž pouze 32-bitovou bázi a délku. Jediná možnost, jak byses přes těch 4GB dostal, by bylo, že bys opravdu musel při každém přístupu do paměti nahrát segmentový register a při výpadku segmentu jiný segment odmapovat, abys pro nový segment udělal místo v tom 4G rozsahu.