组装说明的组成摘要(汇编语言指令集)
汇编指令(汇编指令入门级整理)
作者|AlbertS
出品|CSDN博客
前言
我们大多数人都是被高级语言宠坏的一代,各种高级语言都在逐渐加入源源不断的新特性汇编语言作为最接近机器指令的最低级语言,很少被直接用来编写程序但是,我真的遇到过一个,以前的同事,写代码的时候因为成员函数权限和可见性的问题,无法正确调用自己想要执行的函数于是,他开始在C代码中嵌入汇编,绕过各种限制,最终得到了自己想要的东西…
因为项目是跨平台的,他发现在Linux上编译代码的时候,汇编代码的语法其实在Linux和Windows之间是不一样的因此,他用一个宏观的定义来判断平台“完美”是的,最后这些代码肯定是重写了,因为可读性太差,最近一直在研究左值、右值、左右引用时,总有人用程序编译生成的中间汇编代码来解释问题,这让我很困惑,于是我决定熟悉简单的汇编指令,学习并记录下来,以至于忘记了以后直接用它们来复习。
什么是汇编语言
汇编语言是最接近机器语言的编程语言,引用百科全书中的一段话解释如下:
汇编语言(汇编语言)是一种用于电子计算机、微处理器、微控制器或其他可编程设备的低级语言,也称为符号语言。汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。汇编语言也被称为第二代计算机语言。
汇编语言产生的原因
对于绝大多数人来说,二进制程序是不可读的,当然有能力的人也能读懂,比如第一代程序员,但是这些人正在走向消亡,直接看二进制是不容易看出他们做了什么的,比如最简单的加法指令在二进制中表示为0000011,如果混在01串的串中很难找到,所以汇编语言主要是解决二进制编码的可读性问题。
汇编与二进制的关系
换句话说,汇编语言就是把显示给机器的二进制代码翻译成人类语言汇编指令是机器指令的助记符,与机器指令一一对应,是一种易读易记的书写格式。有效解决了机器指令编程难的问题,利用编译器将汇编程序翻译成机器指令程序非常方便,比如前面提到的00000011加法指令,对应的汇编指令是ADD,调用汇编程序时会翻译成0000011。
寄存器
说到汇编指令,我们不得不提到寄存器寄存器本身是用来存储数据的,因为CPU本身只负责逻辑运算,数据需要单独存储在其他地方但是,不熟悉登记册的人会有疑问数据不是在硬盘上吗?还是数据没有存储在内存中?所有这些想法都是对的,那么寄存器是用来做什么的呢?
寄存器作用
其实硬盘、内存是用来存储数据的,但是CPU的运算速度远高于内存的读写速度,更不用说从硬盘中取数据了,所以为了避免被拖慢而影响效率,CPU有自己的一级缓存和200位的网络级缓存,有的CPU甚至增加了三级缓存,从这些缓存中读写数据要比内存快很多,但是仍然不可能使用运行快的CPU,所以有寄存器。
寄存器不是后来添加的,而是在初始计算中设计的相比之下,多级缓存出现的比较晚通常,最频繁读写的数据会放在寄存器中,CPU会先读写寄存器,再通过寄存器、与内存交换数据,达到缓冲的目的因为寄存器可以按名称访问,所以访问速度最快,所以也叫零级缓存。
存取速度比较
从上面的描述可以知道,访问速度从高到低依次是:寄存器一级缓存二级缓存和三级缓存内存硬盘至于它们的访问速度,举个例子就很容易理解了,比如烹饪(CPU工作)时,取手中(寄存器)你拿着的肉和蔬菜一定是最快的如果没有,你需要把它们放在案板上(1级缓存)把加工好的菜拿过来,如果不在案板上,就放在更远的洗菜池里(2级缓存)找找看如果还没找到,就去冰箱(3级缓存)我看到了,然后发现家里真的什么都没有然后去楼下的食品店(内存)去买一些,转身发现没有你想要的,最后开车去农贸市场(硬盘)买吧。
通过上面的例子,我们应该能够理解它们的速度关系既然缓存这么快,为什么不用缓存代替内存,或者放2、三级缓存被一级缓存取代?这里有一个成本问题速度越快,价格越高如果你买过机械硬盘和固态硬盘,应该很容易理解。
寄存器分类
有八个常用的x86CPU寄存器:EAX、EBX、ECX、EDX、EDI、ESI、EBP、ESP,据说现在寄存器总数已经超过100个了,找到相关资料我会补充的上述寄存器是最常用的寄存器,这些名称经常出现在编译代码中。
我们常说的32位、64位CPU指的是数据总线的宽度或数量,而寄存器是单米的临时数据和中间结果,所以寄存器中的位数,也就是处理数据的长度,与数据总线的数量是一样的,所以32位CPU对应的寄存器也应该是3位以太网和2位。
常用寄存器用途
上面提到的八个寄存器都有其特定的用途让我们以32位CPU为例,简要说明这些寄存器的功能,并在下表中进行排序:
寄存器EAX、AX、AH、AL的关系
在上面的图标中,每个常用寄存器后面都有其他名称,它们是同一寄存器在不同用途下的不同名称例如,在32位CPU上,e AX是32位寄存器,而AX是EAX的低16位,AH是AX的高8位,AL是AX的低8位它们的对比关系如下:
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-4字节|====AX======|-2字节|==ah==|-1字节|==Al==|-1个字节
汇编语言指令
最后说说常见的汇编指令,因为linux和windows下的汇编语法有些不同,所以我们先来学习windows下的汇编指令,然后对比一下它们之间的区别。
数据传送指令
算术运算指令
逻辑运算指令
循环控制指令
转移指令
Linux和windows汇编的区别
如前所述,linux和windows下的汇编语法是不同的事实上,这两种语法差异和系统差异之间并没有绝对的关系一般来说,gcc用在linux上/g编译器,而微软的cl,即MSBUILD,会在windows上使用,所以会因为编译器的不同而产生不同的代码gcc采用ATT的汇编语法格式,MSBUILD采用英特尔的汇编语法格式。
总结
汇编指令是机器指令的助记符,与机器指令一一对应
ATT的汇编语法格式不同于英特尔的汇编语法
常用寄存器:EAX、EBX、ECX、EDX、EDI、ESI、EBP、ESP
访问速度从高到低为:寄存器一级缓存二级缓存三级缓存内存硬盘
常用的汇编指令:mov、je、jmp、call、add、sub、inc、dec、and、or
版权声明:本文为CSDN博主「AlbertS」的原创文章,遵循CC4.0BY-SA版权协议,请附上原始来源链接和此声明。
原文链接:https://blog.csdn.net/albertsh/article/details/(106041560)211211)华为全球分析师大会:HMS Core全球开发者应用集成的数量正在加速,打造全场景智能体验腾讯人均月薪8万,又迷茫又平均?200 万年薪请不到!清华姚班到底有多牛?|力规划量子计算和AI“双拳”进攻时,他们锁定了38种潜在的抗疫药物我们不再使用AOP作为操作日志!|原力策划这三个国外帅哥居然用阅批付款、无人机交付的水培沙拉项目?