COM files used the โflat memory modelโ in the sense that the segment registers were all set by DOS when the program was loaded to point to the same segment, and all codes and pointers were, by convention, relative to this one value in segments.
The EXE file format, on the other hand, allows you to load segments with different offsets. DOS will not set default segment registers; this was due to the code itself. 16-bit EXE code is much more complicated because the code must control the register of segments.
Currently, a lot of EXE code more or less ignores segment registers; 32 or 64-bit registers do not need to be added to the segment register to generate a useful address.
source share