汇编指令入门级整理 汇编指令

汇编指令(汇编指令的初级加工)
作者| AlbertS
制作人| CSDN博客

我们大多数人都是被高级语言宠坏的一代人,各种高级语言正在逐渐加入源源不断的新特性 。汇编作为最接近机器指令的底层语言,很少被直接用来写程序,但我真的遇到过一个,以前的同事,因为写代码时成员函数权限和可见性的问题,无法正确调用自己想执行的函数 。于是,他开始在C++代码中嵌入汇编,绕开了各种问题 。
因为这个项目是跨平台的,他发现在Linux上编译代码时,汇编代码的语法实际上在Linux和Windows之间是不同的 。因此,他用一个宏观定义来判断平台,从而“完美”地解决了这个问题 。最后这些代码肯定是重写了,因为可读性太差了 。最近在学习左值、右值、左引用、右引用的时候,总有人用程序编译生成的中间汇编代码来解释问题,这让我很困惑,所以我决定先熟悉一下简单的汇编指令,同时学习并记录下来,这样以后忘记了就可以直接用来复习了 。
什么是汇编语言?
汇编语言是最接近机器语言的编程语言,引用百科全书中的一段话来解释:
汇编语言是用于电子计算机、微处理器、微控制器或其他可编程设备的低级语言,也称为符号语言 。汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址 。汇编语言也被称为第二代计算机语言 。
汇编语言产生的原因
对于大多数人来说,二进制程序是不可读的,当然也有会读的有能力的人,比如第一代程序员,但是这类人正在消亡,直接看二进制不容易看出他们做了什么,比如最简单的加法指令用二进制表示为0000011,如果混在一串01串里面就很难找到,所以汇编语言主要是解决二进制编码的可读性问题 。
【汇编指令入门级整理 汇编指令】程序集和二进制文件之间的关系
换句话说,汇编语言就是把显示给机器的二进制代码翻译成人类语言 。汇编指令是机器指令的助记符,与机器指令一一对应,是一种易读易记的书写格式 。它有效地解决了机器指令编程难的问题,利用编译器可以很容易地将汇编程序翻译成机器指令程序,比如前面提到的00000011加法指令,对应的汇编指令是ADD,调用汇编程序时会翻译成0000011 。
注册
说到汇编指令,我们不得不提到寄存器 。寄存器本身是用来存储数据的,因为CPU本身只负责逻辑运算,数据需要单独存储在其他地方 。但是,不熟悉登记册的人会有疑问 。数据不是存储在硬盘上吗?还是数据没有存储在内存中?所有这些想法都是对的,那么寄存器是用来做什么的呢?
寄存器功能
其实硬盘和内存都是用来存储数据的,但是CPU的运算速度远高于内存的读写速度,更不用说从硬盘中取数据了 。因此,为了避免被拖慢而影响效率,CPU有自己的一级缓存和二级缓存,有的CPU甚至会增加三级缓存 。从这些缓存中读取和写入数据比内存快得多,但仍然不可能使用快速运行的CPU,所以有寄存器 。
寄存器不是后来添加的,而是在初始计算中设计的 。相比较而言,多级缓存出现的比较晚 。通常,最频繁读取和写入的数据将放在寄存器中 。CPU会先读写寄存器,然后通过寄存器和缓存与内存交换数据,达到缓冲的目的 。因为寄存器可以按名称访问,所以访问速度最快,所以也叫零级缓存 。
访问速度比较
从上面的描述可以知道,访问速度从高到低依次为:寄存器一级缓存二级缓存>三级缓存内存硬盘 。例如,很容易理解它们的访问速度 。比如我们做饭的时候(CPU工作),拿在手里的肉和蔬菜(寄存器)肯定是最快的 。如果没有,我们需要把处理好的菜拿到案板上(一级缓存) 。如果不在案板上,就去更远的菜槽(二级缓存)看看 。如果还没找到,就去冰箱里找找(三级缓存) 。当你发现家里真的没有的时候,就去楼下的蔬菜店(记忆)买点东西,转身发现自己不想要了 。最后开车去农贸市场(硬盘)买 。
从上面的例子中,我们应该能够理解它们的速度关系 。既然缓存这么快,为什么不用缓存代替内存,或者用一级缓存代替二级和三级缓存呢?这里有一个成本问题 。速度越快,价格越高 。如果你买过机械硬盘和固态硬盘,应该很容易理解 。
寄存器分类
常用的x86 CPU寄存器有八个:EAX、EBX、ECX、ed x、EDI、ESI、EBP、ESP 。据说现在寄存器总数已经超过100个了,找到相关资料我会补充的 。这些寄存器是最常用的寄存器,这些名称经常出现在编译代码中 。

推荐阅读