Programming some small DOS programs has made me learn a bit more about it, and real-mode programming in general.
For example, I thought DOS was essentially a single-process, full memory ownership sort of affair (sans resident code hacks), but that's not true at all. Multiple programs can be loaded at the same time, with DOS keeping tabs of memory allocations. The basic variant of this being one program starting another, and then the second exiting, returning to the first.
(But let's not make $-terminated strings a thing again! Or length-prefixed, \r-terminated strings, wat)