MODRM_EAX_06 MACRO ;/* [EAX], with reg/opcode: /6 */
BYTE 030h
ENDM
Run Code Online (Sandbox Code Playgroud)
字节030h做什么?
有关其他信息,请使用此宏
void vmxPtrld(u64 addr)
VmxPtrld PROC StdCall _addr_low,_addr_high
mov eax,8
add eax,ebp
vmx_ptrld
MODRM_EAX_06
ret
VmxPtrld ENDP
Run Code Online (Sandbox Code Playgroud)
我只是想了解宏在下面的代码中做了什么?
许多操作码之后是一个ModR/M字节,它被分成3个部分:前两位是"Mod",后三位是"Reg",后三位是"R/M".
"Mod"和"R/M"部分的组合指定寄存器和寻址模式; "Reg"部分可以指定另一个寄存器,或者在某些情况下,可以指定对操作码的进一步扩展.
在这种情况下,ModR/M字节如下所示:
0 0 1 1 0 0 0 0
\_/ \___/ \___/
Mod Reg R/M
Mod位00和R/M位000意味着寻址模式[EAX](在32位模式下).
其余的Reg位是6十进制的.因此MODRM_EAX_06.
要完全了解示例中的内容,您需要知道vmx_ptrld宏的作用.假设这确实是@sixlettervariables找到的,vmx_ptrld产生字节0F C7.
0F是两字节操作码的第一个字节.在许多情况下,下一个字节将完成操作码; 但C7表示必须从ModR/M字节的Reg字段读取更多位,以确定操作码是什么.所以最终的操作码0F由随后C7接着6从MODR/M字节的Reg字段,写成0F C7 /6英特尔手册(可以发现这里).
0F C7 /6是的VMPTRLD,所以你的日常工作的真正含义是:
mov eax,8
add eax,ebp
vmptrld [eax]
ret
Run Code Online (Sandbox Code Playgroud)
据推测,它是为了旧的汇编程序的利益而编写的,它们不了解(相对较新的)VMX指令.