Summary of chapter 2

##所有的学习都是建立在8086CPU的基础上的

  • About CPU

          CPU的组成

  1. CPU由运算器,控制器,寄存器,总线(包括内部总线和外部总线)等构成
  2. 内部总线:实现cpu内部各个器件之间的联系
  3. 外部总线:实现CPU和主板上其他器件的联系

 

          如何描述CPU

  1.  CPU通常是由字长来描述的:

    (1)16位(字长位宽相同,均为16位)

    (2)准32位CPU(字长32位,位宽16位)

    (3)超32位CPU(字长32位,位宽64位)

  2.  CPU字长是CPU在单位时间内能一次处理二进制位数

  3. 位宽,CPU通过外部数据总线内存之间一次能够传送的数据位


  • About 寄存器

         寄存器的组成

  1. 8086中有14个寄存器   

            (1)AX BX CX DX为通用寄存器,用来存放一般性的数据

            (2)SI DI BP SP为基址和变址寄存器

            (3)CS SS DS ES为段寄存器(CS寄存器:代码段段寄存器,用于存放代码段的「段地址」)

            (4)IP FR为指令指针和标志寄存器(FR就是书上的PSW,即状态寄存器,是CPU运算器的一部分)(IP寄存器:指令指针寄存器,用于存放CPU将要读取的 指令在代码段中的偏移地址)

              补充:状态寄存器用来存放两类信息:一类是体现当前指令执行结果的各种状态信息(条件码),如有无进位(CF位)、有无溢出(OV位)、结果正负(SF位)、结果是否为零(ZF位)、奇偶标志位(P位)等;另一类是存放控制信息(PSW:程序状态字寄存器),如允许中断(IF位)、跟踪标志(TF位)等。

          注:以下以CS和IP寄存器为例来演示~~    

          2.对于兼容性的考虑,8086CPU可以一次性处理两种不同尺寸的数据。一个字由两个字节组成,所以这个字的高位字节和地位字节就分别存储在存储器的高8位存储器和低8位存储器中。如果把存储器看成两个独立的8位存储器来使用的时候,两个存储器之间是相互独立的

          3.数据划分

             (1)字节        内存划分的基本单

             (2)字            两个字节

             (3)双字        四个字节

             (4)四字        八个字节


  • 汇编指令
  1. mov ax,18
  2. mov ah,18
  3. add ax,8
  4. mov ax,bx
  5. add ax,bx
  6. mov IP,ax(等价于jmp ax)
  7. jmp 3:01B6(等价于mov CS,3   mov IP,01B6)

        注:指令的两个操作对象的位数应当是一样的,不可以操作一个16位寄存器和8位寄存器,也不能把超出寄存器位数的数据存入寄存器


  • 8086CPU给出物理地址的方法

        背景:我们所学习的汇编都是建立在8086CPU的基础上的,8086是16位机(即在8086内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位的),但是8086CPU有20位的地址总线, 所以8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

  1.   CPU中由段地址和偏移地址来提供两个16位的地址
  2. 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
  3. 地址加法器将两个16位地址合成一个20位的物理地址
  4. 地址加法器通过内部总线将20位物理地址送上地址总线
  5. 20位物理地址被地址总线传送到存储器

         物理地址=段地址x16+偏移地址(0~FFFFH)


  • 修改CS、IP的指令

      以Page33的问题2.3为例:

      

       

      

      最后得出结论:

      

注意点

  • 设置CPU的初始状态,即CS和IP的初始状态
  • IP寄存器中的数据在读取指令之后就要立刻改变数据,在执行指令之后(如果指令涉及到IP中数据的变化),IP中的数据还要再改变一次

拓展将IA32拓展到64位(选自《深入理解计算机系统》)

我们正在经历一个想Intel指令集64位版本的过渡。最初由AMD提出并命名为x86-64,现在它被大多数的AMD64和Intel64处理器所支持。但是系统还是只运行这些操作系统的32位版本,但是较新的Linux和Windows版本都支持这种拓展。

IA32拓展到64位的原因:机器的字长定义了程序能够使用的虚拟地址范围,而32位字长也就是4GB的虚拟地址空间。对于需要处理大数据集的应用比如科学计算、数据库和数据挖掘来说,32位字长使程序员工作非常困难。他们必须使用out-of-core算法来编写代码。

       X86-64

  • 指针和长整数是64位
  • 通用目的寄存器从8个拓展到16个
  • 许多程序状态都保存在寄存器中,而不是栈上
  • 如果可能,条件操作用条件传送指令实现,会比传统分支代码更好的性能
  • 浮点操作用面向寄存器的指令集来实现,而不用IA32支持的基于栈的方法来实现

猜你喜欢

转载自www.cnblogs.com/Sun-Yiwen-blog/p/9745610.html