汇编指令入门级整理


汇编指令入门级整理

文章插图
作者 | AlbertS
出品 | CSDN 博客
汇编指令入门级整理

文章插图
前言
我们大都是被高级语言惯坏了的一代 , 源源不断的新特性正在逐步添加到各类高级语言之中 , 汇编作为最接近机器指令的低级语言 , 已经很少被直接拿来写程序了 , 不过我还真的遇到了一个 , 那是之前的一个同事 , 因为在写代码时遇到了成员函数权限及可见性的问题 , 导致他无法正确调用想执行的函数 , 结果他就开始在 C++ 代码里嵌入汇编了 , 绕过了种种限制终于如愿以偿 , 但是读代码的我们傻眼了…
因为项目是跨平台的 , 代码推送的 linux 上编译的时候他才发现 , 汇编代码的语法在 Linux 和 windows 上居然是不一样的 , 结果他又用一个判断平台的宏定义“完美”的解决了 , 最终这些代码肯定是重写了啊 , 因为可读性太差了 , 最近在学习左值、右值、左引用和右引用的时候 , 总是有人用程序编译生成的中间汇编代码来解释问题 , 看得我迷迷糊糊 , 所以决定熟悉一下简单的汇编指令 , 边学习边记录 , 方便今后忘记了可以直接拿来复习 。
汇编指令入门级整理

文章插图
什么是汇编语言
汇编语言是最接近机器语言的编程语言 , 引用百科中的一段话解释为:
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言 , 亦称为符号语言 。在汇编语言中 , 用助记符代替机器指令的操作码 , 用地址符号或标号代替指令或操作数的地址 。汇编语言又被称为第二代计算机语言 。
【汇编指令入门级整理】汇编语言产生的原因
对于绝大多数人来说 , 二进制程序是不可读的 , 当然有能人可以读 , 比如第一代程序员 , 但这类人快灭绝了 , 直接看二进制不容易看出来究竟做了什么事情 , 比如最简单的加法指令二进制表示为 00000011 , 如果它混在一大串01字符串中就很难把它找出来 , 所以汇编语言主要就是为了解决二进制编码的可读性问题 。
汇编与二进制的关系
换句话来说 , 汇编语言就是把给机器看的二进制编码翻译成人话 , 汇编指令是机器指令的助记符 , 与机器指令是一一对应的关系 , 是一种便于阅读和记忆的书写格式 。有效地解决了机器指令编写程序难度大的问题 , 并且使用编译器 , 可以很方便的把汇编程序转译成机器指令程序 , 比如之前提到的 00000011 加法指令 , 对应的汇编指令是 ADD , 在调用汇编器时就会把 ADD 翻译成 00000011 。
汇编指令入门级整理

文章插图
寄存器
说到汇编指令不得不提到寄存器 , 寄存器本身是用来存数据的 , 因为 CPU 本身只负责逻辑运算 , 数据需要单独储存在其他的地方 , 但是对于不熟悉寄存器的人来说会有疑惑 , 数据不是存在硬盘上吗?或者说数据不是存在内存中吗?这些想法都没错 , 那么寄存器是用来做什么的呢?
寄存器作用
其实硬盘、内存都是用来存储数据的 , 但是 CPU 的运算速度远高于内存的读写速度 , 更不用说从硬盘上取数据了 , 所以为了避免被拖慢速度影响效率 , CPU 都自带一级缓存和二级缓存 , 一些 CPU 甚至增加了三级缓存 , 从这些缓存中读写数据要比内存快很多 , 但是还是无法使用飞速运转的 CPU , 所以才会有寄存器的存在 。
寄存器不是后来增加的 , 在最初的计算中就已经设计出来 , 相比而言 , 多级缓存出现的更晚一些 , 通常那些最频繁读写的数据都会被放在寄存器里面 , CPU 优先读写寄存器 , 再通过寄存器、缓存跟内存来交换数据 , 达到缓冲的目的 , 因为可以通过名称访问寄存器 , 这样访问速度是最快的 , 因此也被称为零级缓存 。


推荐阅读