手机版
首页 >> 科学>> 正文

常用的汇编指令,原力计划

2020-05-23 10:03来源:互联网编辑:小狐

出品 CSDN 博客

前言

我们大都是被高级语言惯坏了的一代,源源不断的新特性正在逐步添加到各类高级语言之中,汇编作为最接近机器指令的低级语言,已经很少被直接拿来写程序了,不过我还真的遇到了一个,那是之前的一个同事,因为在写代码时遇到了成员函数权限及可见性的问题,导致他无法正确调用想执行的函数,结果他就开始在 C++ 代码里嵌入汇编了,绕过了种种限制终于如愿以偿,但是读代码的我们傻眼了…

因为项目是跨平台的,代码推送的 Linux 上编译的时候他才发现,汇编代码的语法在 Linux 和 Windows 上居然是不一样的,结果他又用一个判断平台的宏定义“完美”的解决了,最终这些代码肯定是重写了啊,因为可读性太差了,最近在学习左值、右值、左引用和右引用的时候,总是有人用程序编译生成的中间汇编代码来解释问题,看得我迷迷糊糊,所以决定熟悉一下简单的汇编指令,边学习边记录,方便今后忘记了可以直接拿来复习。

什么是汇编语言

汇编语言是最接近机器语言的编程语言,引用百科中的一段话解释为:

汇编语言产生的原因

对于绝大多数人来说,二进制程序是不可读的,当然有能人可以读,比如第一代程序员,但这类人快灭绝了,直接看二进制不容易看出来究竟做了什么事情,比如最简单的加法指令二进制表示为 00000011,如果它混在一大串01字符串中就很难把它找出来,所以汇编语言主要就是为了解决二进制编码的可读性问题。

汇编与二进制的关系

寄存器

说到汇编指令不得不提到寄存器,寄存器本身是用来存数据的,因为 CPU 本身只负责逻辑运算,数据需要单独储存在其他的地方,但是对于不熟悉寄存器的人来说会有疑惑,数据不是存在硬盘上吗?或者说数据不是存在内存中吗?这些想法都没错,那么寄存器是用来做什么的呢?

寄存器作用

其实硬盘、内存都是用来存储数据的,但是 CPU 的运算速度远高于内存的读写速度,更不用说从硬盘上取数据了,所以为了避免被拖慢速度影响效率,CPU 都自带一级缓存和二级缓存,一些 CPU 甚至增加了缓存,从这些缓存中读写数据要比内存快很多,但是还是无法使用飞速运转的 CPU,所以才会有寄存器的存在。

寄存器不是后来增加的,在最初的计算中就已经设计出来,相比而言,多级缓存出现的更晚一些,通常那些最频繁读写的数据都会被放在寄存器里面,CPU 优先读写寄存器,再通过寄存器、缓存跟内存来交换数据,达到缓冲的目的,因为可以通过名称访问寄存器,这样访问速度是最快的,因此也被称为零级缓存。

存取速度比较

通过上面的叙述我们可以知道存取速度从高到低分别是: 寄存器 > 1级缓存 > 2级缓存 > 3级缓存 > 内存 > 硬盘,关于它们的存取速度,举个例子很容易就能明白了,比如我们做菜(CPU工作)时,取手中(寄存器)正拿着的肉和蔬菜肯定是最快的,如果没有就需要把案板上(1级缓存)处理好的菜拿过来,如果案板上没有就在更远一点的洗菜池(2级缓存)中找一找,还没找到的话就要到冰箱(3级缓存)中看一看了,这时发现家里真没有,那去楼下的菜店(内存)去买点吧,转了一圈发现没有想要的,最后还是开车去农贸市场(硬盘)买吧。

通过上面这个例子应该能明白它们的速度关系了,既然缓存这么快,为什么不用缓存代替内存,或者将2、3级缓存都换成1级缓存呢?这里边有一个成本问题,速度越快对应着价格越高,如果你买过机械硬盘和固态硬盘应该很容易就理解了。

寄存器分类

常用的 x86 CPU 寄存器有8个:EAX 、EBX、ECX、EDX、EDI、ESI、EBP、ESP,据说现在寄存器总数已经超过100个了,等我找到相关资料再来补充,上面这几个寄存器是最常用的,这些名字也常常出现在汇编的代码中。

我们常说的32位、64位 CPU 是指数据总线的宽度或根数,而寄存器是暂存数据和中间结果的单元,因此寄存器的位数也就是处理数据的长度与数据总线的根数是相同的,所以32位 CPU 对应的寄存器也应该是32位的。

常用寄存器用途

上面提到大8个寄存器都有其特定的用途,我们以32位 CPU 为例简单说明下这些寄存器的作用,整理如下表:

常用的汇编指令,原力计划(图1)

寄存器EAX、AX、AH、AL的关系

在上面的图标中每个常用寄存器后面还有其他的名字,它们是同一个寄存器不同用法下的不同名字,比如在32位 CPU 上,EAX是32位的寄存器,而AX是EAX的低16位,AH是AX的高8位,而AL是AX的低8位,它们的对照关系如下:

===============EAX===============---4个字节

======AX=======---2个字节

==AH ===-----------1个字节

===AL==---1个字节

汇编语言指令

终于说到汇编常用指令了,因为 linux 和 windows 下的汇编语法是有些不同的,所以下面我们先通过 windows 下的汇编指令来简单学习一下,后续再来比较两者的不同。

数据传送指令

常用的汇编指令,原力计划(图2)

算术运算指令

常用的汇编指令,原力计划(图3)

逻辑运算指令

常用的汇编指令,原力计划(图4)

循环控制指令

常用的汇编指令,原力计划(图5)

转移指令

常用的汇编指令,原力计划(图6)

Linux 和 windows 下汇编的区别

前面说到 linux 和 windows 下的汇编语法是不同的,其实两种语法的不同和不同没有绝对的关系,一般在 linux 上会使用 gcc/g++ 编译器,而在 windows 上会使用微软的 cl 也就是 MSBUILD,所以产生不同的代码是因为编译器不同,gcc 下采用的是AT&T的汇编语法格式,MSBUILD 采用的是Intel汇编语法格式。

常用的汇编指令,原力计划(图7)

总结

汇编指令是机器指令的助记符,与机器指令是一一对应的

AT&T的汇编语法格式和Intel汇编语法格式的是不同的

常用寄存器:EAX 、EBX、ECX、EDX、EDI、ESI、EBP、ESP

存取速度从高到低分别是: 寄存器 > 1级缓存 > 2级缓存 > 3级缓存 > 内存 > 硬盘

常用的汇编指令:mov、je、jmp、call、add、sub、inc、dec、and、or

本文相关词条概念解析:

寄存器

寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。

网友评论Translation

推荐文章

中兴这款折叠屏手机后置双摄模组,中兴采用了翻盖式外掀柔性屏的设计
中兴这款折叠屏手机后置双摄模组,中兴采用了翻盖式外掀柔性屏的设计
IT之家5月29日 今天,国外科技博客LetsGoDigital曝光了中兴的一项折叠屏手机专利,根据专利的内容,中兴采用了翻盖式外掀柔性屏的设计,也就是下半部分的屏幕可向机身背部外翻,这一点和三星Ga
查看详情>>
2Optional,Optional实际上是个容器,你会用么,原力计划
2Optional,Optional实际上是个容器,你会用么,原力计划
出品 CSDN(ID:CSDNnews)写在前面从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerExc
查看详情>>
荣耀X10,在售价低廉的5G手机产品中
荣耀X10,在售价低廉的5G手机产品中
PChome手机频道评测近一段时间里5G手机扎堆式的发布,一下子让我们的选择丰富了起来。尤其是售价在2000元以下的5G机型出现,极大的降低了5G手机的入手成本,将5G换代门槛一下降低到了一个新的谷底
查看详情>>
科思创希望加速向循环经济的转型,我们可以将塑料转换回分子的原形
科思创希望加速向循环经济的转型,我们可以将塑料转换回分子的原形
“塑料用完就扔的这种模式将不可持续,对任何一个社会和经济体来说,我们必须要将一次性的生产和发展模式扭转过来。”日前,全球最大聚合物生产商科思创首席执行官施乐文(Markus Steilemann)在一
查看详情>>
诺基亚5G新旗舰,三星AMOLED屏+天玑1000+4700mAh,相信诺基亚这次也是要打一个翻身仗
诺基亚5G新旗舰,三星AMOLED屏+天玑1000+4700mAh,相信诺基亚这次也是要打一个翻身仗
5G手机市场如今风起云涌,涌现了不少的新型的5G旗舰手机,其中三星、华为这样大厂可以说是锋芒毕露,三星S20系列上的一亿像素,华为P40系列上的多方式续航,都是在行业中是不可替代的优势。但是,就在上半
查看详情>>
京东能成为快手的老铁吗?
京东能成为快手的老铁吗?
直播电商火吗?这个问题,许多人或许不用思考就能给出一个十分肯定的回答。2019年李佳琦、薇娅破圈以来,一场直播带货过亿的神话就一直刺激着行业。从企业大佬,到带货主播,再到正在剁手的观众,突然之间,每一
查看详情>>
创投日报,自动驾驶赛道融资消息不断,全屋优品,全屋优品完成近亿元B+轮融资,受到行业的关注
创投日报,自动驾驶赛道融资消息不断,全屋优品,全屋优品完成近亿元B+轮融资,受到行业的关注
汽车项目报道:5月28日,南京芯驰半导体科技有限公司SemiDrive以下简称“芯驰科技”对外发布9系列X9、V9、G9三大汽车芯片产品,针对汽车的协同一体化解决方案,包括智能座舱、智能驾驶、中央网关
查看详情>>
2,万字长文详解,10,而创建这么多线程,原力计划
2,万字长文详解,10,而创建这么多线程,原力计划
出品 CSDN博客Volatile相关1.请谈谈你对 volatile 的理解保证可见性不能保证原子性禁止指令重排序要完整地回答好这题,还需要理解Java内存模型(JMM)JMM 本身是一种抽象的概念
查看详情>>
这种传统的掏耳工具,真的太过瘾了,爽,了
这种传统的掏耳工具,真的太过瘾了,爽,了
/可视采耳 安全舒适/采耳(掏耳)直观的感受,就是一个“爽”字。当耳勺或者手指缓缓进入耳道,那种酥酥麻麻的感觉特别舒服、特别过瘾!!每次挖耳朵的时候,总会让我想到挖冰淇淋,一勺一勺的根本停不下来,强迫
查看详情>>
腾讯产品项目的主体流程划分成了七个阶段,原力计划
腾讯产品项目的主体流程划分成了七个阶段,原力计划
出品 CSDN博客长话短说,产品项目的主体流程划分成了七个阶段,“ 概念阶段(CONCEPT)”“ 提案阶段(PROPOSAL)”“ 原型阶段(PROTOTYPE)”“ 产品阶段(ALPHA)”“ 内
查看详情>>
广易科技网(www.gooyi.net)| 手机版