Эта инструкция обменивает операнды местами. Операнд может находится в памяти или в регистре.
// XCHG rm, r
case0x86:
case0x87:
i_size = opcode_id & 1;
i_op1 = get_rm(i_size);
i_op2 = get_reg(i_size);
put_rm(i_size, i_op2);
put_reg(i_size, i_op1);
break;
Как видно из кода, берется из опкода размер byte|word, прочитываются операнды и записываются обратно в ином порядке.
§ LES, LDS r, rm
Эта инструкция читает 4 байта из эффективного адреса и записываются младшие 2 байта в указанный регистр r (16 бит), а старшие 2 байта либо в регистр ES, либо в DS.
Указать в качестве второго операнда регистр нельзя, будет неопределенный ответ, это считается ошибкой. На самом деле указать можно, но процессор себя поведет неадекватно в этом случае, а точнее, он сгенерирует ошибку #UD, undefined instruction.