第一章 基础知识
计算机中有专门连接CPU和其他芯片的导线,通常称为总线。从逻辑上分为:地址总线、控制总线、数据总线。
CPU和内存通讯的过程:
- CPU通过地址线将地址信息发出;
- CPU通过控制线发出内存读、写命令;
- 内存通过数据线将对应数据送入CPU或将数据存储在对应位置。
地址总线的宽度决定CPU的寻址能力。
数据总线的宽度决定单次的数据传送量。
控制总线的宽度决定CPU对其他器件的控制能力。
存储器芯片分为随机存储器(RAM)和只读存储器(ROM)。CPU在操控它们的时候,把它们总的看作一个由若干存储单元组成的逻辑存储器,这就是我们所说的内存地址空间。
第二章 寄存器
一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。
- 运算器进行信息处理;
- 寄存器进行信息存储;
- 控制器控制各种器件工作;
- 内部总线连接各种器件,传送数据。
寄存器是CPU中可以用指令读写的部件,我们通过改变寄存器中的内容来实现对CPU的控制。
8086CPU
8086CPU是16位结构的CPU,结构特性有:
- 运算器一次最多可以处理16位数据;
- 寄存器最大宽度位16位;
- 寄存器和运算器之前的通路为16位。
也就是说,在8086内部,能够一次性处理、传输、暂时存储的信息最大长度为16位。
8086CPU是16位架构,但是地址总线有20位,给出物理地址的方法:
- CPU内的相关部件提供两个16位地址,段地址和偏移地址;
- 段地址和偏移地址通过内部总线进入地址加法器,被合成为一个20位的物理地址;
- 地址加法器通过内部总线将20位物理地址送入输入输出控制电路,然后送上地址总线,到达存储器。
物理地址=段地址偏移地址。
8086机内存地址空间分配基本情况:00000-9FFFF是主存储器地址空间;A0000-BFFFF是显存地址空间;C0000-FFFFF是各类ROM地址空间。
段寄存器
段寄存器是CPU中提供段地址的部件,8086CPU有4个段寄存器:CS、DS、SS、ES,且不允许将数据直接送入段寄存器,必须用其他寄存器进行中转。
代码段寄存器
CS为代码段寄存器,IP为指令指针寄存器。在任意时刻,设CS中内容为M,IP中内容为N,8086CPU将从内存单元(或者称为CS:IP指向的内容)开始读取并执行指令。因此8086CPU的工作过程可以描述如下:
- 从CS:IP指向的内存单元读取指令,并将指令送入指令缓冲器;
- IP=IP+指令长度,从而指向下一条指令;
- 执行指令,回到步骤1。
初始时,CS=FFFFH,IP=0000H,FFFF0H单元中的指令时8086PC机开机后执行的第一条指令。
jmp
指令用来修改CS、IP的内容。
同时修改CS、IP的内容:jmp 2AE3:3
执行后:CS=2AE3H,IP=0003H。
用某个寄存器中的值修改IP:jmp ax
。
Debug用法
r
:查看寄存器;r ax
可以改变ax的值。
d
:查看内存;d E1:4320
查看对应地址的内存,从该地址开始列出128个字节的内容;d A:B C
查看段A:B-A:C的内存()。
e A:B x y z...
:从A:B开始往后修改改写内存内容;也可以提问式修改e A:B
,回车后会从A:B开始八个一行地提问;内容可以用“”括起来直接用字符串修改内存的内容。
u A:B
:将从A:B开始的内存中的机器码转换为汇编指令;u A:B C
用法与d
指令类似。
t
:从CS:IP开始执行指令。
a A:B
:从A:B开始写入汇编指令。
第三章 寄存器的内存访问
内存中字的存储:CPU的寄存器是16位,由于内存单元都是字节单元(8位),因此用两个地址连续的内存单元来存放一个字,字的低位字节存放在低地址单元,高位字节存放在高地址单元。由此提出字单元的概念:存放一个字形数据(16位)的内存单元,由两个地址连续的内存单元组成。我们将起始地址为N的字单元简称为N地址字单元。
数据段寄存器
DS存放CPU要访问的数据的段地址。
mov bx,1000
mov ds,bx
mov al,[0]
复制代码
以上代码将内存1000:0中的读取到al中。将寄存器中的数据存储到内存中同理:mov [0],al
。
不可以直接将立即数存放到内存中。
al和bl做加法,仅看作8位加法,多出来的进位要舍弃。
栈
8086CPU提供相关的指令来以栈的方式访问内存空间,因此可以将一段内存当作栈来使用。出栈、入栈操作都以字为单位。
栈顶是低位地址,栈底是高位地址,字型数据入栈时遵循正常存入内存单元时的规则。
push ax
pop ax
复制代码
分别是将ax中的数据入栈和将栈顶元素弹出并存入ax中。
栈段寄存器
段寄存器SS和寄存器SP,SS:SP指向栈顶元素。push ax
的过程:
- SP=SP-2,指向新的栈顶;
- 将ax中的数据送入SS:SP指向的内存单元处。
入栈过程中,栈顶从高地址先低地址方向增长。
当栈空时,SP指向栈底下面的内存单元。
pop ax
的过程:
- 将SS:SP中的数据送入ax中;
- SP=SP+2,指向新的栈顶。
如果将10000H~1FFFFH当作栈段,初始状态下SP=0。
执行mov ss,...
时其后边的指令会立即执行,且必须是mov sp,...
,这么规定便于控制栈段大小,防止有子程序调用时出错。
第四章 汇编程序
可执行文件包含两部分:
- 程序(由汇编指令翻译得到的机器码)和数据(源代码中定义的数据);
- 相关描述信息(程序大小,占用内存等)。
汇编语言源程序中,包含两种指令,汇编指令和伪指令。
tst.asmtst.objtst.exeCPU运行。
操作系统的外壳
DOS中有一个程序command.com,称为命令解释器,也就是DOS系统的shell。如果用户想要执行一个程序,则输入该程序的名称,command首先找到该文件,然后将其加载入内存,设置CS:IP指向程序的入口,此后command停止运行,由CPU运行程序。
DOS系统中.exe文件的加载过程
- 找到一块容量足够的,起始地址的偏移地址为0的空闲内存区(起始地址为SA:0000);
- 在这段内存区的前256个字节中创建一个称为程序段前缀(PSP)的数据区,DOS通过PSP来和程序通讯;
- 接着装入程序,地址为SA+10H:0;(PSP区与程序区物理地址连续,但是段地址不同)
- 将该内存区的段地址存入ds中,将CS:IP指向程序的入口。
因此每次将程序载入内存后,ds都比cs小10H。