Looking through 3 versions of the references, I can't seem to find a clear description of the semantics that covers all forms of the instruction. Vol. 2B says that "the operand-size attribute of the current code segment determines the amount the stack pointer is decremented (2, 4, or 8 bytes)." Yet, the description of pushing immediate values states, "If the source operand is an immediate and its size is less than the address size of the stack, a sign-extended value is pushed on the stack."
Does this imply that the address-size attributeof the stack segment cannot be larger than the operand-size attribute of the code segment?
The computation of the operand sizes for segment registers other than FS and GS seems a bit ambiguous as well. I have heard that there are quite a few errors in the documentation of PUSH, but have never verified this, nor have I found the corrections anywhere.
Working on a code analyzer, so I now need to hammer this out. Does anyone know of a complete, consistent, and correct description of PUSH?
Thanks for any help.