64位CPU除了段寄存器以外,其余的都是64位(8字节),64位的通用寄存器在数量上增加了8个,共有16个通用寄存器,其中8个是为了兼容32位的,将原来的名称由E**改为了R**,例如EAX改为RAX,其余8个分别命名为R8~R15;EIP和EFLAGS都改为RIP和RFLAGS;浮点寄存器还是64位,分别是MMX0(FPR0)~MMX7(FPR7);增加了8个128位的多媒体寄存器XMM8~XMM15,XMM0等多媒体寄存器又是256位寄存器YMM0等的低128位。
RAX等8个通用寄存器如果需要取其中的低32位、低16位、低8位可以使用相应的寄存器进行存取,例如对于RAX来说分别是EAX、AX、AL;R8等后来按序号命名的寄存器取64位、低32位、低16位、低8位分别用R8、R8D、R8W、R8B。
64位程序的函数调用有所不同,64位程序的函数调用约定最多可以把4个函数参数通过寄存器来进行传递,前4个参数从左到右依次存放于RCX、RDX、R8和R9寄存器,从第5个参数开始还是通过堆栈来进行传递(从右到左的入栈顺序),64位程序的新式函数调用约定可以明显地加快函数调用的速度。在64位程序中,进行函数调用时通常不再使用PUSH指令来传递参数,而是通过MOV指令把参数传递到寄存器或堆栈,由调用者负责堆栈平衡(和__cdecl一样)。
在64位程序中,函数的前4个参数通过寄存器进行传递,从第5个参数开始还是通过堆栈来进行传递(从右到左的入栈顺序)。如果是整型参数,函数的前4个参数从左到右依次存放于RCX、RDX、R8和R9寄存器;如果是浮点参数,则函数的前4个参数从左到右依次存放于XMM0、XMM1、XMM2和XMM3寄存器;如果既有整型又有浮点型,例如VOID func(int a,double b, int c, double d),则函数的前4个参数从左到右依次存放于RCX(ECX)、XMM1、R8(R8D)和XMM3寄存器。如果被调用函数的返回值是64位以内(包括64位)的整型或指针,返回值存放于RAX寄存器;如果返回值是浮点型,则返回值存放于XMM0寄存器。
|