x64下的汇编

作者:陆麟
转载请征得作者同意.
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