汇编语言
# 一.前言
汇编语言是任何一种计算机的一种低级语言
不同的机器中汇编语言的指令集不同
通过汇编语言转换成机器后才能执行
不同平台之间不能进行移植,因为不同的机器的指令集可能不同
# 二. 基本概念
# 1.1 机器语言
机器语言:010101组成的数据集合
例如:机器指令:01010000 表示的汇编语言为(PUSH AX)
对应到物理层会有一个电平脉冲,通过脉冲进行机器指令的01传输
# 机器语言有什么缺点
如果只有机器语言
- 计算 S=768+12288+1280 ,
- 表示机器码如下
- 但是如果我们在输入的过程中,输入错误了,那找到对应的01哪儿错了就非常困难
- 错误难以查找
- 01难以编程
# 汇编语言如何产生
因为上述的机器语言的缺点,由此产生了汇编语言
- 汇编语言的主体是汇编指令
- 汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令的一种更好记忆的书写格式
示例:
与人类语言更接近
汇编指令经过编译器可以成为机器指令
# 1.2 汇编语言的组成
- 汇编指令(机器码的助记符)
- 伪指令(由编译器执行)
- 其他符号(由编译器识别)
汇编语言的核心是汇编指令,他决定了汇编语言的特性。
# 1.3 指令与数据
怎么区分汇编中表示的是指令还是数值
一串机器码的实际含义取决于当前的机器码处在的语境当中(程序还是数据中)
# 1.4 存储器
cpu要执行,就必须给他提供指令和数据,而指令和数据就储存在我们存储器中
内存的作用仅次于CPU,磁盘与内存不同,需要首先将磁盘上的数据存放到内存
# 存储单元
存储器被花费为若干个存储单元,每个存储丹单元从0开始编号。
每一个存储单元可以存储一个字节即8bit
除了以1B为单位,还可以用以下为单位
CPU想要对存储器中的数据进行读写,必须和外部器件(芯片)进行交互。需要交互的信息如下
- 存储单元的地址(地址信息)
- 器件的选择,读或写命令(控制信息)
- 读或写的数据(数据信息)
那么CPU是如何告诉芯片这些信息的呢?
总线:计算机中专门有连接CPU和其他芯片的导线,通常称为总线。
物理上:一根根导线的集合
逻辑上:地址总线、数据总线、控制总线
示例:
- CPU通过地址总线告诉内存其要操作的是3号内存号
- CPU通过控制总线发出要读的信息
- CPU通过数据总线读取3号为的数据,并存放到pu的器件中
写的流程和读差不多。类比即可
例如cpu收到了对应的机器码,并执行相应的指令:
# 1.5 地址总线
- CPU是通过地址总线来指定存储单元的
- 地址总线上能够传输多少个不同的信息,CPU就可以对多少个存储单元进行寻址
如果地址总线有10根,则可以寻址范围为 2^10
寻址总线的数量也称为寻址总线的宽度
# 1.6 数据总线
CPU与内存或其他器件之间的数据传输时通过数据总线来进行的
数据总线的宽度决定了CPU和外界的数据的传送速度
举例
向内存中写入数据89D8H:
一次传输1字节
一次传输两字节
# 1.7 控制总线
- CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。
- 有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。
- 所以,控制总线的宽度决定了CPU对外部器件的控制能力。
总结
- 地址总线的宽度决定了CPU的寻址能力;
- 数据总线的宽度决定了CPU与其它器件进行数据传送时的一次数据传送量;
- 控制总线宽度决定了CPU对系统中其它器件的控制能力。
# 1.7 内存地址空间
# 什么是内存地址空间
一个cpu的地址总线宽度为10,那么可以寻址1024个内存单元,这1024个可寻址到的内存单元构成这个cpu的内存地址
# 什么是主板
主板
在每一台PC机中,都有一个主板,主板上有核心器件和一些主要器件。 这些器件通过总线(地址总线、数据总线、控制总线)相连。
# 什么是接口卡
接口卡:
计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制。CPU对外部设备不能直接控制,如显示器、音箱、打印机等。直接控制这些设备进行工作的是插在扩展插槽上的接口卡。
上述的那些存储器在物理上是独立的器件。但是它们在以下两点上相同:
- 都和CPU的总线相连。
- CPU对它们进行读或写的时候都通过控制线发出内存读写命令。
可以将所有的存储器看成逻辑上的内存空间
如下,将cpu可访问的内存地址空间抽象为下面的地址空间
最终运行程序的是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 微处理器的特点:
- 位数:8086 是一款 16 位处理器,这意味着它的寄存器、数据通路和内存地址都是 16 位宽度。这与其后续的 32 位和 64 位处理器不同。
- 寄存器:8086 有多个通用寄存器,包括 AX、BX、CX 和 DX。这些寄存器可以用于存储数据、执行运算和数据传输。
- 分段内存模型:8086 使用分段内存模型,将内存分成多个段,每个段的大小为 64KB。通过使用段寄存器和偏移地址,可以实现对大于 64KB 的内存空间的访问。
- 指令集:8086 微处理器的指令集是基于 x86 架构的早期版本,包括各种数据传输、算术运算、逻辑操作、控制流等指令。
- 工作模式:8086 可以在实模式和保护模式下工作。实模式类似于早期的计算机系统,而保护模式在后来的处理器版本中得到了更多的扩展,提供了更强大的内存保护和多任务能力。
- 时钟频率:初始的 8086 微处理器的时钟频率为 5MHz,但后来的版本提高了时钟频率。
- 扩展性:8086 微处理器有限的 16 位寻址能力和寄存器宽度在后来的处理器中受到了限制,因此在大多数现代计算机中,更高版本的 x86 处理器已成为主流。
尽管 8086 微处理器已经过时,但它在计算机历史上具有重要意义,因为它标志着 x86 架构的开始,并对后来的个人计算机硬件和软件发展产生了深远影响。
# 2. 什么是通用寄存器
8086所有寄存器都是可以存放2字节数据的。
AX、BX、CX、DX 用来存放一般性的数据
举例:
- 一个通用寄存器最大可以存放的数据为多少?
2^16-1
# 3. 8086以前的兼容问题
因为8086上一代CPU中的寄存器都是8位的。(最大数据为2^8-1)
为了保证其兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用
AX可以分为AH和AL;
BX可以分为BH和BL;
CX可以分为CH和CL;
DX可以分为DH和DL。
举例:
可以单独使用AX,也可以AH和AL单独使用,例如
# 4. 字在寄存器中的存储
由于一个内存单元可以存放8位数据,CPU中的寄存器又可存放n个8位数据。也就是说,计算机中的数据大多是由1~N个8位数据构成的。
为什么计算机中长使用16进制?
- 用十六进制来表示数据可以直观的看出这个数据是由哪些8位数据构成的。
# 5. 初入汇编语言
mov 将数据传入到某个寄存器中
add 将数据加到某个寄存器中
汇编指令不区分大小写
看下面的
- 题1
最后 8226H+8226H=1044CH
因为寄存器中只能存16bit,所以结果需要舍弃最高位1,即最终结果为044CH
- 题2
结果 0058H
# 6. 进制丢失问题
上面的计算我们可以看出,计算的结果长度大于的通用寄存器的长度,高位丢失了。这里的丢失,指的是进位制不能在8位寄存器中保存,但是CPU不是并真的不丢弃这个进位值,这个问题会在后面的课程中讨论。
# 7. 物理地址
Cpu访问内存单元时需要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间
每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址叫做物理地址。
# 16位结构的CPU特点
1、运算器一次最多可以处理16位的数据。 2、寄存器的最大宽度为16位。 3、寄存器和运算器之间的通路是16位的。
什么是运算器?
但是有的不一定
8086有20位地址总线,可传送20位地址,寻址能力为1M。 8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。
- 为什么内部的寻址能力为16位,而外部为20位呢?
基地址=段地址*16
为什么偏移地址为16位?cpu内部规定,从上上面的图可以看出,2个16位表示20位
一个物理地址可以以很多段地址+偏移地址的方式很多
# 段寄存器
物理地址=cs*16+ip
cs:2AE3 ip:3