这两天搞了本x86-64汇编的白皮书,还没看完总结一下。

最主要的区别,除了大家都知道的位数扩展寻址空间增大外,就是通用寄存器从8个增加到16个。

多了r8~r15,不再用字母做名称,改用数字了。

说真的,能想出ax,bx,cx,dx,而且每个都是有意义的英文字母的首缩写还真是挺有想象力的。

x64虽然性能提升了,但是缺少了原来的浪漫气质。

寄存器的数量增加导致了很多编程方法的变化。

一个是统一了调用方式,统一使用fastcall调用。拿出6个寄存器来做参数传递。多余的再用stack。寄存器的选择看起来是编译器相关的。gcc的首参数是edi,而网上查vc的首参数是ecx,没验证,不知真假。

另外,对于相当一部分不需要太多局部空间的过程调用,完全可以省略建栈的步骤。只用寄存器提供空间即可。也就是说不再有

pushq %rbp

movl    %rsp %rbp

这两个标志性的函数入口代码。当函数参数超过6的时候,通过8(%rsp)来引用第一个参数。因为这时候

%rsp里面的放的是函数返回地址所在栈地址。


另外,x64可以直接对pc寄存器进行引用,这真是一个巨大的改变。目前还没看到这有多大用处。。