汇编语言:基础

作者: 华落 | 来源:发表于2017-07-27 20:29 被阅读96次

    一篇前言

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

    机器语言和汇编语言

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

    101110000000000000000011
    000001010000000000110000
    001011010000000000000101
    

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



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

    • 汇编指令:和机器码一一对应的汇编指令。像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读取一次数据的过程

        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位计算机就是指计算机的寻址能力。
    • 地址总线上发送的信息.png

    数据总线

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


    8位数据总线上一次传输的信息.png
         16数据总线上一次传输的信息.png
    由此可见:数据总线的宽度决定了cpu与外界传输数据的速度。

    控制总线

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

    小结一下

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

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

    相关文章

      网友评论

        本文标题:汇编语言:基础

        本文链接:https://www.haomeiwen.com/subject/vdazkxtx.html