作�:陆麟
转载请征得作者同�.
2017.11.26
x64下,C、C++的代码里面不准用__inline assemble了,日子怎么过?
注意intrin.h, 这个HEADER里面,提供了大量的,汇编等价的函数�
这是编译器厂商,为了阻止C/C++代码中嵌入汇编,同时又必须为编译� 灵活性减少受损所付出的代价�
下面这堆函数看出来有什么蹊跷么� 对,这些都是虚拟机的指令集。。�
其中相当一部分是VS2005 SP1以后才开始提供的哦。而最新的VS2017的intrin.h,提供了相当多的ARM/ARM64/X64/X86指令。�
__MACHINEX64(unsigned char __vmx_vmclear(unsigned __int64*))
__MACHINEX64(unsigned char __vmx_vmlaunch(void))
__MACHINEX64(unsigned char __vmx_vmptrld(unsigned __int64*))
__MACHINEI(void __vmx_vmptrst(unsigned __int64 *))
__MACHINEX64(unsigned char __vmx_vmread(size_t, size_t*))
__MACHINEX64(unsigned char __vmx_vmresume(void))
__MACHINEX64(unsigned char __vmx_vmwrite(size_t, size_t))
__MACHINEI(void __vmx_off(void))
__MACHINEX64(unsigned char __vmx_on(unsigned __int64*))
__MACHINEI(void __svm_clgi(void))
__MACHINEI(void __svm_invlpga(void*, int))
__MACHINEI(void __svm_skinit(int))
__MACHINEI(void __svm_stgi(void))
__MACHINEI(void __svm_vmload(size_t))
__MACHINEI(void __svm_vmrun(size_t))
__MACHINEI(void __svm_vmsave(size_t))
__MACHINEI(void __halt(void))
__MACHINEI(void __sidt(void*))
__MACHINEI(void __lidt(void*))
__MACHINEI(void __ud2(void))
__MACHINEI(void __nop(void))
至于这些指令怎么用。。�
参考文献是INTEL、AMD的CPU手册�
intel的:
https://software.intel.com/zh-cn/articles/intel-sdm
尤其是Volume 3系列
Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A-D: System Programming Guide
AMD的:
http://developer.amd.com/resources/developer-guides-manuals/
请关注Volume 2
AMD64 Architecture Programmer's Manual Volume 2: System Programming