汇编语言的前世今生

计算机中的0和1是用电的状态表示的。具体来说,断开为0,接通为1。自然而言,这也对应着二进制。曾经时代的二进制加法机是一个划时代的产物,能够进行两个8位二进制数的实时加法,尽管今天看来很LOW。

汇编语言的前世今生_第1张图片

图1 二进制加法器(实时电路)

寄存器(临时性寄存)由多个触发器组成,寄存器是多输入多输出。触发器是单输入,单输出,锁存命令执行,输入才变成输出。

汇编语言的前世今生_第2张图片

图2 触发器示意图(执行锁存命令会触发)

汇编语言的前世今生_第3张图片

图3 寄存器(8个触发器组成)

带寄存器的加法机:

汇编语言的前世今生_第4张图片

图4 带寄存器的加法机

命令:
● 预制:执行锁存操作
● 相加:输入和寄存器中的数据做加法
可以实现连续的加法

能做四则运算的机器
这是对上一节的功能改进,主要体现在电路上的改进,原有基础上增加了减、除的三种电路功能。
汇编语言的前世今生_第5张图片

图5 四则运算电路

机器指令:
汇编语言的前世今生_第6张图片

图6 四则运算电路

带括号的算式在的具有一个寄存器的四则电路中的计算过程:
● 输入拨动为207,按“预制”,锁存207
● 输入拨动为9,按“加”,207和9相加后锁存216
● 此时,需要计算(56-48),但寄存器被占用,把216拿出来记下
● 输入拨动为56,按“预制”,锁存56
● 输入拨动为48,按“减”,56和48相减后锁存8
● 此时,需要计算(216/8),但寄存器被占用,把8拿出来记下
● 输入拨动为216,按“预制”,锁存216
● 输入拨动为8,按“除”,216和8相除后锁存27
以上,是带有一个寄存器的机器,痛点是执行复杂计算时需要额外记录中间结果。
怎么解决痛点? 答案是“增加寄存器”
下面,是带有两个寄存器的机器:
汇编语言的前世今生_第7张图片

图7 双寄存器的四则运算电路(改进版)

每一种运算的开关,增加一个下方的开关。随着寄存器个数和运算种类的增多,开关也会随之增多,长此以往,这不是长久之计,需要找到一种更好的办法。
将一排二进制数指定为指令,指令是给机器下达的执行命令。什么时候执行?按下“执行”开关。
汇编语言的前世今生_第8张图片

图8 指令二进制

使用带有两个寄存器的机器计算(207+9)/(56-48)的过程:
● 输入拨动为207,输入指令为00001,锁存207到R
● 输入拨动为9,输入指令为00101,207和9相加后锁存216到R
● 此时,需要计算(56-48),但寄存器被占用,把216拿出来记下
● 输入拨动为56,输入指令为00010,锁存56到Z
● 输入拨动为48,输入指令为01010,56和48相减后锁存8到Z
● 此时,需要计算(216/8),但寄存器被占用,把8拿出来记下
● 输入拨动为216,按“预制”,锁存216
● 输入拨动为8,按“除”,216和8相除后锁存27
● 输入指令为10000,R中的216和Z中的8相除,锁存到R

内存:

具有记忆能力的器件——内存。非常重要的器件。
随着机器功能增加,指令会更加复杂。能否将指令(代表指令的二进制数)存在一个地方,逐步执行呢?内存!
汇编语言的前世今生_第9张图片

图9 内存示意图

内存由大量的内存单元组成,主流计算机中,一个计算单元是8个比特。
如何区分内存单元呢?答:每个内存单元都有一个编号,第一个内存单元的编号是0,第二个内存单元的编号是1,第三个内存单元的编号是2,依此类推。内存单元的编号也叫地址。如何知道要访问那个内存单元呢?答:内存使用一排电线,称为地址线,来指定内存单元的编号。当想访问某个单元,地址线就输入编号,可以选中某个单元。
地址线的数量决定了可以访问多少个单元,如下(两根地址线只能访问四个单元):

汇编语言的前世今生_第10张图片

图10 两根地址线的内存示意图

8根地址线呢?
汇编语言的前世今生_第11张图片

图11 8根地址线的内存示意图

8位二进制数的组合一共有256个,所以可以访问256个(内存)单元。这种二进制组合就是内存地址,在左侧用16进制表示。如果是N根地址线,可以访问多少内存单元呢?答:“2N”。

内存是用来保存或读出数据用的,为此,还有另外的导线:数据线。通过数据线进行数据的读写操作,是双向的。 还需要一根读/写控制线指明是读取内存单元还是写入内存单元。
写入:首先,地址线上有一个地址指向内存单元,然后,在数据线上给出一个要读写的数字,最后,读/写控制线发出写命令,这时,内存会把数据写入到内存单元中。
读出:首先,在地址线上给出一个地址,表示从哪里读,然后,读/写控制线发出写命令,最后,通过数据线进行读出数据。
例子(向110写入8bit数据):

汇编语言的前世今生_第12张图片

图12 向16根地址线的内存(110)写入数据(10001101)

自动计算:
建造一台可以自动取指令并执行的运算机器
运算器可以自动从内存中“取址执行”

汇编语言的前世今生_第13张图片

图13 运算器与内存

指令指针寄存器:保存指令的地址。
运算器开始工作时,运算器将指令指针寄存器的地址输送到地址线上,是要执行的第一条指令的地址。然后内存将该地址的内容放在数据线上,通过数据线进入运算器,运算器根据指令进行移码,执行指令,与此同时,指令指针寄存器自动修改(根据当前执行指令的地址和长度)为下一条地址的值, 因为指令都是按顺序存放的。然后再次重复这个过程。

具体的例子:
汇编语言的前世今生_第14张图片

图14 第一条指令执行

第一条指令占用两字节内存单元,改指令包含操作码和操作数,被操作的数字直接包含在指令中,这样的数叫立即数。
汇编语言的前世今生_第15张图片

图15 指令执行全过程

最后一条指令是停机,执行后,运算器就停止工作。这时可以从0C处看到结果。

处理器(Processor):
处理器的历史和发展
运算器(功能有限)发展为处理器(Processor)
汇编语言的前世今生_第16张图片

图16 处理器示意图

处理器的组成:

  • 总线接口部件
    • 发送地址信号
    • 发送/接收数据信号
  • 控制部件
    • 复杂控制和协调整个处理的运行状态(什么时候取指令、输出地址、发送数据、接收数据)
  • 指令执行部件
    • 负责执行指令

1974,发明自动取指令并且执行指令的芯片,4004处理器。
汇编语言的前世今生_第17张图片
紧接着,8008(8位处理器)和划时代的8086(16位处理器)。x86系列一直保持对8086的兼容性。
汇编语言的前世今生_第18张图片

几位的处理器有几位的寄存器和几位的算术逻辑部件

汇编语言的前世今生_第19张图片

图17 处理器的位数

后续Intel又生产了80286和80386,80386是划时代的产品。课程前部分基于8086讲解,后部分基于80386讲解。
后来,推出更多产品,根据领域不同细分更多的类型。i3-3220。引脚用来连接数据线、地址线、控制线。

汇编语言的前世今生_第20张图片

图18 i3-3220

处理器的工作是自动取指令并执行指令。可以执行哪些指令是设计和制造时候就已经决定了的。

  • 指令集:所有可以识别和可以执行的指令的集合

    • 十几种,几十种
    • 几百上千
  • 算数运算指令和逻辑运算指令

  • 数据传送指令

    • 寄存器之间
    • 处理器和内存之间
    • 处理器和外围设备之间
    • 汇编语言的前世今生_第21张图片
  • 处理器状态控制指令
    ○ 用于控制处理器内部的工作模式和运行状态,如电源管理和程序的运行状态

汇编语言的诞生:
汇编语言使用文本符号代替机器指令
汇编语言的前世今生_第22张图片
mov r, 207 把207移动到寄存器r
add r, 9 寄存器r的值和9相加,放在r中
mov z, 56 56移到寄存器z中
sub z, 48 寄存器z的值和48相减,结果放在z中
div r, z 寄存器r的值和寄存器z的值相除,结果放在r中
mov [12], r 寄存器r的值放在内存地址为12的内存单元
hlt 停机,暂停

处理器只能看懂机器指令
汇编语言的前世今生_第23张图片

图19 执行过程

你可能感兴趣的:(计算机基础,单片机,嵌入式硬件,汇编)