Section 4.7.2 of the the AMD64 Developer Manual Volume 2 (System Programming) which describes Code-Segment Descriptors in legacy modes states:
Code segments establish the processor operating mode and execution privilege- level. The segments generally contain only instructions and are execute-only, or execute and read- only. Software cannot write into a segment whose selector references a code-segment descriptor.
If code segments are the only executable segments, and they cannot be written to, how did executable stacks on 32 bit systems work?