Assembly 操作码ff/4将哪个值提供给eip
我试图模拟Assembly 操作码ff/4将哪个值提供给eip,assembly,x86,Assembly,X86,我试图模拟jmp(操作码ff/4)的操作。 当参考英特尔80386手册时,我发现: IF instruction = near indirect JMP (* i.e. operand is r/m16 or r/m32 *) THEN IF OperandSize = 16 THEN EIP <- [r/m16] AND 0000FFFFH; ELSE (* OperandSize = 32 *) EIP <- [r/m32]; FI;
jmp(操作码ff/4)
的操作。
当参考英特尔80386手册时,我发现:
IF instruction = near indirect JMP
(* i.e. operand is r/m16 or r/m32 *)
THEN
IF OperandSize = 16
THEN
EIP <- [r/m16] AND 0000FFFFH;
ELSE (* OperandSize = 32 *)
EIP <- [r/m32];
FI;
FI;
我需要直接获取%eax
的值,而不是访问地址0x1000063来获取0x00fcff10。
这和手册不冲突吗
如果r/m指的是地址,我该怎么办?
eip=M[r/M]
或eip=M[M[r/M]
?写得相当混乱
它实际做的是将r/m
操作数的值写入eip
。这是寄存器还是内存操作数的直接值取决于它是哪种类型的r/m
操作数,这取决于编码它的类型(特别是在mod
字段上)
因此,例如,
ffe0
将是jmpeax
(不是来自内存)<代码>FF 20将是jmp[eax]
写得相当混乱
它实际做的是将r/m
操作数的值写入eip
。这是寄存器还是内存操作数的直接值取决于它是哪种类型的r/m
操作数,这取决于编码它的类型(特别是在mod
字段上)
因此,例如,
ffe0
将是jmpeax
(不是来自内存)<代码>FF 20将是jmp[eax]
写得相当混乱
它实际做的是将r/m
操作数的值写入eip
。这是寄存器还是内存操作数的直接值取决于它是哪种类型的r/m
操作数,这取决于编码它的类型(特别是在mod
字段上)
因此,例如,
ffe0
将是jmpeax
(不是来自内存)<代码>FF 20将是jmp[eax]
写得相当混乱
它实际做的是将r/m
操作数的值写入eip
。这是寄存器还是内存操作数的直接值取决于它是哪种类型的r/m
操作数,这取决于编码它的类型(特别是在mod
字段上)
因此,例如,ffe0
将是jmpeax
(不是来自内存)FF 20
将是jmp[eax]
这来自“英特尔IA32体系结构软件开发人员手册第2卷”
JMP EAX的最终结果是FF E0这来自“英特尔IA32体系结构软件开发人员手册第2卷”
JMP EAX的最终结果是FF E0这来自“英特尔IA32体系结构软件开发人员手册第2卷”
JMP EAX的最终结果是FF E0这来自“英特尔IA32体系结构软件开发人员手册第2卷”
JMP EAX的最终结果是FF E0您的处理器手册必须非常旧,需要更新。您的处理器手册必须非常旧,需要更新。您的处理器手册必须非常旧,需要更新。您的处理器手册必须非常旧,需要更新。
%eax=0x100063
(%eax)=0x00fcff10(a wrong address)
IF near jump
THEN IF near relative jump
THEN
tempEIP ← EIP + DEST; (* EIP is instruction following JMP instruction*)
ELSE (* near absolute jump *)
tempEIP ← DEST; **<----- this is what you expect to happen**
FI;
IF tempEIP is beyond code segment limit THEN #GP(0); FI;
IF OperandSize = 32
THEN
EIP ← tempEIP; **<----- here it is assigned**
ELSE (* OperandSize=16 *)
EIP ← tempEIP AND 0000FFFFH;
FI;
FI:
REG/OPCODE = 100b = 4
MOD = 11b = 3
R/M = 000b = 0
==> ModR/M Byte (in Hexadecimal) = E0h (taken from Table 2-2. 32-Bit Addressing Forms with the ModR/M Byte)