《汇编语言》 笔记

第一章 基础知识

计算机中有专门链接CPU和其余芯片的导线,一般称为总线。从逻辑上分为:地址总线、控制总线、数据总线。html

CPU和内存通信的过程:shell

  • CPU经过地址线将地址信息发出;
  • CPU经过控制线发出内存读、写命令;
  • 内存经过数据线将对应数据送入CPU或将数据存储在对应位置。

地址总线的宽度决定CPU的寻址能力。编程

数据总线的宽度决定单次的数据传送量。markdown

控制总线的宽度决定CPU对其余器件的控制能力。架构

存储器芯片分为随机存储器(RAM)和只读存储器(ROM)。CPU在操控它们的时候,把它们总的看做一个由若干存储单元组成的逻辑存储器,这就是咱们所说的内存地址空间。app

第二章 寄存器

一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。ide

  • 运算器进行信息处理;
  • 寄存器进行信息存储;
  • 控制器控制各类器件工做;
  • 内部总线链接各类器件,传送数据。

寄存器是CPU中能够用指令读写的部件,咱们经过改变寄存器中的内容来实现对CPU的控制。svg

8086CPU

8086CPU是16位结构的CPU,结构特性有:spa

  • 运算器一次最多能够处理16位数据;
  • 寄存器最大宽度位16位;
  • 寄存器和运算器以前的通路为16位。

也就是说,在8086内部,可以一次性处理、传输、暂时存储的信息最大长度为16位。操作系统

8086CPU是16位架构,可是地址总线有20位,给出物理地址的方法:

  • CPU内的相关部件提供两个16位地址,段地址和偏移地址;
  • 段地址和偏移地址经过内部总线进入地址加法器,被合成为一个20位的物理地址;
  • 地址加法器经过内部总线将20位物理地址送入输入输出控制电路,而后送上地址总线,到达存储器。

物理地址=段地址 × 16 + \times16+ 偏移地址。

8086机内存地址空间分配基本状况:00000-9FFFF是主存储器地址空间;A0000-BFFFF是显存地址空间;C0000-FFFFF是各种ROM地址空间。

段寄存器

段寄存器是CPU中提供段地址的部件,8086CPU有4个段寄存器:CS、DS、SS、ES,且不容许将数据直接送入段寄存器,必须用其余寄存器进行中转。

代码段寄存器

CS为代码段寄存器,IP为指令指针寄存器。在任意时刻,设CS中内容为M,IP中内容为N,8086CPU将从内存 M × 16 + N M\times16+N 单元(或者称为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的内存( B < C B<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.asm 编译( m a s m \xrightarrow{编译(masm)} tst.obj 链接( l i n k \xrightarrow{链接(link)} tst.exe c o m m a n d 加载入内存 \xrightarrow{command加载入内存} CPU运行。

操做系统的外壳

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。

相关文章
相关标签/搜索