现在的位置: 首页 > 综合 > 正文

第二章

2014年03月08日 ⁄ 综合 ⁄ 共 2743字 ⁄ 字号 评论关闭

第二章 寄存器

       寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制。不同的CPU,寄存器的个数、结构是不相同的。8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

2.1  通用寄存器

      8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。以AX为例,寄存器的逻辑结构如图2.1所示。

 

 

想一想,一个16位寄存器所能存储的数据的最大值为多少?(以下兰字是我以为对的答案)

      存储的数据的最大值不能理解成存储的最大数据,如果是存储的最大数据自然是FFFFH,即1111111111111111B,即65535D,而存储的数据的最大值个人认为应理解成能储存多少个(不同)数据,即0D-65535D,也就是65536个,(这里旁带说个题外话,在说寄存器时,如说到7位时,很多人把7位和第7位[实际是6位]混淆。因为有个0位(第1位),那么1位实指第2位,依此类推。这是题外话,就不多说了。) 这里我再纠正一点,(我不知这个答案是出自那里)应该是64K,不能有B,这里如果说B是Byte,16位的寄存器就能存储2个字节啊,就2B了啊。这里如果说B是bit,就更容易解决了啊,16位寄存器就16bit啊,即16B啊,16位寄存器放65536bit或65536Byte,那是存心找CPU的碴,存不了的啊。(我不相信谁能把超过2Byte或者16bit的信息能完整放进16位寄存器里去)。


      现在我们再来看题,答案应该很明确了,就是65536,即64K。再说一次, 没B。
                                                              

 8086CPU的AX、BX、CX、DX这4个寄存器都可分为两个可独立使用的8位寄存器来用:

     AX可分为AH和AL;

     BX可分为BH和BL;

     CX可分为CH和CL;

     DX可分为DH和DL。

以AX为例,8086CPU的16位寄存器分为两个8位寄存器。AX的低8位(0位~7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄存器。AH和AL寄存器是可以独立使用的8位寄存器。

如图2.3所示。

 

2.2  字在寄存器中的存储

1)字节、字

8086CPU可以一次性处理以下两种尺寸的数据。

字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中。

字   :记为word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。

      AH和AL中的数据,既可以看成是一个字型数据的高8位和低8位;又可以看成是两个独立(无关联)的字节型数据。

2)用十六进制来表示数据 

      由于一个内存单元可存放8位数据,CPU中的寄存器又可存放n个8位的数据。用十六进制来表示数据可以直观地看出这个数据是由哪些8位数据构成的。比如20000写成4E20就可以直观地看出,这个数据是由4E和20两个8位数据构成的,如果AX中存放4E20,则AH里是4E,AL里是20。这种表示方法便于许多问题的直观分析。

      为了区分不同的进制,在十六进制表示的数据的后面加H,在二进制表示的数据后面加B,十进制表示的数据后面什么也不加。如:可用3种不同的进制表示图2.4中AX里的数据,十进制:20000,十六进制:4E20H,二进制:0100111000100000B。

 

2.3  进位的问题

1)mov ax ,8226H

     mov bx ,ax

    add  ax , bx

   ax=?

解:

      指令add ax,bx,在执行前ax和bx中的数据都为8226H,相加后所得的值为:1044CH,但是ax为16位寄存器,只能存放4位十六进制的数据,所以最高位的1不能在ax中保存,ax中的数据为:044CH。

2)mov ax , c5H

     add  al  ,93H

     ax =  ?

解: 指令add al,93H,在执行前,al中的数据为C5H,相加后所得的值为:158H,但是al为8位寄存器,只能存放两位十六进制的数据,所以最高位的1丢失,ax中的数据为:0058H。(这里的丢失,指的是进位值不能在8位寄存器中保存,但是CPU并不真的丢弃这个进位值,关于这个问题,我们将在后面的课程中讨论。)

      注意,此时al是作为一个独立的8位寄存器来使用的,和ah没有关系,CPU在执行这条指令时认为ah和al是两个不相关的寄存器。不要错误地认为,诸如add al,93H的指令产生的进位会存储在ah中,add al,93H进行的是8位运算。

      如果执行add ax,93H,低8位的进位会存储在ah中,CPU在执行这条指令时认为只有一个16位寄存器ax,进行的是16位运算。指令add ax,93H执行后,ax中的值为:0158H。此时,使用的寄存器是16位寄存器ax,add ax,93H相当于将ax中的16位数据00c5H和另一个16位数据0093H相加,结果是16位的0158H。

2.4  操作数匹配

在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如:

mov ax,bx

mov bx,cx

mov ax,18H

mov al,18H

add ax,bx

add ax,20000

等都是正确的指令,而:

mov ax,bl          (在8位寄存器和16位寄存器之间传送数据)

mov bh,ax          (在16位寄存器和8位寄存器之间传送数据)

mov al,20000   (8位寄存器最大可存放值为255的数据)

add al,100H    (将一个高于8位的数据加到一个8位寄存器中)

等都是错误的指令,错误的原因都是指令的两个操作对象的位数不一致。

2.5 段的概念     

1)段的由来

       内存并没有分段,段的划分来自于CPU,8086CPU对外有20位地址总线,可以传送20位地址,达到1MB寻址能力。8086CPU内部是16位结构,它只能送出16位的地址,表现出的寻址能力只有64KB。用16位的地址码无法寻址1MB的存储空间,8086cpu采用了分段的方法对存储器进行管理。

2)如何分段

      8086规定,从0地址开始,把1M的存储器空间分成若干段,每16个字节为一小段,每段的容量最大64KB。每个段的起始地址

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ldw466/archive/2010/01/01/5117521.aspx

抱歉!评论已关闭.