I've been trying to understand the purpose of the 0x40
REX opcode for ASM x64 instructions. Like for instance, in this function prologue from Kernel32.dll:
As you see they use push rbx
as:
40 53 push rbx
But using just the 53h
opcode (without the prefix) also produces the same result:
According to this site, the layout for the REX prefix is as follows:
So 40h
opcode seems to be not doing anything. Can someone explain its purpose?
the
04xh
bytes (i.e.040h
,041h
...04fh
) are indeed REX bytes. Each bit in the lower nibble has a meaning, as you listed in your question. The value040h
means thatREX.W
,REX.R
,REX.X
andREX.B
are all0
. That means that adding this byte doesn't do anything to this instruction, because you're not overriding any default REX bits, and it's not an 8-bit instruction with AH/BH/CH/DH as an operand.Moreover, the
X
,R
andB
bits all correspond to some operands. If your instruction doesn't consume these operands, then the corresponding REX bit is ignored.