汇编前导篇

80x86家族CPU简介

Posted by persuez on May 3, 2018

这篇博文用来记录对硬件理解方面的一些困惑和一些80x86系列CPU的基础知识。


CPU时钟(clock, clock pulse, clock rate, cycle)

  • 时钟(clock): 计算机(CPU)用时钟来同步(synchronize)CPU执行的指令。(不明白继续往下看)

  • 时钟脉冲(clock pulse)和时钟频率/时钟频率速度(clock rate/speed):时钟脉冲有固定的频率,这个频率就叫做时钟频率。如买的2.60GHz的笔记本,2.60GHz就是时钟频率(win10可以通过我的电脑->属性查看)。CPU的时钟不像我们日常生活的时钟按分秒来走,它是按照这个固定的时钟频率(rate/speed)来走,类似节拍。

  • 时钟周期(cycle):时钟周期是时钟频率的倒数。可以将一个时钟周期理解为CPU的一个单位时间的节拍数,而在一个时钟周期内,CPU仅能完成一个最基本的动作。(时钟周期(节拍数)取决于CPU的代数和型号;指令的周期数取决于它之前的指令和其它因素【具体什么因素,目前作者未知。】)


80x86系列CPU寄存器及三种模式(实模式,16位保护模式,32位保护模式),以下仅介绍一些基本的寄存器

  • 8088,8086: 几个基本的16位寄存器:AX, BX, CX, DX, SI, DI, BP, SP, CS, DS, SS, ES, IP, FLAGS。8088和8086仅支持1MB(220)内存寻址(20位外部地址总线)以及实模式(real mode)。在这个模式下,一个程序可以访问任何它想要访问的内存,甚至是其它程序的内存。8088和8086中程序段(程序要分段加载进内存)不能超过64K(216)。

  • 80286: 相比于8088和8086,80286增加了一些新指令。重要的一点是80286增加了一种新模式:16位保护模式(16-bit protected mode)。在这个模式下,程序可以访问的内存达到16MB(地址总线24位),并可以保护程序不会访问彼此的内存。但是,80286的程序段依旧不能超过64K(216)。这是因为16位保护模式下偏移量(offset)依旧是16位的。

  • 80386(i386): 将PC机从16位时代带入了32位时代。在80286的基础上增加了很多寄存器,并引进了32位保护模式(32-bit protected mode)。在这个模式下,程序可以访问的内存达到4GB(地址总线32位),并可以保护程序不会访问彼此的内存。80286的程序段可以达到4GB(232)。


三种模式介绍

实模式(real mode)

按上述所说,实模式下程序可以访问的内存只有1MB(220字节),有效地址范围(16进制)为00000-FFFFF。明显,要表示这些地址我们需要20位二进制数,而我们的8086/8088寄存器最多16位。为解决这个问题,英特尔公司用两个16位二进制数来决定所要访问地址。第一个16位二进制数称为selector,存放在段寄存器(segment register)中;第二个16位二进制数称为offset。而20位的物理地址由32位的selector:offset对通过以下公式计算:

16 * selector + offset

如,由047C:0048给出的物理地址计算如下(一个16进制数乘以16只要在其最右位添加一个0即可。这样selector就是16的倍数,这类数被称为paragraph number): 这种模式除了不能内存保护之外,还有以下缺点:

  1. 因为offset是16位的限制,每次加载的代码段和数据(data)不能超过64KB。

  2. 内存中的一个字节没有唯一对应的selector。如物理地址04808有以下表示:047C:0048, 047D:0038, 047E:0028和047B:0058。这会使得selector的比较变得复杂。

16位保护模式(16-bit protected mode)

实模式下的selector值是一个paragraph number,而保护模式(包括32位)下,selector是一个被称为全局描述符表(Global Descriptor Table,GDT)的索引值。保护模式下的代码分段不再像实模式一样必须要把代码段(segments)放在内存中,保护模式使用了一种被称为虚拟内存(virtual memory)的新技术。虚拟内存的基本想法是只将当前用到的代码和数据留在内存中,其它的数据和代码段被临时放在磁盘中。每个代码段会在GDT中分配一个入口(入口的索引值就是selector),其中记录着系统要知道代码的所有信息:是否在内存中;如果已经在内存中,在哪;访问权限(如只可读)。 缺点:offset依旧是16位。

32位保护模式(32-bit protected mode)

80386的32位保护模式和80286的16位保护模式有两个主要的不同点:

  1. offset扩展到了32位,这意味着段(segment)可以达到4GB。

  2. 段(segments)可以被分为小于4K的单元,这些单元被称为页(pages)。32位保护模式下虚拟内存处理的是页而不是段

参考书籍

PC Assembly Language, Paul A. Carter, November 11, 2003