汇编语言8086(王爽)读书笔记

汇编语言的组成

汇编语言由以下3类指令组成:

1、汇编指令:机器码的助记符,有对应的机器码。

2、伪指令:没有对应的机器码,由汇编器执行,计算机并不执行。

3、其他符号:如=、-、*、/等,由编译器识别,没有对应的机器码。

 

存储单元

我们电子计算机的最小信息单位是bit,也就是二进制的一个位。8bit组成一个Byte,也就是通常所说的字节。微型机存储器的存储单元可以存储一个Byte,即8bit。一个存储器有128个存储单元,可以存储128个Byte。

 

总线

CPU与外部进行数据交换,必须与外部器件进行下面三类信息的交互。1、存储单元的地址(地址信息);2、器件的选择,读或写的命令(控制信息);3、读或写的数据(数据信息)。

以上三类分别对应着地址总线、控制总线、数据总线。

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

数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量。

控制总线的宽度决定了CPU对系统中其他器件的控制能力。

 

存储器

从读写的属性上来分,主要分为随机存储器(RAM)和只读存储器(ROM)。随机存储器可读可写,但是必须带点存储,关机后存储的内容丢失;只读存储器只能读取不能写入,关机后其中的内容不丢失。

 

通用寄存器

一个CPU由运算器、控制器、寄存器等器件构成,这些器件之间靠内部总线相连。其中运算器进行信息处理;寄存器进行信息存储;控制器控制各种器件进行工作;内部总线连接各种器件,在它们之间进行数据的传送。

8086CPU有14个寄存器,分别是:AX\BX\CX\DX\SI\DI\SP\BP\IP\CS\DS\SS\ES\PSW。

其中,AX\BX\CX\DX属于通用寄存器。而且这四个寄存器可以分成两个独立的8位寄存器来使用。

 

汇编语言8086(王爽)读书笔记_第1张图片

 

8086CPU给出物理地址的方法

8086CPU有20位地址总线,而CPU却是16位的结构,在内部只能一次性处理、传输、暂时存储的地址为16位。在CPU的内部采用两个16位地址合成的方法形成一个20位的物理地址。如下图所示:

 

汇编语言8086(王爽)读书笔记_第2张图片

 

 

如上图所示,8086CPU要读写内存时:

1、CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;

2、段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;

3、地址加法器将两个16位地址合成为一个20位的物理地址;

4、地址加法器通过内部总线将20位物理地址送入输入输出控制电路;

5、输入输出控制电路将20位物理地址送上地址总线;

6、20位物理地址被地址总线传送到存储器。

 

地址加法器采用物理地址=段地址*16+偏移地址的方法用段地址和偏移地址合成物理地址。

关于段地址*16的思考

对于我们的十进制的来说,如果增大10倍,就是将所有位左移一位;那么对于二进制,增大两倍,也就是将我们的所有为左移一位;同样的,对于十六进制,如果增大16倍,也就是将我们的十六进制数左移一位了(注意,因为16进制的一位是用二进制的4位表示的,所以在0101的机器码中,我们是左移4位的01);那么可以推理出,对于N进制数,如果增大N倍,也就是将这个N进制的数左移一位了。

“物理地址=段地址*16+偏移地址”的本质含义:CPU在访问内存时,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。

 

段寄存器

8086CPU有4个段寄存器:CS\DS\SS\ES

CS和IP是指示CPU当前要读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器CS存放指令的段地址,IP存放指令的偏移地址。在8086CPU中,任意时刻,CPU将CS:IP指向的内容当做指令执行。

8086CPU的工作过程可以简要描述如下:

1、从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;

2、IP=IP+所读取指令的长度,从而指向下一条指令;

3、执行指令。转到步骤1,重复这个过程。

 

CPU将CS:IP指向的内存单元中的内容看作指令,因为,任何时候,CPU将CS、IP中的内容当做指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。

 

修改CS、IP的指令

能够改变CS、IP的内容的指令被统称为转移指令:jmp指令。

“jmp 段地址:偏移地址”指令的功能:用指令中给出的段地址修改CS,用指令中的偏移地址修改IP。如下:

 

 

 

 

 

“jmp 某一合法寄存器”,仅修改IP的内容。如下:

 

 

 

汇编语言8086(王爽)读书笔记_第3张图片

 

 

 

 

注意上图中的第三个ax应该是bx。

jmp ax,在含义上类似于mov IP,ax这样的指令。

 

内存中字的储存

字单元,即存放一个字符数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。

我们将起始地址为N的字单元简称为N地址字单元。任意两个连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可看成一个地址为N的字单元中的高位字节单元和低位字节单元。

 

DS和[address]

CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址,在8086CPU中,内存地址由段地址和偏移地址组成。8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。一般用法如下:

 

 

 

 

汇编语言8086(王爽)读书笔记_第4张图片

 

 

 

 

 

为什么不直接把1000H直接放在段寄存器?因为8086CPU不支持!

“[...]”表示一个内存单元,“[...]”中的0表示内存的偏移地址。如果在mov指令中出现[],则说明[]的操作对象是一个内存单元,[]中的0说明这个内存单元的偏移地址是0,它的段地址默认放在ds中,指令执行时,8086CPU会自动从ds中取出。

 

mov、add、sub指令的形式

 

 

 

 

 

汇编语言8086(王爽)读书笔记_第5张图片

 

 

 

 

 

汇编语言8086(王爽)读书笔记_第6张图片

 

 

 

 

 

 

栈是一种后进先出的的存放数据的结构。

栈的最基本的操作用两种:入栈(push)和出栈(pop)。8086CPU的入栈和出栈操作都是以字为单位进行的。

CPU是如何知道栈顶的位置的?8086CPU中,有两个寄存器来存放栈顶的地址,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中任意时刻,SS:SP指向栈顶元素。push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。

push ax的执行

1、SP = SP - 2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;

2、将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。

 

 

 

 

 

 

汇编语言8086(王爽)读书笔记_第7张图片

 

 

 

 

 

 

 

pop ax的执行

1、将SS:SP指向的内存单元处的数据送入ax中;

2、SP = SP + 2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

 

 

 

 

 

 

 

汇编语言8086(王爽)读书笔记_第8张图片

 

 

 

 

 

 

 

汇编语言8086(王爽)读书笔记_第9张图片

 

你可能感兴趣的:(杂)