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