C’s memory model, with its use of pointer arithmetic and all, seems to model flat address space. 16-bit computers used segmented memory access. How did 16-bit C compilers deal with this issue and simulate a flat address space from the perspective of the C programmer? For example, roughly what assembly language instructions would the following code compile to on an 8086?
long arr[65536]; // Assume 32 bit longs.
long i;
for(i = 0; i < 65536; i++) {
arr[i] = i;
}
They didn’t. Instead, they made segmentation visible to the C programmer, extending the language by having multiple types of pointers:
near,far, andhuge. Anearpointer was an offset only, whilefarandhugepointers were a combined segment and offset. There was a compiler option to set the memory model, which determined whether the default pointer type was near or far.In Windows code, even today, you’ll often see typedefs like
LPCSTR(forconst char*). The “LP” is a holdover from the 16-bit days; it stands for “Long (far) Pointer”.