文章目录
基础知识
汇编语言是直接在硬件之上工作的编程语言,首先先要了解硬件系统的结构,才能有效的应用汇编语言对其编程。
机器语言【概念理解就好】
- 机器语言是机器指令的结合,机器指令展开来讲就是一台机器可以正确执行的命令。
- 如指令:
01000000
,汇编语言表示形式:PUSH AX
- 计算机能读懂的只有机器指令。
汇编语言的产生
- 汇编语言的主体是汇编指令。
- 汇编指令和机器指令的区别在于指令的表示方法上,汇编指令是机器指令便于记忆的书写格式。
- 即汇编指令是机器指令的助记符,同机器指令一一对应。
- 如操作:寄存器【寄存器简单的将是
CPU
中可以存储数据的器件,一个CPU
中有多个寄存器】BX的内容送到AX中,汇编指令:MOV AX,BX
汇编语言的组成
- 主要由三类组成:汇编指令【机器码的助记符】、伪指令【由编译器执行】、其他符号【由编译器执行】。
- 汇编语言的核心是汇编指令,它决定了汇编语言的特性。
- 每一种CPU都有自己的汇编指令集。
存储器
- CPU是计算机的核心部件,它控制整个计算机的运行并进行运算,要想让一个CPU工作,就必须向它提供指令【怎么做】和数据。
- 指令和数据在存储器中存放,也就是平时说的内存。
- 在一台PC机中内存的作用仅次于
CPU
。 - 离开了内存,性能再好的
CPU
也无法工作。 - 磁盘不同于内存,磁盘上的数据和程序如果不读到内存中,就无法被
CPU
使用。
指令和数据
- 在内存和磁盘上,指令和数据没有任何区别,都是二进制信息。
- 指令和数据是应用上的概念。
存储单元
- 存储器被划分为若干个存储单元【不一定是内存】,每个存储单元从0开始顺序编号。
- 对于大容量的存储器,一般还用到一下单位来计算容量【B表示byte】:
1KB = 1024B
【2的10次方】,1MB =1024KB
,1GB = 1024MB
,1TB = 1024GB
。 - 磁盘的容量单位同内存一样,实际上以上单位是微机中常用的计量单位。
- 存储单元从0开始顺序编号。
- 一个存储单元【一个字节】可以存储8个bit,即八位2进制数。【1Byte = 8bit】
CPU对存储器的读和写
- CPU想要进行数据的读和写,必须和外部器件【标准的来说是芯片】进行三类信息的交互:存储单元的地址【地址信息】、器件的选择,读或写命令【控制信息】、读或写的数据【数据信息】。
- CPU通过导线将地址、数据和控制信息传到存储芯片中。
- 在计算机中专门有连接CPU和其他芯片的导线,通常称为总线。
- 其中总线逻辑上分为地址总线、数据总线、控制总线。
- 每一个CPU芯片都有许多管脚,这些管脚和总线相连。也就是说,这些管脚引出总线。
地址总线
- CPU通过地址总线来指定存储单元的。
- 地址总线能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。
- 一个CPU有
N
根地址总线,则可以说这个CPU的地址总线的宽度为N
,这样的CPU最多可以寻找2的N次方
个内存单元。【1Byte = 8bit】 - 地址总线的宽度决定了CPU的寻址能力。
数据总线
- CPU与内存或其他器件之间的数据传送是通过数据总线来进行的。
- 数据总线的宽度决定了CPU和外界的数据传送速度。
控制总线
- CPU对外部器件的控制是通过控制总线来进行的,在这里控制总线是个总称,控制总线是一些不同控制线的集合。
- 有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。
- 控制总线的宽度决定了CPU对外部器件的控制能力。
主板
- 在每一台PC机中,都有一个主板,主板上有核心器件和一些主要器件。
- 这些器件通过总线相连。
接口卡
- 计算机系统中,所有可用程序控制其互相工作的设备,必须受到CPU的控制
- CPU对外部设备不能直接控制,如显示器、音箱、打印机等,直接控制这些设备进行工作的是插在扩展插槽上的接口卡。
各存储类芯片
- 从读写属性上来看,分为随机存储器【RAM】和只读存储器【ROM】。
- 从功能和连接上分类:随机存储器RAM、装有BIOS的ROM、接口卡上的RAM。
BIOS
:基本输入输出系统,是由主板和各类接口卡【如显卡、网卡等】厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出,在主板和某些接口卡上插有存储相应BIOS的ROM。
- 上述这些存储器在物理上是独立的器件,但是他们有以下两点相同:都和
CPU
的总线相连、CPU
对他们进行读或写的时候都通过控制线发出内存读写命令。
内存地址空间
- 概述:一个·CPU的地址线宽度为10,那么可以寻址1024个内存单元,这1024个可寻到的内存单元就构成这个CPU的内存地址空间。
- 不同的计算机系统的内存地址空间分配情况是不同的。
- 最终运行程序的是CPU,我们用汇编编程的时候,必须要从
CPU
的角度考虑问题。 - 对CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制,这个逻辑存储器即是我们所说的内存地址空间。
寄存器(CPU工作原理)
概述
- 一个典型的
CPU
是由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。 - 区别:内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板其他器件的联系。
8086CPU
有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
通用寄存器
8086CPU
所有的寄存器都是16
位的,可以存放两个字节。AX、BX、CX、DX
通常用来存放一般性数据,被称为通用寄存器。8086上一代CPU中的寄存器都是8
位的,为保证兼容性,这四个寄存器都可以分为两个独立的8
位寄存器使用。- 以
AX
为例的逻辑结构:
- 16位寄存器所能存储的数据最大值为216-1 。
- AX可以分为
AH
【高八位】和AL
【低八位】,BX、CX、DX同理。、 AH
和AL
寄存器是可以独立使用的8位寄存器。
字在寄存器中的存储
8086 CPU
所有的寄存器是16
位,可以存放2
个字节【一个字】。- 一字节由
8 bit
组成,可以存在8位寄存器中。 - 字【word】是两字节,16位。
- 为了区分不同的进制,在十六进制表示的数据后面添加
H
,二进制后面添加B
【Binary】。
几条汇编指令
汇编指令不分大小写!
进位的丢失指的是禁止为不能在8位寄存器中保存,但是CPU并不是真的丢弃这个进位值。
物理地址
- CPU访问内存单元时要给出内存单元的地址。
- 所有的内存单元构成的存储空间是一个一维的线性空间,我们将这个唯一的地址成为物理地址。
16位结构的CPU
- 运算器一次最多可以处理
16
位数据。 - 寄存器的最大宽度为
16
位。 - 寄存器和运算器之间的通路是
16
位。
8086 CPU给出物理地址的方法
- 8086有
20
根地址线,可传送20
位地址,寻址能力为1M
。 - 但8086内部为
16
位结构,只能传送16
位的地址,寻址能力为64K
。 - 所有8086CPU采用一种在内部用两个
16
位地址合成的方法来形成一个20
位的物理地址。
- 地址加法器工作原理:物理地址 = 段地址 * 16 + 偏移地址。
- 一个数据的二进制形式左移
N
位,相当于该数据乘以2的N次方
。一个数据X
进制形式左移N
位,相当乘以N的X次方
。
段地址*16+偏移地址=物理地址【本质】
-
基础地址 + 偏移地址 = 物理地址
-
段地址*16+偏移地址 = 物理地址
段的概念
- 错误认知:内存被划分为一个一个的段,每一个段有一个段地址。
- 正确认知:内存并没有分段,段的划分来自
CPU
,由于8086CPU用“ 段地址*16+偏移地址 = 物理地址 ”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
- 在编程中可以根据需要,将若干地址连续的内存单元看作一个段,用段地址*16定位段的起始地址【基础地址】,用偏移地址定位段中的内存单元。
- 一个段的起始地址是
16
的倍数。偏移地址为16
位,寻址能力为64K
,所以段的最大长度也是64K
。 - CPU访问内存单元时,必须向内存提供内存单元的物理地址。
8086CPU
在内部用段地址偏移地址移位相加的方法形成最终的物理地址。CPU
可以用不同的段地址和偏移地址形成同一个物理地址。8086PC
机中,存储单元的地址用两个元素来描述:段地址和偏移地址。- 数据在
21F60H
内存单元中,对于8086PC机的两种描述:数据存在内存2000:1F60
单元中【常见】;数据存在内存的2000
段中的1F60H
单元中。 - 可根据需要,将地址连续、起始地址为
16
的倍数的一组内存单元定义为一个段。
段寄存器
- 段寄存器就是提供段地址的。
8086CPU
有4个段寄存器:CS
【代码地址】、DS
【数据地址】、SS【堆栈地址】、ES
【前面不够放这个寄存器】。- 当
8086CPU
要访问内存时,由这4
个段寄存器提供内存单元的段地址。
CS和IP
CS
【代码段寄存器】和IP
【指令指针寄存器】是8086CPU
中最关键的寄存器,它们指示了CPU
当前要读取指令的位置。- 8086CPU工作过程的简要概述:
- 从
CS:IP
指向内存单元读取指令,读取的指令进入指令缓冲器; - IP=IP+所读取指令的长度,从而正确的指向下一条指令;
- 执行指令。转到步骤1,周而复始。
- 在任何时候,
CPU
将CS:IP
中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。 - 如果说内存中的一段信息曾被
CPU
执行过的话,那么它所在的内存单元必然被CS:IP
指向过。
修改CS、IP的指令
- 在
CPU
中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU
的控制。 CPU
从何处执行指令是由CS:IP
中的内容决定的,程序员可以通过改变CS:IP
中的内容来控制CPU
执行目标指令。mov
指令可以改变8086CPU
大部分寄存器的值,被称为传送指令。但mov
指令不能用于设置CS:IP
的值。jmp 段地址:偏移地址
,同时修改CS
和IP
,用指令中给出的段地址修改CS
,偏移地址修改IP。
jmp 2AE3:3 //即物理地址被修改为2AE33
jmp 3:0B16 //0003:0B16,即物理地址被修改为00B46
jmp 某一合法寄存器
,则是仅修改IP。如jmp ax
类似于mov IP,ax
。
mov ax,6622H
jmp 1000:3
mov ax,0000
mov bx,ax
jmp bx
mov ax,0123H
mov ax,0000
代码段
- 对于
8086PC
机,在编程时,可以根据需要,将一组内存单元定义为一个段。 - 可以将长度为N【
N <= 64KB
】的一组代码,存在一组地址连续,起始地址为16
的倍数内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。 - 如何使得代码段中的代码被执行呢? 将一段内存当作代码段,仅仅是我们在编程时的一种安排,
CPU
并不会由于这种安排,就自动地将我们定义的代码段中的指令当作指令来执行,需要使用CS:IP
来指定。 CPU
只认CS:IP
指向的内存单元中的内容为指令。