汇编语言的前世今生

news2024/9/23 13:24:01

计算机中的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.coloradmin.cn/o/1315819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面向对象三大特征之二:继承

继承的快速入门 什么是继承? Java中提供了一个关键字extends,用这个关键字,可以让一个类与另一个类建立起父子关系 继承的特点 子类能继承父类的非私有成员(成员变量、成员方法) 继承后对象的创建 子类的对象是由…

商用机器人,不好用是原罪

热潮褪去后,所有的问题都汇总成一个词,不好用。 从炙手可热到“大玩具” 一款产品好用与否,更多时候人们不会关心它先进的技术、工艺、用料,也不会考虑所谓的潮流趋势或前景,只会用最朴素的直观感受告诉你&#xff0…

TrustZone之总线请求

接下来,我们将查看系统中的总线请求者,如下图所示: 系统中的A型处理器具有TrustZone感知,并在每个总线访问中发送正确的安全状态。然而,大多数现代SoC还包含非处理器总线请求者,例如GPU和DMA控制器。 与完成…

Modbus转Profinet网关使用方法

Modbus转Profinet网关(XD-MDPN100/200)是用于将Modbus协议和Profinet协议进行转换并进行通迅的设备。Modbus转Profinet网关(XD-MDPN100/200)无论是新项目还是改造项目都可轻松配置完成通迅互联。 正确的安装和配置对于确保设备的正…

讨好型人格最适合从事什么职业?

讨好型人格,其言行不是考虑个人,而是以满足对方为主,只要是他人的想法,都会尽力去满足,特别害怕自己做了什么事情,让对方产生不满的想法。遇到事情,也很难主动请求别人,总是依靠自己…

Hudi 在 vivo 湖仓一体的落地实践

作者:vivo 互联网大数据团队 - Xu Yu 在增效降本的大背景下,vivo大数据基础团队引入Hudi组件为公司业务部门湖仓加速的场景进行赋能。主要应用在流批同源、实时链路优化及宽表拼接等业务场景。 一、Hudi 基础能力及相关概念介绍 1.1 流批同源能力 与H…

Caused by: java.net.ConnectException: 拒绝连接: hadoop104/192.168.124.130:4142

项目场景:hadoop102接收消息,自定义拦截器,包含hello的发往hadoop103,不包含的发往hadoop104 报错原因: 原因1: 应该先开启接收方(服务端),hadoop103,hadoop104,最后开启hadoop10…

如何安装LUT预设?达芬奇/FCP/PR怎么安装LUT预设.cube格式文件的教程

在下载的LUT调色预设压缩文件包中,通常两个包含不同格式的LUT文件: .cube 和 .xmp 包含的 .cube 文件几乎与主流的视频编辑和色彩校正软件兼容,并且还可以在 Adobe Photoshop 等一些照片应用程序中使用。如果主要是将这些 LUT 用于视频剪辑项…

Vue3-21-组件-子组件给父组件发送事件

情景描述 【子组件】中有一个按钮,点击按钮,触发一个事件, 我们希望这个事件的处理逻辑是,给【父组件】发送一条消息过去, 从而实现 【子组件】给【父组件】通信的效果。这个问题的解决就是 “发送事件” 这个操作。 …

KubeKey 离线部署 KubeSphere v3.4.1 和 K8s v1.26 实战指南

作者:运维有术 前言 知识点 定级:入门级了解清单 (manifest) 和制品 (artifact) 的概念掌握 manifest 清单的编写方法根据 manifest 清单制作 artifactKubeKey 离线集群配置文件编写KubeKey 离线部署 HarborKubeKey 离线部署 KubeSphere 和 K8sKubeKey…

2023-12-16:用go语言,给定整数数组arr,求删除任一元素后, 新数组中长度为k的子数组累加和的最大值。 来自字节。

2023-12-16:用go语言,给定整数数组arr,求删除任一元素后, 新数组中长度为k的子数组累加和的最大值。 来自字节。 答案2023-12-16: 来自左程云。 灵捷3.5 大体步骤如下: 算法 maxSum1 分析&#xff1…

12345、ABCDE项目符号列表文字视频怎么制作?重点内容介绍PR标题模板项目工程文件

Premiere模板,包含10个要点标题12345、ABCDE项目符号列表文字模板PR项目工程文件。可以根据自己的需要定制颜色。在视频的开头、中间和结尾使用。包括视频教程。 适用软件:Premiere Pro 2019 | 分辨率:19201080 (HD) | 文件大小:9…

金融众筹系统源码:适合创业孵化机构 附带完整的搭建教程

互联网技术的发展,金融众筹作为一种新型的融资方式,逐渐成为创业孵化机构的重要手段。为了满足这一需求,金融众筹系统源码就由此而生,并附带了完整的搭建教程。 以下是部分代码示例: 系统特色功能一览: 1.…

数据迁移测试经验分享

以下为作者观点: 数据迁移,是在保证新旧系统业务连续性的前提下,将数据从旧数据库迁移到新数据库的过程,测试前通过迁移策略和方案了解新旧系统数据如何重构与关联,测试过程需确保数据迁移的正确性,主要体…

《Linux C编程实战》笔记:一些系统调用

目录 dup和dup2函数 fcntl函数 示例程序1 示例程序2 ioctl函数 dup和dup2函数 #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd): dup 函数复制 oldfd 参数所指向的文件描述符。 参数&#xff1a; oldfd&#xff1a;要复制的文件描述符的…

【TB作品】基于单片机的实验室管理系统,STM32,GM65二维码扫描模块

硬件&#xff1a; &#xff08;1&#xff09;STM32F103C8T6最小板&#xff08;&#xff09; &#xff08;2&#xff09;GM65二维码扫描模块 &#xff08;3&#xff09;DS1302实时时钟模块 &#xff08;4&#xff09;AT24C02 存储设备 &#xff08;5&#xff09;蜂鸣器 &#xf…

git 上传大文件操作 lfs 的使用

我们要先去下载 下载后安装 我最后还是下载到了D:\git\Git\bin这个目录下 如何检查是否下载成功呢&#xff0c;用 git lfs install 在命令行运行就可以查看 下面怎么上传文件呢 首先我们还是要初始化文件的 git init 下一步输入命令 git lfs install 下一步 git lfs tra…

初级数据结构(五)——树和二叉树的概念

文中代码源文件已上传&#xff1a;数据结构源码 <-上一篇 初级数据结构&#xff08;四&#xff09;——队列 | NULL 下一篇-> 1、树结构&#xff08;Tree&#xff09; 1.1、树结构的特点 自然界中的树由根部开始向上生长&#xff0c;随机长出分支&…

在Node.js中MongoDB查询分页的方法

本文主要介绍在Node.js中MongoDB查询分页的方法。 目录 Node.js中MongoDB查询分页使用原生的mongodb驱动程序查询分页使用Mongoose库进行查询分页注意项 Node.js中MongoDB查询分页 在Node.js中使用MongoDB进行查询分页&#xff0c;可以使用原生的mongodb驱动程序或者Mongoose库…

AtCoder ABC周赛2023 12/10 (Sun) D题题解

目录 原题截图&#xff1a; 题目大意&#xff1a; 主要思路&#xff1a; 注&#xff1a; 代码&#xff1a; 原题截图&#xff1a; 题目大意&#xff1a; 给定两个 的矩阵 和 。 你每次可以交换矩阵 的相邻两行中的所有元素或是交换两列中的所有元素。 请问要使 变换至…