0x01:寄存器分配的不同

(1)64位有16个寄存器,32位只有8个。但是32位前8个都有不同的命名,分别是e _ ,而64位前8个使用了r代替e,也就是r _。e开头的寄存器命名依然可以直接运用于相应寄存器的低32位,而剩下的寄存器名则是从r8 - r15,其低位分别用d、w、b指定长度;

(2)32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数,rax作为返回值;

(3)64位没有栈帧的指针,32位用ebp作为栈帧指针,64位取消了这个设定,rbp作为通用寄存器使用;

(4)64位支持一些形式的以PC相关的寻址,而32位只有在jmp的时候才会用到这种寻址方式;

0x02:(新增)汇编指令的不同

mov、push、pop扩展了movq系列的mov和pushq以及popq用来操作quad word。

补充:

(1)movabsq不是32位的扩展,是纯新增的指令。用来将一个64位的字面值直接存到一个64位寄存器中。因为movq只能将32位的值存入,所以新增了这样一条指令

(2)64位的汇编代码在ret之前可能会加一句rep,这里的rep没有实际意义,只是出于AMD处理器的原因,避免jmp所到达的地方直接就是ret,这样会使得处理器运行更快一些

0x03:函数调用的不同

(1)x_64的参数通过寄存器传递(见前文);

callq 在栈里存放一个8位的返回地址;

(2)许多函数不再有栈帧,只有无法将所有本地变量放在寄存器里的才会在栈上分配空间;

(3)函数可以获取到栈至多128字节的空间。这样函数就可以在不更改栈指针的情况下在栈上存储信息(也就是说,可以提前用rsp以下的128字节空间,这段空间被称为red zone,在x86-64里,时刻可用);

(4)不再有栈帧指针,现在栈的位置和栈指针相关。大多数函数在调用的一开始就分配全部所需栈空间,之后保持栈指针不改变;

(5)一些寄存器被设计成为被调用者-存储的寄存器,这些必须在需要改变他们值的时候存储他们并且之后恢复他们。

0x04:参数传递的不同

(1)6个寄存器用来传递参数(见前文);

(2)剩下的寄存器按照之前的方式传递(不过是与rsp相关了,ebp不再作为栈帧指针,并且从rsp开始第7个参数,rsp+8开始第8个,以此类推);

(3)调用时,rsp向下移动8位(存入返回地址),寄存器参数无影响,第7个及之后的参数现在则是从rsp+8开始第7个,rsp+16开始第8个,以此类推;

0x05:栈帧的不同

很多情况下不再需要栈帧,比如在没有调用别的函数,且寄存器足以存储参数,那么就只需要存储返回地址即可。

需要栈帧的情况:

(1)本地变量太多,寄存器不够;

(2)一些本地变量是数组或结构体;

(3)函数使用了取地址操作符来计算一个本地变量的地址;

(4)函数必须用栈传送一些参数给另外一个函数;

(5)函数需要保存一些由被调用者存储的寄存器的状态(以便于恢复);

但是现在的栈帧经常是固定大小的,在函数调用的最开始就被设定,在整个调用期间,栈顶指针保持不变,这样就可以通过对其再加上偏移量来对相应的值进行操作,于是EBP就不再需要作为栈帧指针了。虽然很多时候我们认为没有“栈帧”,但是每次函数调用都一定有一个返回地址被压栈,我们可以也认为这一个地址就是一个“栈帧”,因为它也保存了调用者的状态。

原文链接:https://blog.csdn.net/qq_29343201/article/details/51278798

win32和x86以及x64的区别

本来是知道x86和x64的区别的. 今天突然在VS2008上看到一个win32的选项,一下子懵了,这是什么玩意. 百度之,发现答案 win32是指windows 32位的操作系统,顾名思义是支持32为 ...

x86和x64的区别

整理了下网上的资料,归类了下,大似表述是这样的:IBM/PC兼容机,也就是Intel的i80x86指令架构,就简称了x86.x86并不是指32位环境,而是指80x86架构,这个架构目前有32位,64位 ...

浅淡Windows7 32位与64位/x86与x64的区别

看到有很多会员问到底是选Windows7 x86,还是选x64.这里简单的谈一下这这两种系统的区别. 简单的说x86代表32位操作系统  x64代表64位操作系统. 简单的判断电脑是否支持64位操作系 ...

[转帖]Linux系统下x86和ARM的区别有哪些?

Linux系统下x86和ARM的区别有哪些? https://www.cnblogs.com/alantu2018/p/9209143.html 其实界限 越来越小了.. 问题: 最近在用三星的一款i ...

Visual Studio中Debug与Release以及x86、x64、Any CPU的区别

Visual Studio中Debug与Release的区别: 在Visual Studio中,编译模式有2种:Debug与Release.这也是默认的两种方式,在新建一个project的时候,就已经 ...

【Hardware】i386、x86和x64的故事

(1)x86的由来 x86架构首度出现在1978年推出的Intel 8086中央处理器,它是从Intel 8008处理器中发展而来的,而8008则是发展自Intel 4004的.在8086之后,Int ...

【转载】LINUX 和 WINDOWS 内核的区别

LINUX 和 WINDOWS 内核的区别 [声明:欢迎转载,转载请注明出自CU ACCESSORY http://linux.chinaunix.net/bbs/thread-1153868-1-1 ...

cmake构建时指定编译器架构(x86 or x64)

vs2015 x64编译器为例,cmake命令如下: cmake -G "Visual Studio 14 Win64" path\to\source\dir 去掉Win64,就是 ...

随机推荐

poj3207 2-SAT入门

一开始题意没读懂 = = 题意:比如说对于表盘上a到b.c到d都要连边,这两个边不能交叉.这两个边要么都在圆内要么都在圆外,而且可以是曲线= = 比如这种情况:(Reference:http://bl ...

BZOJ2708 [Violet 1]木偶

首先想到的是贪心...肯定不对嘛...T T 然后发现其实是可以DP的...不过我们要先排序 令f[i]表示前i个木偶最坏要丢掉几个,则 f[i] = max(f[j] + calc(j + 1, i ...

CF Preparing Olympiad (DFS)

Preparing Olympiad time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

HDU 4562 守护雅典娜(dp)

守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submi ...

php学习,一个简单的Calendar(2) 一个简单的活动页面

有了前面的基础,后面就是将页面展示出来. 预览图如下:1号和31号分别有活动,会一并显示出来   这里需要搞定几个问题,一个就是数据库的连接,我们用\sys\class\class.db_connec ...

将Oracle数据库导出为txt格式

将Oracle数据库导出为txt格式: 方法1: 对于Windows系统,可以采用以下方式: 选择控制面板-->管理工具-->数据源(ODBC),添加一个新的数据源(系统或用户DSN均可) ...

Ajax 跨域,这应该是最全的解决方案了

https://segmentfault.com/a/1190000012469713 前言 从刚接触前端开发起,跨域这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过N个跨域相关的问题了 ...

做MFC的时候引用了头文件但VC还是报missing storage-class or type specifiers

我在客户端clg.h头文件中引用了头文件“ClientSocket.h”,然后在客户端clg.h中的类中声明了类CClientSocket的对象,可是编译报错:d:\vc++\客户端\客户端dlg.h ...

HDUOJ-Counting Triangles

Counting Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

linux64和x86,Linux x86和x64的区别相关推荐

  1. linux是x64还是x86,Linux x86和x64的区别

    0x01:寄存器分配的不同 (1)64位有16个寄存器,32位只有8个.但是32位前8个都有不同的命名,分别是e _ ,而64位前8个使用了r代替e,也就是r _.e开头的寄存器命名依然可以直接运用于 ...

  2. amd 显卡 linux驱动程序,AMD Radeon/Mobility/FireGL系列显卡催化剂驱动8.6官方正式版For Linux x86/x64...

    简介 AMD Radeon/Mobility/FireGL系列显卡最新催化剂驱动8.6官方正式版For Linux x86/x64(2008年6月19日发布)AMD目前对Linux系统越来越重视,每月 ...

  3. Postman for Linux(x86)

    from: http://chromecj.com/web-development/2018-04/1374.html Postman for Linux(x86)开发背景 使用Linux系统的人越来 ...

  4. ARM和X86、X86和X64、Intel和AMD、CPU和GPU介绍

    一.ARM和X86 X86 和 ARM 都是CPU设计的一个架构.X86 用的是复杂指令集.ARM用的是精简指令集. 指令集其实就是机器码,机器码上是汇编,汇编之上是程序语言例如java.c.c#. ...

  5. win10 error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突

    win10下,vs2013&opencv2.4.13调试项目,debug win32平台下正常运行,debug x64下报错:     error LNK1112: 模块计算机类型" ...

  6. 浅淡Windows7 32位与64位/x86与x64的区别

    看到有很多会员问到底是选Windows7 x86,还是选x64.这里简单的谈一下这这两种系统的区别. 简单的说x86代表32位操作系统  x64代表64位操作系统. 简单的判断电脑是否支持64位操作系 ...

  7. SploitFun Linux x86 Exploit 开发系列教程

    SploitFun Linux x86 Exploit 开发系列教程 原文:Linux (x86) Exploit Development Series 在线阅读 PDF格式 EPUB格式 MOBI格 ...

  8. 神码与SUSE共促Unix向x86+Linux迁移

    Attachmate集团是全球知名的软件集团,旗下拥有Novell.SUSE等品牌.9月4日,Attachmate集团宣布与神州数码达成战略合作,神州数码将作为Attachmate集团中国区总代理,全 ...

  9. Linux x86主机运行天数是是24.8的倍数都有可能引发oracle bug及解决方法

    问题是因后台无法登录发现该BUG的,连PLSQL及服务器上的oracle DBA也无法登录oracle 查看系统相关资源: 负载高,系统层的CPU使用高, 解决方法: 重启服务器,问题解决 通过查找原 ...

最新文章

  1. LaTeX 表格旋转的设置
  2. 20165206 2017-2018-2 《Java程序设计》第三周学习总结
  3. 蓝桥杯:安慰奶牛(最小生成树)
  4. 控件自定义和QQ皮肤
  5. tensorflow 加载bert_用NodeJS/TensorFlowJS调用BERT实现文本分类
  6. iLogtail 与Filebeat 性能对比
  7. 支撑数千家天猫商家CRM业务,数云高弹性数据库如何做
  8. Python3安装turtle库(已成功安装)
  9. stm32 红外遥控实现
  10. (概论)java web后台开发跟手机APP后台开发有什么不同
  11. 页面404圈小猫游戏代码
  12. 线程生命周期与创建线程的多种方式
  13. 区块链与大数据,打造智能经济(读书笔记)——井底望天
  14. 断食、清肠 三日记录
  15. PCB设计完检查的项目
  16. 惠普打印机驱动下载(电脑系统和打印机型号自动匹配)
  17. C++删除文件末尾的空行
  18. 奥巴马当选总统之芝加哥演讲全文及…
  19. 论文篇 | 基于深度学习的机器翻译论文总汇
  20. hackme2靶场刷题记录

热门文章

  1. 支付宝还信用卡即将收费!免费市代即将终结?
  2. 主观体验、情绪价值、第一印象、要不要画饼为什么?
  3. S交换机堆叠方案配置指南
  4. 2019年7月常用浏览器的User-Agent
  5. java 格式化日期_Java的日期格式化常用方法
  6. gemfire java_gemfire基本使用以及spring-data-gemfire的使用
  7. 如何得到SignedXm验证Xml签名的日志文件
  8. mysql自增id修改最大值_MySQL自增ID最大值被使用
  9. 先左后直or先直后左 | 江苏交警总队朱志星:交通精细化管理实践
  10. MySQL/Oracle数据库优化总结(非常全面)