The two opcodes are the same. That's x86's redundancy. The assembler can choose whatever it likes
A typical instruction of x86 architecture has two opcodes. The first of them has a register as the first operand and a register or a memory location as the second one (that's abbreviated
"reg, reg/mem32"
in the opcode reference or"Gv, Ev"
in the opcode table). The operands for the second opcode are reversed (that's abbreviated"reg/mem32, reg"
or"Ev, Gv"
). This makes sense: the processor must know if it copies to the memory, or from the memory. But when both operands are registers, the encoding becomes redundant:
; mod reg r/m
03C3 add eax, ebx ; 11 000 011
01D8 add eax, ebx ; 11 011 000
There are much more than just reg/reg style like this. See it here
Different assemblers emit different opcodes, so this technique can be used to identify the assembler
Some assemblers allow you to choose the encoding. For example GAS can emit the other encoding if you affix .s
to the end
10 de adcb %bl,%dh
12 f3 adcb.s %bl,%dh