大道至简 -> 汇编语言(一)

作者:少聪 github &&掘金

这个是拜读王爽大大写的汇编语言第三版书籍后总结的知识点。如有兴趣可以去看原书籍。

  • 汇编语言就是在硬件上工作的编程语言。

  • 先说下机器语言:机器语言就是机器指令的集合。大家都了解机器指令是一列二进制数字。

  • 电脑上有一个芯片可以执行机器指令进行运算,它就是CPU(Central Processing Unit 中央处理单元)

  • 早期的程序都是使用机器语言,程序员用 0、1数字编程的程序在纸带或者卡片上,1打孔,0不打 再将程序通过制袋机或卡片机输入计算机,进行运算。但是阅读和书写一堆0,1这样的机器语言太麻烦。于是汇编语言就产生了。

  • 汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。

    • 比如:1000100111011000 表示把寄存器BX 内容发送到AX 中。 汇编指令就是:mov ax,bx
  • 程序员就用汇编指令编写程序。 计算机能读懂的只有机器指令,所以就需要一个编译器来把汇编指令转换为机器指令。如下图:

### 汇编语言的组成

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

    存储器以及指令和数据

  • CPU是计算机的核心,控制着整个计算机的运行和运算,CPU工作 我们就需要向它提供数据和指令,那么这俩个东西放在哪? 没错、就放在了内存中。

  • 指令和数据 都是二进制信息。CPU会对不同的信息进行不同的标签。

    1000100111011000 -> 89D8H (数据)

    1000100111011000 -> mov ax,bx(程序)

    存储单元以及CPU对储存器的读写

  • 存储器被划分成若干个存储单元,每个存储单元从0开始顺序编号,比如 一个存储器有 128 个存储单元 ,编号就是 0 ~ 127。

  • 一个存储单元能存多少信息?

    电子计算机最小单位是 bit 也就是一个二进制位,8个 bit 组成一个 Byte (字节)。 微型机存储器的存储单元可以存储一个 Byte。

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

  • CPU 要读写数据,就需要找到指定的存储单元的地址。除了这之外还要说明是对哪个器件操作,进行哪种操作

    • 存储单元的地址(地址信息)
    • 器件的选择,读或写的命令(控制信息)
    • 读或写的数据(数据信息)
  • CPU如何进行数据读写?

- CPU 通过地址线将地址信息 3 发出。

- CPU 通过控制线发出内存读命令,选中存储器芯片,并通知它将要从里面读取数据。

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

  CPU 写数据,比如向 3 号单元写入数据 26

- CPU 通过地址线将地址信息 3 发出。

- CPU 通过控制线发出内存写命令,选中存储器芯片,并通知它将要向里面写入数据。

- CPU 通过数据线将数据 26 送入内存的 3 号单元中。
  • 如何命令计算机进行数据的读写

    • 要想让计算机工作,应该向它输入 机器码。

    • 机器码:10100001 00000011 00000000

      汇编指令:MOV AX,[3]

      含义: 传送 3 号单元的内容入AX

    地址总线、数据总线、控制总线

  • 地址总线:

    • CPU 是通过地址总线来指定存储器单元的。
    • 一个导线可以传送的稳定状态只有两种,高电平或者低电平。二进制表示就是0或1,19根导线可以传送 10 位 二进制数据。 10位二进制可以表示多少个不同数据呢? 2 的 10 次方个。 最小为0 最大为 1023。
  • 数据总线

    • CPU 与内存或其他器件之间的数据传送是通过数据总线进行的。数据总线的宽度决定了 CPU 和外界的数据传送速度。

      8 根数据总线一次可传送一个 8 位二进制数据(一个字节)

  • 控制总线

    • CPU 对外部器件的控制是通过控制总线进行的。

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

      比如: 读信号输出 的控制线负责 CPU 向外传送读信号。CPU 向该控制线上输出低电平表示将要读取数据。

    内存地址空间

  • 一个 CPU 的地址总线宽度为10 可以寻址 1024 个内存单元,这1024 个内存单元就构成了 这个 CPU 的内存地址空间。

  • 内存地址空间的大小受 CPU 地址总线宽度的限制。比如 8086CPU 的地址总线宽度为 20 , 那么就可以传送 2的20次方 个不同的地址信息。 则该内存的地址空间大小为 1MB。
  • 我们想基于一个计算机硬件系统编程。那就必须知道这个系统中的内存地址空间分配情况。这样我们才能在某类存储器中读写数据的时候,知道它的第一个单元的地址和最后一个单元的地址。保证读写操作是在预期的存储器中进行。
  • 最终运行程序的是 CPU ,我们用汇编语言编程时,必须从 CPU 角度考虑问题。系统中的所有存储中的存储单元都处于一个统一的逻辑存储器中,它的容量受 CPU 寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。

    通过题目把上面的东西回顾下 (包含答案)

  • 1 个 CPU 的寻址能力为 8KB, 那么它的地址总线的宽度为多少?

  • 1KB 的存储器有多少个存储单元,编号从多少到多少?
  • 1KB 的存储器可以存储多少个 bit, 多少个 Byte?
  • 1GB 、1MB 、1KB 分别是多少Byte?
  • 8080、8088、80286、80386 的地址总线宽度分别为 16根、20根、24根、32根。则它们的寻址能力分别为多少(KB)多少(MB)多少(MB)多少(GB)
  • 8080、8088、8086、80286、80386 的数据总线宽度分别为 8根、8根、16根、16根、32根。则它们一次可以传送的数据为:多少(B)多少(B)多少(B)多少(B)多少(B)
  • 从内存中读取 1024 字节的数据 8086 至少读多少次?80386至少要读多少次?
  • 在存储器中,数据和程序以什么形式存放?

    答案以及解析

  • 13位 。1KB=1024B,8KB=1024B*8=2^N,N=13。

  • 1024个储存单元 编号 0到1023

  • 1KB的存储器可以存储 8192(2^13) 个bit, 1024个Byte。

    8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)

  • 1GB是 1073741824 (2^30) 个Byte、1MB是 1048576(2^20) 个Byte、1KB是 1024(2^10)个Byte。

  • 64KB、1MB、16MB、4GB

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

  • 1B、1B、2B、2B、4B

    8根数据总线一次可以传送8位二进制数据(即一个字节)。

  • 8086至少要读 512 次 、80386至少要读 256 次。

    8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。

  • 二进制形式存放。

    在存储器中指令和数据没有任何区别,都是二进制信息。

QQ技术交流群:214541576

微信公众号:shavekevin

热爱生活,分享快乐。好记性不如烂笔头。多写,多记,多实践,多思考。

comments powered by Disqus