The %ds and %es selector MUST always contain the same value or some system routines may crash when called. The %fs selector is preloaded with the DOSMEMSELECTOR variable at startup, and it MUST be restored after use, because again FPC relys on this for some functions. Luckily we asm programmers can still use the %gs selector for our own purposes, but for how long ?
See also: get_cs, get_ds, gett_ss, allocate_ldt_descriptors, free_ldt_descriptor, segment_to_descriptor, get_next_selector_increment_value, get_segment_base_address, set_segment_base_address, set_segment_limit, create_code_segment_alias_descriptor