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位文件的目录,注册表也是,我们平时需要的运行库也是两个版本都会有。

最新文章

  1. Python编码问题整理
  2. C++面向对象编程解决三阶矩阵相加减
  3. 深入浅出ExtJS 第四章 表单与输入控件
  4. DB2中循环日期跑数据
  5. 本地开发 localhost链接数据库比127.0.0.1慢
  6. Android 常用的快捷键(随时更新)
  7. bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie
  8. 变化App.config其中值,并保存
  9. centos安装maven,git,mysql
  10. android---EventBus的简单使用(一)
  11. 安装mysql8.0.12
  12. js判断时间段
  13. Layui_Tree模块遍历HDFS
  14. IE11不能使用F12功能DOM资源管理器无法使用
  15. YUV420格式解析<转>
  16. H.264, MPEG4之间的关系
  17. Java面试题系列(一)描述一下JVM加载class文件的原理机制
  18. Linux开机自动启动ORACLE设置
  19. 数据库问题5-SYS.SYSPROCESSES使用和查找死锁
  20. hasOne

热门文章

  1. ELK6.0环境搭建及配置
  2. SNS应用好友动态Feed模块设计
  3. 任何用户密码都能以sysdba角色登入
  4. MySQL新建用户,授权
  5. Linux修改用户密码
  6. 解决nginx在记录post数据时 中文字符转成16进制的问题【转载】
  7. Item 4 ----通过私有构造器强化不可实例化的能力
  8. 省队集训 Day7 选点游戏
  9. UOJ#31 【UR #2】猪猪侠再战括号序列
  10. Python 模块搜索路径 -- (转)