x64 简介

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475
  本篇原文为 寂静的羽夏(wingsummer) 中文翻译,非机翻,著作权归原作者所有。
  本篇不算太长,是来自Intel的官方下载的介绍性文档,如有翻译不得当的地方,欢迎批评指正。翻译不易,如有闲钱,欢迎支持。注意在转载文章时注意保留原文的作者链接,我(译者)的相关信息。话不多说,正文开始:

简介

很多年了,PC端程序员使用x86汇编来编写高性能的代码。但是32位的PC已经正在被64位的替代,并且底层的汇编代码也已经改变了。这个是对x64汇编难得可贵的介绍。阅读该篇文章不需要x86汇编前置知识,但如果你会它会让你更快更容易的学会x64汇编。
  x64是英特尔和AMD的32位x86指令集体系结构ISA的64位扩展的通用名称。AMD推出了x64的第一个版本,最初名为x86-64,后来改名为AMD64。英特尔将其实现命名为IA-32e,之后命名为EMT64。两个版本之间有一些轻微的不兼容,但大多数代码在两个版本上都可以正常工作;有关详细信息,请参阅《Intel®64 and IA-32 Architectures Software Developer’s Manuals》和《AMD64 Architecture Tech Docs》。我们统称之为x64。请不要把IA-6464位Intel® Itanium®体系结构相混淆。
  本篇介绍不会涉及硬件的相关细节,比如缓存、分支预测和其他高级话题。有一些参考将会在本文章末尾处给出来帮助大家以后深入这些领域。
  汇编一般用于白编写应用程序对性能极其苛刻要求的部分,尽管对于大多数开发者来说做到比C++编译器更好是非常困难的。汇编知识对于调试代码来说十分有用——有时编译器会生成错误的汇编代码或者对在调试器中单步调试代码确认错误原因有更好的帮助。代码优化者们有时候会犯错。当你没有源代码的时候,汇编就可以派上用场,提供修复代码的接口。汇编可以让你改变修改当前已经存在的可执行文件。如果你想知道你所用的编程语言在底层的实现,汇编是必需品。学会它你就可以知道为什么有时候它运行的慢或者为什么其他运行的快。最后一点,汇编代码知识在逆向分析恶意程序是不可或缺的。

架构

当在一个现有使用的平台学习汇编的时候,首先要学习寄存器组。

大体架构

目前64位的寄存器允许访问各种大小和位置,我们定义一个字节8个位,一个字16个位,一个双字32个位,一个四字64位,一个双四字为128位。Intel使用小端存储,意味着低地址存低字节。

x64 简介_第1张图片

图一展示了16个64位通用寄存器,第一组8个寄存器被命名(因为历史原因)为RAXRBXRCXRDXRBPRSIRDIRSP。第二组8个寄存器用R8 - R15命名。将字母E替换用开头的字母R,能够访问低32位(RAXEAX)。类似的RAXRBXRCXRDX可以通过去掉首字母R来访问低16个字节(RAXAX),通过再把X替换成L可以访问低16位(AXAL)或通过再把X缓存H访问较高的16位(AXAH)。R8R15也可以用相同的方式进行访问,像这样:R8四字,R8D低双字,R8W低字,R8B低单字节(MASM表示方式,Intel 表示方式为 R8L)。注意这里没有R8H
  由于用于新寄存器的REX操作码前缀中的编码问题,访问字节寄存器时存在一些奇怪的限制:一条指令不能同时引用一个旧的高位字节(AH、BH、CH、DH)和一个新的字节寄存器(如R11B),但它可以使用低位字节(AL、BL、CL、DL)。这是通过将使用REX前缀的指令(AH、BH、CH、DH)更改为(BPL、SPL、DIL、SIL)来实现的。
  64位的指令指针RIP指向下一个将要执行的指令,并且支持64位平坦内存模型。后面将介绍当前操作系统中的内存地址布局。栈指针RSP指向最后一个被压入栈的地址,栈是向小地址增长的,被用来存储函数调用流程的返回地址,在像C/C++这类高级语言传递参数,在调用约定中存储“影子空间”。
  RFLAG寄存器存储标志位,用来表示操作结果或者寄存器的控制。这通过在X86的32位寄存器EFLAG高位扩展保留目前不使用的32个位得到的。表1列举了最有用的标志。绝大多数其他标志提供给操作系统级别的任务并且经常

你可能感兴趣的:(it,计算机)