The code was a fossil, written in a hybrid of C and inline assembly by a geophysicist who had long since retired to a cabin without electricity. The error was a General Protection Fault (GPF)—the 386’s way of screaming, “You touched memory you don’t own.”
After patching, the model ran. It plotted Devonian shale layers for three hours without a single fault.
The disassembly pointed to one instruction: LDS .
And somewhere in a museum, a 386 motherboard smiled, its LDS instruction still perfectly capable of crashing any program that dared to wake it. x86 lds
Eleanor muttered, “Oh, you ancient beast.”
“It poisoned its own segment register,” Eleanor whispered. “Like a snake biting its tail.”
She wrote a small C helper using memcpy to safely read the 32-bit value into a local unsigned long , then manually set DS and BX via __asm —but with interrupts disabled via _disable() . Clunky, but safe. The code was a fossil, written in a
She couldn’t just remove the LDS . The entire linked list traversal depended on far pointers. But she could replace it.
In the spring of 1992, Eleanor, a young and slightly reckless systems programmer, found herself hunched over a beige 386 DX/40. The machine groaned under MS-DOS 5.0, and in front of her was a nightmare: a core dump from a geological modeling program she’d inherited.
A decade later, she’d tell interns: “ LDS loads a pointer and destroys your data segment. Respect it. Then avoid it.” The disassembly pointed to one instruction: LDS
The GPF happened when LDS tried to read from DS:SI —but DS had been clobbered by an interrupt handler. So LDS cheerfully loaded garbage into DS itself, because that’s what LDS does: it writes the segment part of the loaded pointer directly into the DS register. Now DS pointed to an unmapped address. The next instruction—a simple mov ax, [bx] —caused the system to keel over.
The offending line looked innocent: