汇编 第二章 寄存器

在我看来,第二章中主要围绕着6个寄存器展开阐述。它们分别是AX、BX、CX、DX、CS、IP

在此之前,通过本章的学习,使我对CPU这一概念又有了更深一步的认识。

1.CPU中字长与位宽的区别

通常情况下,用字长来描述CPU。例如,字长16,则称16位CPU。那么16位CPU有什么具体的含义呢?

(1)表明运算器一次最多可以处理16位的数据;(2)寄存器的最大宽度是16位;(3)寄存器和运算器之间的通路是16位。

概括地来讲,就是通过字长这一指标可以反映出CPU内部运算处理的速度(这与本章中的物理地址与逻辑地址有着密切的关系,下文中会提到)。在这里老师在课堂上提到了位宽这一名词,须与字长区分开来。位宽是指CPU通过外部数据总线与内存之间一次能够传送的数据位。例如,8086——16位CPU(字长是16位,位宽也是16位),80386——32位CPU(字长32位,位宽16位),Pentium——32位CPU(字长32位,位宽64位)。

2.ISA(字节集编码)

ISA,一个处理器支持的指令和指令的字节级编码(与之后的CS,IP寄存器有关)。

*通过课前的quiz小练习我进一步了解到不同的CPU生产厂商在生产CPU时如果遵照相同的ISA,则认为这些CPU在ISA级别上是兼容的。而不同的CPU的差异也主要体现在处理的字长及速度、工作模式、指令集的丰富程度这三方面。我们平时最常见到的x86系列也称IA32指令集(Intel32位体系结构),包括实模式和保护模式。

再说到第二章的主题寄存器,在8086CPU中所有寄存器都是16位的,可以存放两个字节

1.通用寄存器(AX、BX、CX、DX)。在CPU内部运算时,它们通常被用来保存操作数和中间结果。为了保证兼容,使原来基于上代CPU编写的程序稍加修改就可以运行在8086之上,便有了高8位、低8位的寄存器的出现。

以寄存器AX为例,如图所示,分为AH(高8位)和AL(低8位)。此时需要注意AX与AH(AL)寄存器所能表示的整数范围是不一样的。AX寄存器是16位的。它所能表示的无符号整数的范围是0~(2^16)-1,而AL(AH)所能表示的无符号整数范围是0~(2^8)-1(其他三个通用寄存器亦是如此)。

之后又介绍了两条基本的汇编指令:mov、add(在本章学习中,mov与add 指令还只是在CPU内部进行相关操作)。在指令使用时需要注意:

(1)计算结果是否超出寄存位数,若超出要“丢失”进位值。同时,注意AL的进位值不能写入AX中,这也更好地体现了AH与AL是两个独立使用的寄存器。

(2)指令的两个操作对象应要保证位数一致。若出现mov al,2000、mov ax,bh等情况均是错误的。

2.CS与IP寄存器。CS——代码寄存器和IP——指令指针寄存器是8086CPU中两个最关键的寄存器,其重要性在于提供了CPU要执行指令的地址。这也随之带来了问题:8086的寄存器是16位的,而外部地址总线宽度为20位,16位的寄存器无法表示20位地址线宽度。

于是,设计者由此想出解决方法:采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。在8086CPU中的具体形式为:

物理地址=段地址*16+偏移地址  CS中的内容即为段地址,IP中的内容即为偏移地址,CS和IP的值合在一起,CS:IP恰好构成计算机中下一条将要执行的指令的逻辑地址

*通过课前的quiz小练习,我理解了物理地址与逻辑地址之间的区别与联系:

逻辑地址——用[段地址:偏移地址]的形式表示,其中[段地址*16]是这个逻辑段的起始物理地址,偏移地址可理解为内存单元相对于段起始物理地址的位移量。

物理地址——每一个内存单元在一个一维线性空间中的唯一地址,而这个一维线性空间是所有的内存单元构成的存储空间。

对于8086CPU给出的物理地址方法,仔细学习后还得出了以下一些结论:

1)CPU可以用不同的段地址和偏移地址形成同一个物理地址。

2)如果给定一个段地址,仅用偏移量来寻址最多可寻2^16B即64KB个内存单元。

3)内存并没有分段,只是8086CPU给出的物理地址方法使得我们可以用分段的形式来管理内存。正因如此,之后我们在编程时也可以根据需要,将若干地址连续的内存单元看作一个段,该段的起始地址为段地址*16。不过需要注意两点,一个段的起始地址一定为16的倍数,一个段的最大长度为64KB(因为偏移地址为16位,决定了其寻址能力)。

再回到CS和IP这两个寄存器上,CPU从何处执行指令是由CS、IP中的内容决定的。由此我们可以通过改变CS、IP中的内容来控制寄存器。那么,如何来控制呢?8086CPU通过转移指令修改CS、IP的内容。在本章中我学习了两种方法:

1)jmp段地址:偏移地址  ——段地址修改CS中的内容,偏移地址修改IP中的内容

2)jmp 某一合法寄存器 ——用寄存器中的值修改IP内容

最后是CPU是进行读取、执行指令的工作原理:

(1)从CS:IP指向的内存单元读取指令;

(2)IP=IP+所读取指令的长度,从而指向下一条指令;(如何知道所取指令的长度:CPU从内存中取出一系列字节并设置一个待分析的位置,从此位置逐字节分析得出该条指令的长度)

(3)执行该指令,转到步骤(1),重复该过程。

猜你喜欢

转载自www.cnblogs.com/zjybel/p/9769305.html