为什么32位应用程序可以在64位x86 CPU上运行?

BsD*_*BsD 4 assembly operating-system x86-64 cpu-architecture backwards-compatibility

32位应用程序可执行文件包含32位CPU的机器代码,但32位和64位Intel CPU的程序集和内部体系结构(寄存器数,寄存器宽度,调用约定)不同,那么32-如何bit exe在64位机器上运行?

维基百科的x86-64文章说:

x86-64完全向后兼容16位和32位x86代码. 由于完整的x86 16位和32位指令集仍然在硬件中实现而没有任何干预仿真,因此现有的x86可执行文件在没有兼容性或性能损失的情况下运行,而现有的应用程序被重新编码以利用处理器设计的新功能可能实现性能提升.

我不明白他们的意思是说在没有任何干预仿真的情况下继续在硬件中实现.这是什么意思?

eig*_*ris 6

简短的回答是x86系列处理器都设计为向后兼容.在新CPU中执行算术和读/写操作的逻辑电路仍然能够执行为旧CPU设计的指令,同时还执行更新的指令,如64位加法和减法.


如果你想要更多的历史......

x86指令集的历史可以追溯到20世纪70年代中期,从英特尔首款16位处理器8086开始.通用的16位(2字节)寄存器在此CPU被称为AX,BX,CX,和DX.8086还允许访问每个寄存器的高字节和低字节.例如,您可以AX使用名称访问低8位AL,或使用高8位访问AH.

当英特尔开始开发具有新功能的新处理器时,他们希望它们向后兼容8086以及随后出现的任何处理器.接下来是80186,80286和80386--最后一个是他们的第一个32位处理器.

当然,80386上的所有寄存器必须是32位,但它也必须向后兼容旧的x86处理器.因此,而不是代替寄存器,英特尔仅仅是延长了现有的到EAX,EBX,ECX,...等等.(E意思是"扩展").该AX寄存器仅是的低16位EAX寄存器中,并且仍然是可以访问.

英特尔首款64位处理器采用了相同的逻辑; 32位EAX扩展到64位RAX,依此类推.当前X86-64汇编语言可使用指令等上32位寄存器仍然执行算术运算addl,subl,andl,orl,...等,与l代表"长",这是4个字节/ 32位.64位arthimetic与完成addq,subq,andq,orq,...等,与q代表"四字",这是8个字节/ 64位.

编辑:这个pdf看起来很好地介绍了32位和64位x86架构之间的差异.

  • 实际上,64位扩展是由AMD开发的.然而,关于向后兼容性的观点仍然存在. (5认同)
  • @ simple16 x86-64架构确实有8个新的寄存器,从一点点读取我看到它们通常用于存储函数参数.我不认为这是一个问题,因为任何为32位架构编译的程序都可以使用堆栈进行函数调用,而64位程序可以使用新方法.它也是一种语言的编译器,它选择如何使用堆栈/寄存器来实现其调用约定.没有一种正确的做事方式. (3认同)