When you switch to FWORD PTR, what you do is jump forward, that is, a pointer memory containing a 16-bit βselectorβ (which refers to writing a segment to GDT or LDT) and a 32-bit offset from the beginning segment to which the selector belongs. A segment descriptor contains data about a segment, of course ... including where in memory it starts.
During the transition, the CPU performs some privilege checks to make sure that the selector is valid and allowed (there are privilege levels, segment types, etc.), then it efficiently loads the first 16 bits into CS, and the rest into EIP, From now on, code Addresses effectively add the base address of the CS segment to them to turn them into virtual addresses.
source share