汇编语言的前世今生

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

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

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

带寄存器的加法机:

在这里插入图片描述

图4 带寄存器的加法机

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

能做四则运算的机器
这是对上一节的功能改进,主要体现在电路上的改进,原有基础上增加了减、除的三种电路功能。
在这里插入图片描述

图5 四则运算电路

机器指令:
在这里插入图片描述

图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 双寄存器的四则运算电路(改进版)

每一种运算的开关,增加一个下方的开关。随着寄存器个数和运算种类的增多,开关也会随之增多,长此以往,这不是长久之计,需要找到一种更好的办法。
将一排二进制数指定为指令,指令是给机器下达的执行命令。什么时候执行?按下“执行”开关。
在这里插入图片描述

图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 内存示意图

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

在这里插入图片描述

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

8根地址线呢?
在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

在这里插入图片描述

图13 运算器与内存

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

具体的例子:
在这里插入图片描述

图14 第一条指令执行

第一条指令占用两字节内存单元,改指令包含操作码和操作数,被操作的数字直接包含在指令中,这样的数叫立即数。
在这里插入图片描述

图15 指令执行全过程

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

处理器(Processor):
处理器的历史和发展
运算器(功能有限)发展为处理器(Processor)
在这里插入图片描述

图16 处理器示意图

处理器的组成:

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

1974,发明自动取指令并且执行指令的芯片,4004处理器。
在这里插入图片描述
紧接着,8008(8位处理器)和划时代的8086(16位处理器)。x86系列一直保持对8086的兼容性。
在这里插入图片描述

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

在这里插入图片描述

图17 处理器的位数

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

在这里插入图片描述

图18 i3-3220

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

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

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

  • 数据传送指令

    • 寄存器之间
    • 处理器和内存之间
    • 处理器和外围设备之间
    • 在这里插入图片描述
  • 处理器状态控制指令
    ○ 用于控制处理器内部的工作模式和运行状态,如电源管理和程序的运行状态

汇编语言的诞生:
汇编语言使用文本符号代替机器指令
在这里插入图片描述
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 停机,暂停

处理器只能看懂机器指令
在这里插入图片描述

图19 执行过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/282440.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS代码输出题:return Promise.resolve() 情况

题目: Promise.resolve().then(() > {console.log(0);return Promise.resolve(4);}).then((res) > {console.log(res)})Promise.resolve().then(() > {console.log(1)}).then(() > {console.log(2)}).then(() > {console.log(3)}).then(() > {con…

Vue 项目关于在生产环境下调试

前言 开发项目时,在本地调试没问题,但是部署到生产会遇到一些很奇怪的问题,本地又没法调,就需要在生产环境/域名下进行调试。 在这里介绍一个插件Vue force dev ,浏览器扩展里下载 即便是设置了Vue.config.devtoolsfalse 只要安…

前端对接 —— 周末

1.点击校验 点击校验 宇哥 记得过滤 不能校验的数据(我后端还要检验吗?) 2.前端数据对接 这个可以吗? 这种的可以吗?

工具在手,创作无忧:一键下载安装Auto CAD工具,让艺术创作更加轻松愉悦!

不要再浪费时间在网上寻找Auto CAD的安装包了!因为你所需的一切都可以在这里找到!作为全球领先的设计和绘图软件,Auto CAD为艺术家、设计师和工程师们提供了无限的创作潜力。不论是建筑设计、工业设计还是室内装饰,Auto CAD都能助…

计算机网络:网络层(无分类编址CIDR、计算题讲解)

带你快速通关期末 文章目录 前言一、无分类编址CIDR简介二、构成超网三、最长前缀匹配总结 前言 我们在前面知道了分类地址,但是分类地址又有很多缺陷: B类地址很快将分配完毕!路由表中的项目急剧增长! 一、无分类编址CIDR简介 无分类域间路由选择CI…

禁毒知识竞赛流程和规则

禁毒知识竞赛是一项全国性竞赛活动。有着深化全国青少年毒品预防教育,巩固学校毒品预防教育成果的重要作用。本文介绍一场禁毒知识竞赛的完整流程和规则,供单位组织此类活动时参考。 1、赛制 第一轮10进6,第二轮6进4,4支队伍决出…

力扣刷题-二叉树-平衡二叉树

110 平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 返回 true 。 给定二叉树 [1…

LearnDash LMS ProPanel在线学习系统课程创作者的分析工具

点击阅读LearnDash LMS ProPanel在线学习系统课程创作者的分析工具原文 LearnDash LMS ProPanel在线学习系统课程创作者的分析工具通过整合报告和作业管理来增强您的 LearnDash 管理体验,使您能够发送特定于课程的通信,并显示课程的实时活动&#xff01…

Cheat Enginee(CE)详细使用指南

一,下载与安装 首先在CE的官网下载Cheat Engine的软件包,下载完成之后找到文件所在的位置,进入文件运行exe文件,这样就可以进入Cheat Engine的安装界面。进入安装界面后设置好安装路径点击Next即可安装。 或者通过下载压缩包&…

进程通信知识基础【Linux】——下篇

目录 前文 一,命名管道 创建命名管道 1. getline——c库 2. unlink——系统接口 实践代码 common.hpp client.cpp server.cpp Log.cpp 二,共享内存(system V接口) 1. 创建共享内存 shmget接口 2. 删除共享内存 常见…

C++经典面试题(万字总结版)

一.编译链接运行 1. 虚拟地址空间的内存布局 Linux内存管理 | 二、虚拟地址空间布局 - 知乎 (zhihu.com) 3G的用户空间和1G的内核空间。 用户态有:代码段、数据段、堆、栈、bss段、文件映射和匿名映射区 内核态有:安全保护区、固定映射区、…

SolidWorks二次开发 C#-读取基于Excel的BOM表信息

SolidWorks二次开发 C#-读取基于Excel的BOM表信息 问题点来源解决方案及思路相关引用链接 问题点来源 这是一位粉丝问的一个问题,他说到: 老师,请问Solidworks二次开发工程图中"基于Excel的材料明细表"怎么读取里面的数据? Ps:这…