汇编语言:基础

一篇前言

这是一系列的汇编语言学习的读书笔记,以及一些自己的理解系列文章。我想我会在循序渐进的学习中,写下对汇编的点点滴滴,一方面是给自己立一个短期的小目标,另一方面,如果您有缘看到了这一系列的文章,希望对您有所帮助。

机器语言和汇编语言

虽然我们在写程序的时候使用的是诸如C,C++等高级语言,但最终会通过编译器转换成二进制的机器语言,机器语言实际上是一堆二进制指令的集合,计算机会将它转换成高低电平驱动硬件工作,实际上计算机非常的笨蛋,只能认识高低电平,所以,我们用二进制来代替高低电平,例如我们要计算s = 768 + 12288 - 1280,机器码如下:

101110000000000000000011
000001010000000000110000
001011010000000000000101

这种机器码非常难以书写,修改和记忆,早起的程序员很快就发现了这些问题,于是他们就发明了汇编语言。
  汇编语言实际上是机器语言的另一种书写格式。
比如:机器指令:1000100111011000表示把寄存器 bx的内容放到ax中去,而对应的汇编指令可以写成mov ax,bx。这样的写法更容易记忆和理解。
寄存器:简单的理解就是一种cpu内部用来存放数据的东西。
  可是计算机只认识01这样的机器代码,那怎么让计算机认识更贴近人类语言的汇编语言呢?这时候就需要一个翻译的中间程序,把汇编语言翻译成01这样的机器指令,我们把它叫做编译器。下图展示了这个翻译过程,实际上我们今天使用的java,c等高级语言也会先翻译成汇编,再由汇编翻译成机器指令。


汇编语言:基础_第1张图片

那么,汇编语言由哪些东西组成的呢?

  • 汇编指令:和机器码一一对应的汇编指令。像mov
  • 伪指令:没有对应的机器指令,由编译器执行,计算机不执行。
  • 其他符号:像+,-,*,/等,由编译器识别,也没有对应的机器码。

存储器

  cpu是计算机的核心部件,cpu要想工作,就必须要给它指令和数据,指令和数据在存储器中存放,也就是我们平时所说的内存。这里要注意,磁盘或者硬盘不同于内存,我们平时的程序是放在硬盘上的,如果想要运行程序,必须将程序的指令和数据加载到内存中。

指令和数据

  指令和数据在内存和磁盘上是没有区别的,都是一堆01的二进制数据。
比如:1000100111011000
作为数据是:89D8H (H代表16进制数据)
作为指令是:mov ax,bx

存储单元

存储器(这里所说的存储器,就是我们所说的内存,但不单指内存条,还有显存等硬件的内存)被划分为N个,就是很多个存储单元,你可以把它想象成一个个的小格子,每一个存储单元的大小是1个字节,也就是可以存放8个0101。它们从0开始编号,拥有自己的地址。
例如,下图是一个拥有128个存储单元的存储器的内存单元布局,0~127


计算机对存储器的读写

前面,我们讲cpu要想工作,必须有存储器提供指令和数据,我们知道存储器被划分为一个个的存储单元,数据在每一个存储单元中,cpu要想对存储器的内容进行访问至少要满足下面3个要求:
1、 存储单元的地址:cpu要知道内存单元的地址(也就是要知道我即将读取哪一个内存单元中的内容)。
2、 控制器信息:cpu是要读数据还是写数据
3、 数据信息:我们要写入或者读取的数据信息。

那么cpu又是通过什么将地址,控制信息,数据信息传递给存储器的呢?

我们知道cpu是通过高低电平驱动计算机硬件进行工作的,而传递这些电信号,需要导线,在计算机中连接cpu和其他各种芯片的导线,我们称为数据总线。

  • 物理上数据总线是一根根导线的集合。
  • 逻辑上分为
    • 地址总线
    • 控制总线
    • 数据总线
      下图描述了cpu读取一次数据的过程
      汇编语言:基础_第2张图片

      1、cpu通过地址总线发送地址03到存储器中
      2、存储器通过地址03锁定3号内存单元
      3、cpu通过控制总线发出读命令到存储器中
      4、存储器将内存单元03中的数据08通过数据总线送入cpu
      由上图可以了解到cpu是如何读取内存中的数据的,那么我们又怎么指挥cpu去读这个数据呢?
      要让cpu干活,应该向它输入驱动它工作的电平信息,也就是机器码。如下:
      机器码:1010000100000010000000
      含义:从3号内存单元读取数据到寄存器ax中
      机器码难遇记忆和理解,我们也可以用汇编指令来表示:
      mov ax,[03]
      含义:从3号内存单元读取数据到寄存器ax中

地址总线

cpu是通过地址总线来指定要操作的内存单元,那么地址总线上一次能传送的多少个不同的信息,多少个0101,决定了cpu能够对多少个内存单元进行寻址。

  • 我们平常说的16/32/64位计算机就是指计算机的寻址能力。
  • 汇编语言:基础_第3张图片
    地址总线上发送的信息.png

数据总线

cpu和存储器之间传输数据的总线,数据总线的的宽度,决定了一次能够传输数据的大小,8根数据总线一次可传输8bit(位),即一个字节大小,16根数据总线一次可传输16bit的数据,即2个字节大小。


汇编语言:基础_第4张图片
8位数据总线上一次传输的信息.png

    
汇编语言:基础_第5张图片
16数据总线上一次传输的信息.png

由此可见:数据总线的宽度决定了cpu与外界传输数据的速度。

控制总线

cpu对外部芯片的控制,是通过控制总线来完成的,这里控制总线只是个总称,控制总线是很多根不同控制线的集合。多少根控制总线,就决定了cpu能对多少个外部芯片的控制。

小结一下

以上呢都是一些枯燥的内容,但对于理解汇编又尤为重要的基础,我们稍作总结:

  • 汇编指令只是为了我们便于书写,理解,记忆机器指令的助记符,它和机器指令0101是一一对应的。
  • 每一种cpu有自己的汇编指令集。
  • cpu能够直接使用的数据或者指令呢,必须要加载到内存中,也就是说cpu只能够使用内存中的数据。(内存,高速缓存)
  • 在存储器中(内存中)指令和数据是没有区别的,其本质都是0101的二进制。
  • 存储器被划分为一个个的内存单元,内存单元从0开始编号,即为内存地址。
  • 一个存储单元可以存储8个bit,即位1个字节,8个0或1.
  • cpu引出了3种总线,标志着cpu不同方面的性能
    • 地址总线:标志着cpu的寻址能力
    • 数据总线:标志着cpu的传输速度的能力
    • 控制总线:决定了对外部芯片的控制能力。

你可能感兴趣的:(汇编语言:基础)