需要一些x86程序集的帮助

mou*_*sey 2 c x86 assembly

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)

我只是想了解宏在下面的代码中做了什么?

Mat*_*ery 5

许多操作码之后是一个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指令.