zoukankan      html  css  js  c++  java
  • 【汇编语言】01-基础知识

      汇编语言是直接在硬件之上工作的编程语言。要先了解硬件系统的结构,才能有效地应用汇编语言对其编程。因此,在正式学习汇编语言之前,先对其前置知识进行回顾,以期后续学习能有较好的基础。

    1 机器语言

      机器语言,就是机器指令的集合。机器指令,就是机器能够理解并执行的命令。机器指令就是一列二进制数,计算机能够将其转变为一列高低电平,从而驱动计算机的电子器件进行运算。

      在现代计算机中,由中央处理单元(Central Processing Unit,CPU)来执行机器指令,进行运算。CPU 是一种微处理器,每种微处理器,由于硬件设计和内部结构的不同,需要用不同的电平脉冲来控制。因此,每种微处理器都有自己的机器指令集,也就是机器语言。

      早期的程序设计均使用机器语言,程序员将 0、1 数字编成的程序代码打在纸带或卡片上。但机器语言很难理解,书写和阅读都非常不便。

    程序打孔卡

    2. 汇编语言的诞生

      机器语言难于理解和掌握,给整个产业的发展带来了障碍。为了解决这个问题,汇编语言诞生了。汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法——汇编指令是机器指令便于记忆的书写格式。

      汇编语言便于程序员使用,但计算机只能读懂机器指令,并不能理解汇编指令。所以势必要有一个将汇编指令转换为机器指令的翻译工具,这就是我们说的编译器。程序员用汇编语言写出源程序,汇编编译器将其编译为机器码,然后再交由计算机执行。

    使用汇编语言编写程序的工作过程

    3. 汇编语言的组成

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

      汇编语言由三类指令组成:

      • 汇编指令:机器码的助记符,有对应的机器码。
      • 伪指令:由编译器执行,计算机并不执行。没有对应的机器码。
      • 其他符号:如 +、-、*、/ 等,由编译器识别,没有对应的机器码。

    4. 存储器

      前文提到,CPU 控制整个计算机的运作并进行运算。但想让 CPU 工作,就必须向其提供指令和数据。指令和数据存放在内存中。而另一种存储器磁盘则不同于内存,磁盘上的程序和数据必须先读取到内存中,然后才能被 CPU 使用。

      想灵活地使用汇编语言编程,首先要了解 CPU 如何读写内存。

    5. 指令和数据

      指令和数据是应用上的概念。在内存和磁盘的角度来看,二者都是二进制信息,没有任何区别。只不过 CPU 在把某段二进制数看作指令,某段二进制数看作数据,从而赋予了它们不同的意义。

      譬如,对于二进制序列 1000100111011000 而言,既可以解读为 89D8H 的数据,也可以将其解读为指令 mov ax,bx 。

    6. 存储单元

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

    存储单元编号示意

      计算机的最小信息单位是一个二进制位,单位是 bit(比特)。8 个 bit 组成一个字节,单位是 Byte。

      计算机存储器的容量是以字节为最小单位计算的,有 128 个存储单元的存储器,其容量就是 128 个字节。

      对于大容量的存储器,通常还用以下单位来计量容量(B 来代表 Byte):

      • 1KB = 1024B
      • 1MB = 1024KB
      • 1GB = 1024MB
      • 1TB = 1024GB

    7. CPU 对存储器的读写

      上一节提到,存储器被划分为多个存储单元,并从 0 开始编号。这些编号可以看作存储单元在存储器中的地址,就像门牌号码。

      CPU 要从内存中读取数据,首先要指定存储单元的地址,即首先要确定,读取哪个存储单元中的数据。此外,计算机中不止有存储器这一种器件,CPU 在读写数据时还要知名,它要对哪一个器件进行操作、进行读操作还是写操作。

      综上,CPU 想进行数据读写,必须和外部器件(芯片)进行三类信息的交互:

      • 地址信息:存储单元的地址;
      • 控制信息:器件的选择、读或写的命令;
      • 数据信息:读或写的数据。

      计算机中有专门连接 CPU 和其他芯片的导线,通常称为总线。根据传送信息的不同,总线分为三类:地址总线、数据总线、控制总线。

    从地址为 3 的内存读取数据示意

      CPU 从地址为 3 的内存中读取数据的过程如上图所示。

      (1)CPU 通过地址总线将地址信息 3 发出;

      (2)CPU 通过控制线发出内存读命令,选中存储器芯片,通知它要从中读取数据;

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

      写操作和读操作类似,也是先发地址信息,再发控制信息,最后传输数据。

      通过以上描述,我们知道了 CPU 是如何进行数据读写的,但具体如何命令计算机进行数据读写?

      要让计算机或微处理器工作,要向它输入能够驱动它工作的电平信息(机器码)。对我们而言,还要用汇编指令表示:

      • 机器码:10100001 00000011 00000000
      • 汇编指令:MOV AX,[3]
      • 功能:将地址为 3 的内存单元中的数据写入 AX 寄存器。

    8. 地址总线

      前文提到,CPU 通过地址总线来指定存储器单元,地址总线上能传递多少种不同信息,决定了 CPU 可以对多少个存储单元进行寻址。

      如果 CPU 有 10 根地址总线,则其能表示 210 种不同状态。最小为 0,最大为 1023。

      一个 CPU 有 N 根地址线,则说这个 CPU 的地址总线宽度为 N。这样的 CPU 最多可以寻找 2 的 N 次方个内存单元。

    地址总线发送地址信息 11 示意

    9. 数据总线

      CPU 与内存或其他器件之间的数据传输时通过数据总线进行的。数据总线的宽度决定 CPU 和外界的数据传送速度(准确地说,数据总线的宽度决定一次能传输多少数据,确实会影响传输速度。但数据总线宽度不是唯一影响因素,主频也会影响数据传输速度)。

      8088 CPU 数据总线宽度为 8,8086 CPU 的数据总线宽度为 16。我们分别看一下,它们向内存中写入数据 89D8H 时,如何通过数据总线传送数据。

    8 位数据总线分两次传送 89D8H 示意

    16 位数据总线一次传送 89D8H 示意

      从以上两张示意图可知,8086 有 16 根数据总线,一次可以传送 16 位数据,所以 89D8H 一次就发完了。而 8088 只有 8 根数据线,一次只能传 8 位数据,所以 89D8H 需要分两次发送。

    10. 控制总线

      CPU 对外部器件的控制是通过控制总线来进行的。控制总线是个总称,它实际上是一些不同控制线的集合。有多少根控制总线,意味着 CPU 能对外部器件提供多少种控制。所以,控制总线的宽度决定了 CPU 对外部器件的控制能力。

      前面所讲的内存读写命令是由几根控制线综合发出的。其中有一根被称作“读信号输出”的控制线负责由 CPU 向外传送读信号,CPU 向该控制线输出低电平,表示将要读取数据。另有一根被称作“写信号输出”的控制线负责传送写信号。

    11. 内存地址空间概述

      以一个地址总线宽度为 10 的 CPU 为例,它可以寻址 1024 个内存单元,这 1024 个可寻找到的内存单元就构成了它的内存地址空间。此处先大致了解即可,后续再详细分析。

    12. 主板

      每台 PC 都有一块主板,主板上有 CPU、存储器、外围芯片组、扩展插槽等核心器件和主要器件。这些器件通过总线(地址总线、数据总线、控制总线)相连。扩展插槽上通常插有 RAM 内存条和各种接口卡。

    13. 接口卡

      计算机系统中,所有能够用程序控制的设备,必然是受到 CPU 控制的(因为 CPU 负责运行程序)。CPU 无法直接控制外部设备,譬如显示器、打印机等。直接控制这些设备工作的是接口卡。接口卡插在扩展插槽上,从而通过总线和 CPU 相连。CPU 可以直接控制这些接口卡,从而间接控制外设。

      简而言之,CPU 通过总线向接口卡发送命令,接口卡根据命令控制外设工作。

    14. 各类存储器芯片

      一台 PC 机中,装有多个存储器芯片。

      从物理连接上看,这些存储器芯片是独立的器件。

      从读写属性上看,存储器芯片分为两类:随机存储器(RAM)和只读存储器(ROM)。

      • 随机存储器:可读可写,但必须带电存储。关机后存储内容丢失。
      • 只读存储器:只能读取不能写入,关机后存储内容不丢失。

      从功能和连接上看,存储器分为以下几类:

      • 随机存储器
        • 存放供 CPU 使用的绝大部分程序和数据;
        • 主随机存储器一般由装在主板上的 RAM 和插在扩展插槽上的 RAM 组成。
      • 装有 BIOS(Basic Input/Output System,基本输入输出系统)的 ROM
        • BIOS 是由主板和各类接口卡(如显卡、网卡)厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出。
        • 在主板和某些接口卡上,插有存储相应 BIOS 的 ROM。譬如主板上的 ROM 存储着主板的 BIOS(系统 BIOS),显卡上的 ROM 存储着显卡的 BIOS 等。
      • 接口卡上的 ROM
        • 某些接口卡需要对大批量的输入输出数据暂时存储,所以在其上装有 RAM。最典型的就是显示卡上的 RAM,通常称为显存。显示卡随时将显存中的数据向显示器上输出。我们将需要显示的内容写入显存,就会出现在显示器上。

    PC 机中各类存储器的逻辑连接

    15. 内存地址空间

      尽管上述存储器在物理上是独立的,但有以下两个共同点:

      • 都和 CPU 总线相连;
      • CPU 对它们读写时,都通过控制总线发出内存读写命令。

      也就是说,CPU 在操控它们的时候,把它们都看作内存。CPU 将这些存储器总得看作一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们所说的内存地址空间。在汇编这门课中,我们面对的就是内存地址空间。

    逻辑存储器示意

      在上图中,各类物理存储器合在一起,被看作一个由若干存储单元组成的逻辑存储器,每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。CPU 在这段地址空间中读写数据,实际上就是在对应的物理存储器中读写数据。

      假设逻辑存储器中,内存地址空间的地址段分配如下:

      地址 0~7FFFH 的 32KB 空间为主随机存储器的地址空间;

      地址 8000H~9FFFH 的 8KB 空间为显存地址空间;

      地址 A000H~FFFFH 的 24KB 空间为各个 ROM 的地址空间。

      如果 CPU 向地址为 1000H 的内存单元中写入数据,实际就写入主随机存储器中。向地址为 8000H 的内存单元中写入数据,实际就是写入显存中,然后被显卡输出到显示器。向地址为 C000H 的内存单元写入数据,不会有结果,C000H 单元中的内容也不会改变,因为这是 ROM 存储器。

      内存地址空间的大小受 CPU 地址总线宽度的限制。8086 CPU 的地址总线宽度为 20,可以传送 220 个不同的地址信息,我们说其内存地址空间大小为 1MB。同理,80386 CPU 的地址总线宽度为 32,则其内存地址空间最大为 4GB。

      在基于计算机硬件系统编程时,必须知道这个系统中的内存地址空间分配情况,这样才能保证读写操作是在预期的存储器中进行。不同的计算机系统中,内存地址空间的分配情况是不同的。

    8086 计算机系统内存地址空间分配示意

      从地址 0~9FFFF 的内存单元中读取数据,实际就是读取主随机存储器中的数据。向地址 A0000~BFFFF 的内存单元中写数据,就是写入缓存,这些数据会被显卡输出到显示器上显示。向地址 C0000~FFFFF 的内存单元中写入数据是无效的,因为这部分是只读存储器。

      

  • 相关阅读:
    第十五篇:在SOUI中消息通讯
    为GDI函数增加透明度处理
    第十四篇:在SOUI中使用定时器
    第十三篇:在SOUI中使用有窗口句柄的子窗口
    第十二篇:SOUI的utilities模块为什么要用DLL编译?
    第十一篇:SOUI系统资源管理
    第十篇:扩展SOUI的控件及绘图对象(ISkinObj)
    第九篇:在SOUI中使用多语言翻译
    第八篇:SOUI中控件事件的响应
    Linked List Cycle
  • 原文地址:https://www.cnblogs.com/murongmochen/p/14100277.html
Copyright © 2011-2022 走看看