汇编入门学习
Drunkbaby Lv6

https://www.bilibili.com/video/BV1Rs411c7HG

前期内容还是挺理论的,要先搞清楚电脑都有什么组成,都负责哪些功能,是怎么样运作的。

基础知识

汇编语言是直接在硬件之上工作的编程语言,首席按要了解硬件系统的结构,才能有效的应用汇编语言对其编程。

汇编的研究重点放在如何利用硬件系统的编程结构和指令集有效灵活的控制系统进行工作。

机器语言

机器语言是机器指令的集合。

机器指令展开来讲就是一台机器可以正确执行的命令。比如这个指令 01010000 (PUSH AX)—— 把 AX 推进堆栈。

而机器码只认识 01,所以在很多时候非常不方便,这就产生了汇编语言

汇编语言

汇编语言的主体是汇编指令,汇编语言和机器语言其实是一一对应的,也就是直接把 01 翻译成了对应能被识别的东西。如下的一个例子就是很好的说明。

寄存器

简单的讲是 CPU 中可以存储数据的器件,一个 CPU 中有多个寄存器。

AX 是其中一个寄存器的代号,BX 则是另一个寄存器的代号。

  • 然而这里又涉及到一个概念,计算机能读懂的只有机器语言,怎么样让计算机读懂汇编语言呢?

中间其实是通过一个编译器,它会将汇编指令翻译为机器码。

汇编语言的组成

汇编语言由以下三类组成

1、汇编指令(机器码的助记符)
2、伪指令(由编译器执行,编译器认识,计算机不认识)
3、其他符号(由编译器识别,比如加减乘除)

汇编语言的核心是汇编指令,它决定了汇编语言的特性。

存储器

CPU 是计算机的核心部分,它控制了整个计算机的运作并进行运算,要想让一个 CPU 工作,就必须要向它提供指令和数据。

  • 指令和数据在存储器中存放,也就是平时所说的内存。
  • CPU 是基于内存运行的,离开了内存,性能再好的 CPU 也无法工作。

磁盘不同于内存,磁盘上的数据或程序如果不被读到内存中,就无法被 CPU 使用。

指令和数据

指令和数据是应用上的概念。在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。

比如目前有个二进制 1000100111011000

对应的数据为 ——> 89D8H(数据)
同样可以表示为一个指令 ——> MOV AX,BX(程序)

存储单元

存储器被划分为若干个存储单元,每个存储单元从 0 开始顺序编号。例如一个存储器有 128 个存储单元,编号从 0 ~ 127,如图所示

对于大容量的存储器一般还用以下单位来计量容量,磁盘上的容量单位同内存的一样,实际上以上单位是微机中常用的计量单位。

1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1T = 1024GB

CPU 对存储器的读写

CPU 想要进行数据的读写,必须和外部器件(标准的说法是芯片)进行三类信息的交互

  • 存储单元的地址(地址信息,比如内存、硬盘、显卡等)
  • 器件的选择,读或写命令(控制信息)
  • 读或写的数据(数据信息)

由于电子计算机能处理、传输的信息都是电信号,电信号是用导线传送的,这也是 CPU 传输地址、数据、控制信息的通道。

在计算机中有专门连接 CPU 和其他芯片的导线,通常称为总线。

总线:是指计算机组件间规范化的交换数据(data)的方式,即以一种通用的方式为各组件提供数据传送和控制逻辑。

简单来说,总线是计算机硬件设备之间用来通信的

总线是单向的 例如:不能同时进行读取和写入的操作

物理上:一根根导线的集合;
逻辑上:地址总线、数据总线、控制总线

用下图来表示

  • 数据总线(Data Bus):在 CPU 与 RAM 之间来回传送需要处理或是需要储存的数据。总线是宽度决定了 CPU 与其它器件进行数据传送时一次数据的传送量。这也就决定了传送速度。
  • 地址总线(Address Bus):用来指定在 RAM(Random Access Memory)之中储存的数据的地址。总线宽度决定了 CPU 的寻址能力。一个 CPU 有 N 根地址总线,则可以说这个 CPU 的地址总线的宽度为 N。这样的 CPU 最多可以寻找 2 的 N 次方个内存单元。
  • 控制总线(Control Bus):将微处理器控制单元(Control Unit)的信号,传送到周边设备,一般常见的为 USB Bus 和 1394 Bus。总线宽度决定了 CPU 对系统中其它器件的控制能力。

内存地址空间

最终运行程序的是 CPU,我们用汇编的思维去理解程序,考虑问题。

首先思考如下一个场景,若我们电脑需要把一张图片显示出来,需要哪些过程或者说是步骤呢。

这里首先需要得到一个对应的内存地址,然后把数据放到对应的内存地址上面,最后再把数据的内容呈现到网卡上。而不同地址对应的其实是不同的器件,如内存条,显卡,网卡,RAM 主存储器等等。

而这些器件都分配了对应的地址,CPU 是根据地址传输对应需要的数据的。

接下来再看看一个例子,有如下程序,为什么得到的 q 的结果不是 6 + 7 + 8 = 21,而是 22 呢

1
2
3
4
5
6
7
void main {

int i=5,j=5,q,p;
p = (i++)+(i++)+(i++);
q = (++j)+(++j)+(++j);
printf("%d\n,%d\n,%d\n,%d\n", p,q,i,j)
}

这里其实可以编译完之后,通过汇编语言来看问题。(留给自己的实践任务)

寄存器(CPU 工作原理)

寄存器概述

X86 有 14 个寄存器,它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

寄存器有许多分类(以下为 x86)

  • 通用寄存器
  • 标志寄存器
  • 指令寄存器
  • 段寄存器
  • 控制寄存器
  • 调试寄存器
  • 描述符寄存器
  • 任务寄存器
  • MSR寄存器

AX、BX、CX、DX 通常用来存放一般性数据,被称为通用寄存器。下面以 AX 为例,来看一下它的逻辑结构。如下图

拿到一个数据,把它转换为二进制,再存储。

这四个通用寄存器都可以分为两个独立的 8 位寄存器使用,例如 AX 可以分为 AH 和 AL,H 就是 High,L 就是 Low。寄存器分高低,人不分贵贱(quoted by 小甲鱼

其实 AH 和 AL 分开和 AX 并不冲突,因为以前的系统是使用 8 位的,而不是 16 位,所以如果你要把 AX 向下兼容也是可以的,只要 8 - 15 都填 0 就可以,很好理解。

而如果在处理数据的时候,更常见的一种情况如下图所示。

 评论