Solution for Understanding Instruction Encoding?
is Given Below:
I used a website to encode this:
movw $8, 4(%r8d,%esi,4)
encoding (hex): 67 66 41 C7 44 B0 04 08 00
Thanks to you I nearly understand everything except 2 small points:
- Here we are moving 2 bytes immediate to 4 bytes address. They used C7 opcode which according to the table I have means one of the following:
- mov imm16 to r/m16
- mov imm32 to r/m32
- mov imm32 (sign extended) to r/m64
Why there is no match?
- Why immediate is 2 bytes? according to what?
There is a match. It’s the first one “mov imm16 to r/m16”, because of the
w in the mnemonic
r/m16 means that 16 bits (two bytes) of memory are being read/written. It so happens that you are using a 32-bit effective address to identify which two bytes of memory are to be written, but that’s not part of the
The immediate is two bytes because two bytes are to be written. There would be no point in having more. Though there are some examples, like the third case, where the immediate is shorter than the operand size and is zero- or sign-extended.