zoukankan      html  css  js  c++  java
  • 转:x64与x86的改变

    http://tieba.baidu.com/p/1250470248

    x64与x86的改变

    硬件要求就是64位的CPU。操作系统也必须是64位的,如果在64位的CPU上安装了32位的操作系统,就算编译成功也无法运行程序。

    寄存器的改变
    汇编是直接与寄存器打交道的语言,因此硬件对语言影响很大。先来看看x64与x32相比在硬件上多了什么,变了什么。

    X64多了8个通用寄存器:R8、R9、R10、R11、R12、R13、R14、R15,当然,它们都是64位的。另外还增加了8个128位XMM寄存器,不过通常用不着。
    X32中原有的寄存器在X64中均为扩展为64位,且名称的第一个字母从E改为R。不过我们还是可以在64位程序中调用32位的寄存器,如RAX(64位)、EAX(低32)、AX(低16位)、AL(低8位)、AH(8到15位),相应的有R8、R8D、R8W和R8B。不过不要在程序中使用如AH之类的寄存器,因为在AMD的CPU上这种用法会与某些指令产生冲突。

    在x64汇编中,只有一种类似_fastcall的调用约定。一是前四个参数分别通过四个寄存器传递:RCX、RDX、R8、R9(从左到右的顺序),浮点参数传入XMM0到XMM3中,如果还有更多的参数,才通过椎栈传递。二是调用者负责椎栈空间的分配与回收。

    PE结构,有原来的PE32增加了PE32+结构,一般程序通过判断文件头是否为此格式来决定是否加载为64位程序,特殊程序比如C#还需要判断是否是完全的IL以及编译器版本等其他标识来决定,比如x86下编译则为强制32位运行,for any CPU 则会原生运行。

    调试器,支持的IDE可以进行源码调试,由于OD不支持纯64位,所以64位下的底层动态调试器就只有WINDBG了。

    系统则是诸多dll会有两套版本,wow64模式下程序访问目录会自动映射到存放32位文件的目录,注册表也是,我们平时需要的运行库也是两个版本都会有。

  • 相关阅读:
    LPC1768基本输入输出GPIO使用
    LPC1768IAP(详解,有上位机)
    STM32_IAP详解(有代码,有上位机)
    ucos2.86的任务调度漏洞
    ucos任务优先级从64到256,任务就绪表的改变
    ucos互斥信号量解决优先级反转问题
    ucos信号量集源码分析
    ucos内存管理原理详解
    ucos队列的实现--源码分析
    ucos调度器详解
  • 原文地址:https://www.cnblogs.com/studyskill/p/7159573.html
Copyright © 2011-2022 走看看