汇编笔记——基础知识篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/imilano/article/details/81190666

阅读王爽汇编整理的笔记,相信坚持输出终会产生不一样的结果。


基础知识

汇编是与硬件息息相关的,因而,在了解汇编之前,先让我们对计算机硬件有个简要的认识。

1. 机器语言

众所周知,计算机的核心是 CPU (Central Process Unit,中央处理单元)。CPU 是一块只能识别电信号的电子元件。对于电信号,它只能理解开(on)和关(off)两种状态。于是,人们把开状态和 1 相对应,把关状态和 0 对应,通过输入一段0/1串,从而实现和 CPU 的通信和控制。这就形成了机器语言

对于每一种微处理器,由于内部硬件设计的不同,因而控制每一个部件对应0/1串也不同,所以每一种微处理器都有自己的机器指令集,也就是机器语言。

但是,对于这样的指令00000000 11111111,人类阅读和记忆很不方便。试想一下,当0/1串的数量一旦扩大,即便是其中很微小的一点错误,也将会变得极其难以查找。毕竟,机器语言是为计算机设计的,并不适合用来手动编程。于是,人们在机器语言的基础上抽象出更高的层级,发明了汇编语言

2. 汇编语言

如前所述,机器语言毕竟是给底层机器使用的,难以辨别和记忆,于是,人们把底层的机器语言和特定的字符指令形成一种对应关系,发明了汇编。

操作:把寄存器 BX 的内容送到 AX 中
机器指令:1000100111011000
汇编语言: mov ax,bx

如上所述,把特定指令和底层的机器码一一对应,从而实现了更高级的抽象,更重要的是,容易记忆,识别方便。

寄存器,是 CPU 中存储数据的元件,一个 CPU 往往有多个不同功能的寄存器。我们把这些寄存器和一串字母对应起来,例如 AX ,它代表的就是一个累积寄存器,AX 在本质上,只是起到一个标志的作用。

此后,程序员就可以使用汇编语言写程序了。可是,计算机能读懂的只是机器原因,它又怎么知道汇编语言所表达的意思呢?这个时候,就产生了一个叫做 编译器(Compiler) 的程序,这个机器的唯一作用,就是把汇编语言转换为计算机可以读懂的机器语言。当然,现代的编译器不仅仅能把汇编语言转换为机器语言,它能把高级语言转换为汇编语言,再把汇编语言转换为机器语言,十分的强大。

这里写图片描述

3. 存储器

现代计算机基本都是 冯· 诺依曼 结构,冯·诺依曼结构最大的特点就是把数据和指令存储在存储器中。故而,所谓的存储器,其实就是用来存储指令和数据的地方,本质上也就是电子元件,只是容量比寄存器大得多罢了。

存储器又分为内存外存,这里所说的存储器,就是我们所说内存。平时我们加内存条,扩充的就是内存的容量。

4. 存储单元

存储器被分为若干个存储单元,每个存储单元都有唯一的地址标识,一个存储单元通常存储8个比特(bit)。计算机中常用的计量单位如下:

单位 释意
bit(比特) 一个二进制位
Byte(字节) 1 Byte = 8 bit
KB(千字节) 1KB = 2^10 Byte
MB(兆字节) 1 MB = 2^10 KB
GB(吉字节) 1 GB = 2 ^10 MB
TB(太字节) 1 TB = 2 ^10 GB

存储单元是按顺序编址的,其地址一般用十六进制数来表示。故而,每个存储单元都有两个最基本的属性:存储单元的地址和其所存储的内容,这一点还请分清。

5. 总线系统

如前所述,指令和数据统一存储在存储器中,而 CPU 和存储器并不在同一个位置,那么,CPU 如何读取指令和数据呢?要解答这个问题,需要先了解一下总线系统

顾名思义,总线就是计算机各个部件之间交换信息的通道,是连接 CPU 和计算机其他芯片的导线。

总线从位置上划分,分为内部总线外部总线。内部总线直接集成到CPU内部,负责 CPU 内各部件之间的信息交换。而外部总线将CPU和计算机上其他部件连接起来,用于内外的信息交换。

总线从逻辑上分,又可以分为地址总线数据总线控制总线,不同总线负责传输不同的信息。举例来说,当 CPU 从3号单元中读取数据的过程如下:

(1)CPU 通过地址线将地址信息3发出去。

(2)CPU 通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从这个位置读取数据。

(3)存储器将3号单元的数据通过数据线送入 CPU。

这里写图片描述


接下来还需要补充一点关于总线的知识。

首先,对于地址总线来说,CPU 是通过地址总线来指定存储单元的。可见,地址线上能传送多少信息,我们就能对多少个存储单元进行寻址

我们知道,计算机最底层是二进制位,一个二进制位的值,要么是 0 ,要么是 1 ,只有两种选择。而我们又知道,一根地址线一次只能传送一个比特位。那么,对于有 n 根地址线的 CPU 来说,它能表示的最大范围的数为 2^n ,最小为 0 。也就是说,一次地址传送中,我们能表达的最大的地址单位是 2^n 。于是,我们把 n 叫做地址总线的宽度,把 2^n 叫做寻址宽度 .

其次,对于数据总线而言,数据总线的宽度,决定了 CPU 和外界的数据传送速度。8 根数据线一次可以传送 8 个二进制位,16 根数据线一次可以传送16个二进制位。我们平常所说的 64 位计算机,一般指的是通用寄存器的宽度为64位。计算机的数据总线宽度,决定了一次能传输多少信息。以 8086CPU 来说,其数据总线宽度为16,当我们传送一个十六位信息时,只需要传输一次。而 8088CPU 的数据总线宽度是8位,对于一个十六位的信息,要分两次传送。

最后是控制总线,控制总线的宽度决定了 CPU 对外部器件的控制能力。

6. 内存地址空间

之前我们已经介绍过,寄存器可以用来存储数据,但是寄存器能存储的信息毕竟有限。实际上,大部分的指令和数据基本都存储在内存中。

在介绍内存之前,首先要先了解一些预备知识。

主板, 每一台 PC 机中,都有一个主板,主板上集成了我们的总线系统、CPU 以及各种芯片。

接口卡,在计算机系统中,所有可用程序控制其他工作的设备,都必须受到 CPU 的控制。CPU 不能直接控制外部设备,直接控制这些设备的是插在扩展插槽上的接口卡。扩展插槽通过总线和 CPU 相连,所以接口卡也通过总线和 CPU 相连。CPU 可以直接控制这些接口卡,从而实现 CPU 对外设的间接控制。

这里写图片描述

存储器芯片, 一台 PC 机中,装着多个存储器芯片。从读写属性上看,这些芯片分为两类:随机存储器(RAM)只读存储器(ROM)

RAM 可读可写,但是必须带电存储 ,关机后存储内容丢失;ROM 只能读不能写,但是可以持久存储,关机后其内容不丢失。(PS:严格来说,ROM 也是可以写的,比如说,每次你更新BIOS,其实都是在往 ROM 里写数据。)

这些存储器从功能和连接少又可以分为以下几类:

  • 随机存储器

    用于存放供 CPU 使用的绝大部分程序和数据,主随机存储器一般由两个位置上的 RAM 组成:装在主板上的 RAM 和装在扩展插槽上的 RAM。

  • 装有BIOS(Basic Input/Output System)的 ROM

    BIOS ,译为基本输入输出系统,一般是由各种接口卡产商提供的软件系统。可以通过它尽进行最基本的输入输出。

  • 接口卡上的 RAM

    某些接口卡需要对大批量输入、输出系统进行暂时存储,故而自带 RAM。最典型的就是显卡上的 RAM, 一般称之为显存。显存的每个地址都对应着画面上的像素,显卡随时将显存中的数据向显示器上输出。

这里写图片描述

由上图可以知道,每一个外设都有自己的 RAM,我们对相应的 RAM 操作,就是对相应设备的操作。

内存地址空间,在上图中我们还可以总结出两点:

  • 上述存储器都是和 CPU 相连的。
  • CPU 对它们进行读写的时候都通过控制总线发出内存读写命令。

也就是说,CPU 在操控他们的时候,把他们当做内存来对待,把他们总的看做一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们所说的内存地址空间。通过对他们统一编址,从而进行寻址,并进行读写操作。

这里写图片描述

如图,所有的物理存储器都被看做一个由若干存储单元构成的逻辑存储器,每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。 CPU 在这段地址空间读写数据,实际上就是在相应的物理存储器中读取数据。

不同计算机系统的内存地址空间分配情况是不同的,我们在基于一个计算机硬件系统编程的时候,必须知道这个系统中的内存地址空间分配情况。当我们在某类存储器中读写数据时,必须知道他的第一个单元的地址和最后一个单元的地址,才能保证读写操作是在预期的存储器中进行。


以上,是为第一部分的读书笔记。感谢这本书,刷新了我的很多知识错误。行文如有错误,还望指正。

猜你喜欢

转载自blog.csdn.net/imilano/article/details/81190666