0
是什麼在編碼的差異(ModRM:R/M,ModRM:REG)VS(ModRM:REG,ModRM:R/M)?具體說一下像CMPXCHG和DIVPD這樣的指令。我認爲寄存器和地址總是在第一個字節編碼,然後SIB和第二個字節的位移(如果需要的話)?這裏是我的代碼:的x64指令編碼(R/M,REG VS REG,R/M)
static void WriteRegisterToMemory(ICollection<Byte> bytes, IRegisterToMemoryInstruction instruction, Byte rex)
{
IAddress address = instruction.Address;
Byte register = instruction.Register;
if (address.NeedsRex)
{
rex |= 0x40;
if (address.RexB)
rex |= 1;
if (address.RexX)
rex |= 1 << 1;
}
if (register > 7)
rex |= 0x44; // REX.R
if (rex != 0)
bytes.Add(rex);
bytes.AddRange(instruction.Opcode);
Byte modRM = (Byte)((register % 8) << 3);
modRM |= address.GetModRMAddressByte();
bytes.Add(modRM);
address.WriteScaledIndexByteAndDisplacement(bytes);
}
所以就像這兩個指令編碼完全相同,只是不同的操作碼? (添加到英特爾x64手冊第457頁)
Op/En Operand 1 Operand 2
RM ModRM:reg (r, w) ModRM:r/m (r)
MR ModRM:r/m (r, w) ModRM:reg (r)
編輯後問了另一個問題 –
@RyanBrown好,我真的不明白,你想知道什麼,什麼是「編碼的相同」在這種情況下意味着精確?反正'之間的唯一區別添加[EAX],edx'和'添加EDX,[EAX]'(假設32位)爲操作碼,它們都具有的一個'字節ModRM 10' – harold
我只是不明白,爲什麼他們有(reg然後r/m)和(r/m然後reg)。他們都編碼成一個字節(一般),因此他們並不是真正的兩個不同的操作數... –