汇编指令入门级整理( 二 )


存取速度比较
通过上面的叙述我们可以知道存取速度从高到低分别是: 寄存器 > 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 为例简单说明下这些寄存器的作用 , 整理如下表:

汇编指令入门级整理

文章插图
寄存器EAX、AX、AH、AL的关系
在上面的图标中每个常用寄存器后面还有其他的名字 , 它们是同一个寄存器不同用法下的不同名字 , 比如在32位 CPU 上 , EAX是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 下采用的是AT&T的汇编语法格式 , MSBUILD 采用的是Intel汇编语法格式 。
汇编指令入门级整理

文章插图
汇编指令入门级整理

文章插图
总结