codecamp

计算机内存和CPU的基础知识

内存

内存的基本单元是一个字节。一台有32兆内存的电脑大概能容纳3200万字节的信息。在内存里的每一个字节通过一个唯一的数字来标识作为它的地址,如图1.4展示的一样。



通常内存都是大块大块地使用而不是单个字节。在PC机结构中,命名了这些内存大块,如图1.2展示的一样。

 32/64位系统中1个字等于4/8个字节




在内存里的数据都是数字的。字符通过用数字来表示字符的字符编码来储存。其中一个最普遍的字符编码称为ASCII的编码是Unicode。在这两种编码中最主要的区别是ASCII使用一个字节来编码一个字符,但是Unicode每个字符使用两个字节(或一个字)。例如ASCII使用来表示字符大写A;Unicode使用来表示。因为ASCII使用一个字节,所以它仅能表示256种不同的字符。Unicode将ASCII的值扩展成一个字,允许表示更多的字符。这对于表示全世界所有的语言非常重要。

CPU

中央处理器(CPU)是执行指令的物理设备。CPU执行的指令通常非常简单。指令可能要求他们使用的数据存储在一个CPU称为寄存器的特殊储存位置中。CPU可以比访问内存更快地访问寄存器里的数据。然而,在CPU里的寄存器是有限的,所以程序员必须注意只保存现在使用的数据到寄存器中。

各类CPU执行的指令组成了该CPU的机器语言。机器语言拥有比高级语言更基本的结构。机器语言指令被编码成未加工的数字,而不是友好的文本格式。为了更有效的运行,CPU必须能很快地解释一个指令的目的.机器语言就是为了这个目的设计的,而不是让人们更容易理解而设计。一个其他语言写的程序必须转换成CPU的本地机器语言,才能在电脑上运行。

编译器是一个将用用程序语言写的程序翻译成特殊结构的电脑的机器语言的程序。通常,每一种类型的CPU都有它自己唯一的机器语言。这是为什么为Mac写的程序不能在IBM类型PC机运行的一个原因。

电脑通过使用时钟来同步指令的执行。时钟脉冲在一个固定的频率(称为时钟频率)。当你买了一台1.5GHz的电脑,1.5GHz就是时钟频率。时钟并不记录分和秒。它以不变的速率简单跳动。电子计算机通过使用这个跳动来正确执行它们的操作,就像节拍器的跳动如何来帮助你以正确的节奏播放音乐。一个指令需要跳动的次数(或就像他们经常说的执行周期)依赖CPU的产生和模仿。周期的次数取决于它之前的指令和其他因素。


CPU 80x86系列

IBM型号的PC机包含了一个来自Intel 80x86家族(或它的克隆)的CPU。在这个家族的所有CPU都有一些普遍的特征,包括有一种基本的机器语言。无论如何,最近的成员极大地加强了这个特征。

8088,8086: 这些CPU从编程的观点来看是完全相同的。它们是用在早期PC机上的CPU。它们提供一些16位的寄存器:AX,BX,CX,DX,SI,DI,BP,SP,CS,DS,SS,ES,IP,FLAGS。它们仅仅支持1M字节的内存,而且只能工作在实模式下。在这种模式下,一个程序可以访问任何内存地址,甚至其它程序的内存!这会使排除故障和保证安全变得非常困难!而且,程序的内存需要分成段。每段不能大
于64K。

80286: 这种CPU使用在AT系列的PC机中。它在8088/86的基本机器语言中加入了一些新的指令。然而,它主要的新的特征是16位保护模式。在这种模式下,它可以访问16M字节的内存和通过阻止访问其它程序的内存来保护程序。可是,程序依然是分成不能大于64K的段。

80386: 这种CPU极大地增强了80286的性能。首先,它扩展了许多寄存器来容纳32位数据(EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP,EIP)而且增加了两个新的16位寄存器(FS,GS)。它同样增加了一个新的32位保护模式。在这种模式下,它可以访问4G字节。程序同样分成段,但是现在每段大小同样可以到4G。

80486/Pentium/Pentium Pro: 这些80x86家族的成员增加了不多的新的特征。它们主要是提高了指令执行的速度。Pentium MMX: 这些处理器在Pentium基础上增加了MMX指令(多媒体扩展)。这些指令可以提高普通的图像操作的速率。

Pentium II: 它是拥有MMX 指令的Pentium处理器。(Pentium III 本质上就是一个更快的Pentium II。)

8086 16位寄存器

最初的8086CPU提供4个16位通用寄存器:AX,BX,CX 和DX。这些寄存器都可以分解成两个8位寄存器。例如:AX寄存器可以分解成AH和AL寄存器,像图1.5展示的一样。AH寄存器包含AX的上(或高)8位,而AL包含AX的低8位。通常AH和AL都当做独立的一个字节的寄存器来用;但是,清楚它们不能独立于AX是非常重要的。改变AX的值将会改变AH和AL的值反之亦然。通用寄存器多数使用在数据移动和算术指令中。

AX寄存器


这有两个16位指针寄存器:SI 和DI 。通常它们都是当作指针来使用,但是在许多情况下也可以像通用寄存器一样使用。但是,它们不可以分解成8位寄存器。

16位BP和SP 寄存器用来指向机器语言堆栈里的数据,被各自称为基址寄存器和堆栈指针寄存器。这些将在以后讨论。

16位CS,DS,SS 和ES 寄存器是段寄存器。它们指出程序不同部分所使用的内存。CS代表代码段,DS 代表数据段,SS 代表堆栈段和ES代表附加段。ES当作一个暂时段寄存器来使用。这些寄存器的细节描述在后面的文章中。

指令指针寄存器(IP) 与CS寄存器一起使用来跟踪CPU下一条执行指令的地址。通常,当一条指令执行时,IP提前指向内存里的下一条指令。

FLAGS寄存器储存了前面指令执行结果的重要信息。这些结果在寄存器里以单个的位储存。例如:如果前面指令执行结果是0,Z位为1,反之为0。并不是所有指令都修改FLAGS里的位,查看附录里的表看单个指令是如何影响FLAGS寄存器的。

80386 32位寄存器

80386及以后的处理器扩展了寄存器。例如:16位AX寄存器扩展成了32位。为了向后兼容,AX依然表示16位寄存器而EAX 用来表示扩展的32位寄存器。AX是EAX 的低16位就像AL是AX(EAX)的低8位一样。但是没有直接访问EAX 高16位的方法。其它的扩展寄存器是EBX,ECX,EDX,ESI 和EDI 。

许多其它类型的寄存器同样也扩展了。BP变成了EBP;SP 变成了ESP;FLAGS变成了EFLAGSEFLAGS 而IP变成了EIP。但是,不同于指针寄存器和通用寄存器,在32位保护模式下(下面将讨论的)只有这此寄存器的扩展形式被使用。

在80386里,段寄存器依然是16位的。这儿有两个新的段寄存器:FS和GS。它们名字并不代表什么。它们是附加段寄存器(像ES一样)。术语中字的一个定义为CPU数据寄存器的大小。对于80x86家族,这个
术语现在有一点混乱了。在表1.2里,可以看到字被定义成两个字节。它是当8086第一次发行时被定义成这样的。当80386开发出来后,它被决定依旧保持这个字定义不改变,即使寄存器的大小已经改变了。


Assembly 数制
计算机实模式和保护模式
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }