Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!utgpu!water!watnot!watmath!clyde!rutgers!ames!oliveb!intelca!mipos3!bverreau From: bverreau@mipos3.UUCP Newsgroups: comp.sys.intel Subject: Re: 386 instruction encoding query Message-ID: <464@mipos3.UUCP> Date: Fri, 13-Feb-87 17:50:36 EST Article-I.D.: mipos3.464 Posted: Fri Feb 13 17:50:36 1987 Date-Received: Sun, 15-Feb-87 00:47:34 EST References: <4979@watmath.UUCP> Distribution: na Organization: Intel, Santa Clara, CA Lines: 18 Summary: 386 encoding conflict In article <4979@watmath.UUCP>, kadorken@watmath.UUCP (Keith A. Dorken) writes: > The 386 programmers reference manual has for the full encoding of > the "jo" instruction the following bit pattern: > 0x0F 0x80 . The bit encoding for pushing > a segment register (long form; 3-bit segment register name) is: > 0x0F 10 seg3 000 where seg3 is one of {es, cs, ss, ds, fs or gs}. > > Thus the two byte opcode 0x0F 0x80 could be interpreted as > being either a "jo" instruction or the long form instruction "push es". > (the 3-bit encoding for es is 000). Executing this instruction results > in a jump, not a push. However, other encodings (using the other 3 bit > segment register names) do result in a value being pushed on the stack. > This is a documentation error in the reference manual. The longer encoding for the PUSH segment register instruction (as well as POP) is intended for use solely with the FS and GS segment registers. You should use the one byte form of the instruction for PUSH ES, CS, SS, or DS.