baby sword‘s blog baby sword‘s blog
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)

zhengjian

不敢承担失去的风险,是不可能抓住梦想的
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)
  • 计算机网络

  • 操作系统

    • 如何在VM上创建一个linux虚拟机
    • linux命令解析
    • linux一些重要的命令
    • linux中的文件类型
    • linux中的交换区
    • linux中分区是什么
    • 环境变量
    • 银行家算法
    • 操作系统内存管理
    • 虚拟内存
    • 硬链接和软链接有什么区别
    • 常见的调度算法
    • 零拷贝技术
    • yum
    • systemctl
    • 汇编语言
      • 一.前言
      • 二. 基本概念
        • 1.1 机器语言
        • 机器语言有什么缺点
        • 汇编语言如何产生
        • 1.2 汇编语言的组成
        • 1.3 指令与数据
        • 1.4 存储器
        • 存储单元
        • 1.5 地址总线
        • 1.6 数据总线
        • 1.7 控制总线
        • 1.7 内存地址空间
        • 什么是内存地址空间
        • 什么是主板
        • 什么是接口卡
      • 三.寄存器
        • 1. cpu概述
        • 2. 什么是通用寄存器
        • 3. 8086以前的兼容问题
        • 4. 字在寄存器中的存储
        • 5. 初入汇编语言
        • 6. 进制丢失问题
        • 7. 物理地址
        • 16位结构的CPU特点
        • 段寄存器
        • 编译环境搭建
    • 汇编语言实操
    • 死锁
  • 算法

  • 计算机基础
  • 操作系统
xugaoyi
2023-08-22
目录

汇编语言

# 一.前言

  • 汇编语言是任何一种计算机的一种低级语言

  • 不同的机器中汇编语言的指令集不同

  • 通过汇编语言转换成机器后才能执行

  • 不同平台之间不能进行移植,因为不同的机器的指令集可能不同

# 二. 基本概念

# 1.1 机器语言

机器语言:010101组成的数据集合

例如:机器指令:01010000 表示的汇编语言为(PUSH AX)

对应到物理层会有一个电平脉冲,通过脉冲进行机器指令的01传输

image-20230814230526993

# 机器语言有什么缺点

如果只有机器语言

  1. 计算 S=768+12288+1280 ,
  2. 表示机器码如下

image-20230814230745744

  1. 但是如果我们在输入的过程中,输入错误了,那找到对应的01哪儿错了就非常困难

image-20230814230820173

  • 错误难以查找
  • 01难以编程

# 汇编语言如何产生

因为上述的机器语言的缺点,由此产生了汇编语言

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

示例:

image-20230814231114625

与人类语言更接近

汇编指令经过编译器可以成为机器指令

# 1.2 汇编语言的组成

  1. 汇编指令(机器码的助记符)
  2. 伪指令(由编译器执行)
  3. 其他符号(由编译器识别)

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

# 1.3 指令与数据

怎么区分汇编中表示的是指令还是数值

image-20230814231446136

一串机器码的实际含义取决于当前的机器码处在的语境当中(程序还是数据中)

# 1.4 存储器

cpu要执行,就必须给他提供指令和数据,而指令和数据就储存在我们存储器中

内存的作用仅次于CPU,磁盘与内存不同,需要首先将磁盘上的数据存放到内存

# 存储单元

存储器被花费为若干个存储单元,每个存储丹单元从0开始编号。

image-20230814232237404

每一个存储单元可以存储一个字节即8bit

除了以1B为单位,还可以用以下为单位

image-20230814232411392

CPU想要对存储器中的数据进行读写,必须和外部器件(芯片)进行交互。需要交互的信息如下

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

那么CPU是如何告诉芯片这些信息的呢?

总线:计算机中专门有连接CPU和其他芯片的导线,通常称为总线。

物理上:一根根导线的集合

逻辑上:地址总线、数据总线、控制总线

示例:

image-20230814232941394

  1. CPU通过地址总线告诉内存其要操作的是3号内存号
  2. CPU通过控制总线发出要读的信息
  3. CPU通过数据总线读取3号为的数据,并存放到pu的器件中

写的流程和读差不多。类比即可

例如cpu收到了对应的机器码,并执行相应的指令: image-20230814233259782

# 1.5 地址总线

  • CPU是通过地址总线来指定存储单元的
  • 地址总线上能够传输多少个不同的信息,CPU就可以对多少个存储单元进行寻址

image-20230814233553239

如果地址总线有10根,则可以寻址范围为 2^10

image-20230814233647577

寻址总线的数量也称为寻址总线的宽度

# 1.6 数据总线

  • CPU与内存或其他器件之间的数据传输时通过数据总线来进行的

  • 数据总线的宽度决定了CPU和外界的数据的传送速度

举例

向内存中写入数据89D8H:

image-20230814233919353

一次传输1字节

image-20230814233929232

一次传输两字节

# 1.7 控制总线

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

image-20230814234235259

总结

  • 地址总线的宽度决定了CPU的寻址能力;
  • 数据总线的宽度决定了CPU与其它器件进行数据传送时的一次数据传送量;
  • 控制总线宽度决定了CPU对系统中其它器件的控制能力。

# 1.7 内存地址空间

# 什么是内存地址空间

一个cpu的地址总线宽度为10,那么可以寻址1024个内存单元,这1024个可寻址到的内存单元构成这个cpu的内存地址

# 什么是主板

主板

在每一台PC机中,都有一个主板,主板上有核心器件和一些主要器件。 这些器件通过总线(地址总线、数据总线、控制总线)相连。

# 什么是接口卡

接口卡:

计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制。CPU对外部设备不能直接控制,如显示器、音箱、打印机等。直接控制这些设备进行工作的是插在扩展插槽上的接口卡。

image-20230815213948380

image-20230815214017020

上述的那些存储器在物理上是独立的器件。但是它们在以下两点上相同:

  • 都和CPU的总线相连。
  • CPU对它们进行读或写的时候都通过控制线发出内存读写命令。

image-20230815214133380

可以将所有的存储器看成逻辑上的内存空间

如下,将cpu可访问的内存地址空间抽象为下面的地址空间

image-20230815214237883

最终运行程序的是CPU,我们用汇编编程的时候,必须要从CPU角度考虑问题。

对CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。cpu寻址能力等价于cpu的地址总线

# 三.寄存器

# 1. cpu概述

一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。 内部总线实现CPU内部各个器件之间的联系。 外部总线实现CPU和主板上其它器件的联系。

8086CPU有14个寄存器它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

什么是8086CPU ?

gpt解释:

8086 是一种 16 位微处理器,由 Intel 公司于 1978 年推出。它是 x86 架构的一部分,x86 架构是一种常见的 CPU 架构,广泛用于个人计算机和服务器。8086 微处理器是 x86 架构的最早版本之一,后来发展成了后续的处理器家族,如 80286、80386、80486,以及现代的 Intel Core 处理器等。

以下是一些 8086 微处理器的特点:

  1. 位数:8086 是一款 16 位处理器,这意味着它的寄存器、数据通路和内存地址都是 16 位宽度。这与其后续的 32 位和 64 位处理器不同。
  2. 寄存器:8086 有多个通用寄存器,包括 AX、BX、CX 和 DX。这些寄存器可以用于存储数据、执行运算和数据传输。
  3. 分段内存模型:8086 使用分段内存模型,将内存分成多个段,每个段的大小为 64KB。通过使用段寄存器和偏移地址,可以实现对大于 64KB 的内存空间的访问。
  4. 指令集:8086 微处理器的指令集是基于 x86 架构的早期版本,包括各种数据传输、算术运算、逻辑操作、控制流等指令。
  5. 工作模式:8086 可以在实模式和保护模式下工作。实模式类似于早期的计算机系统,而保护模式在后来的处理器版本中得到了更多的扩展,提供了更强大的内存保护和多任务能力。
  6. 时钟频率:初始的 8086 微处理器的时钟频率为 5MHz,但后来的版本提高了时钟频率。
  7. 扩展性:8086 微处理器有限的 16 位寻址能力和寄存器宽度在后来的处理器中受到了限制,因此在大多数现代计算机中,更高版本的 x86 处理器已成为主流。

尽管 8086 微处理器已经过时,但它在计算机历史上具有重要意义,因为它标志着 x86 架构的开始,并对后来的个人计算机硬件和软件发展产生了深远影响。

# 2. 什么是通用寄存器

8086所有寄存器都是可以存放2字节数据的。

AX、BX、CX、DX 用来存放一般性的数据

image-20230815223446768

举例:

image-20230815223523311

image-20230815223537877

  • 一个通用寄存器最大可以存放的数据为多少?

2^16-1

# 3. 8086以前的兼容问题

因为8086上一代CPU中的寄存器都是8位的。(最大数据为2^8-1)

为了保证其兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用

AX可以分为AH和AL;

BX可以分为BH和BL;

CX可以分为CH和CL;

DX可以分为DH和DL。

举例:

image-20230815223934110

可以单独使用AX,也可以AH和AL单独使用,例如

image-20230815224048637

# 4. 字在寄存器中的存储

image-20230815224228158

由于一个内存单元可以存放8位数据,CPU中的寄存器又可存放n个8位数据。也就是说,计算机中的数据大多是由1~N个8位数据构成的。

为什么计算机中长使用16进制?

  • 用十六进制来表示数据可以直观的看出这个数据是由哪些8位数据构成的。

# 5. 初入汇编语言

image-20230815224845116

mov 将数据传入到某个寄存器中

add 将数据加到某个寄存器中

汇编指令不区分大小写

看下面的

  • 题1

image-20230815225406863

最后 8226H+8226H=1044CH

因为寄存器中只能存16bit,所以结果需要舍弃最高位1,即最终结果为044CH

  • 题2

image-20230815225551226

结果 0058H

# 6. 进制丢失问题

上面的计算我们可以看出,计算的结果长度大于的通用寄存器的长度,高位丢失了。这里的丢失,指的是进位制不能在8位寄存器中保存,但是CPU不是并真的不丢弃这个进位值,这个问题会在后面的课程中讨论。

# 7. 物理地址

Cpu访问内存单元时需要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间

每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址叫做物理地址。

# 16位结构的CPU特点

1、运算器一次最多可以处理16位的数据。 2、寄存器的最大宽度为16位。 3、寄存器和运算器之间的通路是16位的。

什么是运算器?

但是有的不一定

8086有20位地址总线,可传送20位地址,寻址能力为1M。 8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。

  • 为什么内部的寻址能力为16位,而外部为20位呢?

image-20230816085213868

image-20230816085438801

image-20230816085504210

image-20230816085550486

image-20230816085706397

image-20230816090050818

image-20230816090217496

image-20230816090234939

基地址=段地址*16

image-20230816090308041

image-20230816090332672

为什么偏移地址为16位?cpu内部规定,从上上面的图可以看出,2个16位表示20位

image-20230816090557854

一个物理地址可以以很多段地址+偏移地址的方式很多

image-20230816090630232

image-20230816090805703

image-20230816090914954

image-20230816091002889

# 段寄存器

image-20230821000612775

image-20230821000711575

image-20230821000734056

image-20230821001026889

image-20230821001041430

image-20230821001139258

image-20230821001154755

物理地址=cs*16+ip

image-20230821001414457

image-20230821001618297

image-20230821001649014

image-20230821001657207

image-20230821001752277

cs:2AE3 ip:3

image-20230821001821813

image-20230821001910418

image-20230821002051530

image-20230821002153109

image-20230821002201688

image-20230821002240668

image-20230821002303910

image-20230821002315437

# 编译环境搭建

image-20230821002409832

编辑 (opens new window)
上次更新: 2024/02/22, 14:03:19
systemctl
汇编语言实操

← systemctl 汇编语言实操→

最近更新
01
spark基础
02-22
02
mysql读写分离和分库分表
02-22
03
数据库迁移
02-22
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式