內存
內存的基本單元是一個字節(jié)。一臺有32兆內存的電腦大概能容納3200萬字節(jié)的信息。在內存里的每一個字節(jié)通過一個唯一的數字來標識作為它的地址,如圖1.4展示的一樣。
通常內存都是大塊大塊地使用而不是單個字節(jié)。在PC機結構中,命名了這些內存大塊,如圖1.2展示的一樣。
32/64位系統(tǒng)中1個字等于4/8個字節(jié)
在內存里的數據都是數字的。字符通過用數字來表示字符的字符編碼來儲存。其中一個最普遍的字符編碼稱為ASCII的編碼是Unicode。在這兩種編碼中最主要的區(qū)別是ASCII使用一個字節(jié)來編碼一個字符,但是Unicode每個字符使用兩個字節(jié)(或一個字)。例如ASCII使用

來表示字符大寫A;Unicode使用

來表示。因為ASCII使用一個字節(jié),所以它僅能表示256種不同的字符。Unicode將ASCII的值擴展成一個字,允許表示更多的字符。這對于表示全世界所有的語言非常重要。
CPU
中央處理器(CPU)是執(zhí)行指令的物理設備。CPU執(zhí)行的指令通常非常簡單。指令可能要求他們使用的數據存儲在一個CPU稱為寄存器的特殊儲存位置中。CPU可以比訪問內存更快地訪問寄存器里的數據。然而,在CPU里的寄存器是有限的,所以程序員必須注意只保存現(xiàn)在使用的數據到寄存器中。
各類CPU執(zhí)行的指令組成了該CPU的機器語言。機器語言擁有比高級語言更基本的結構。機器語言指令被編碼成未加工的數字,而不是友好的文本格式。為了更有效的運行,CPU必須能很快地解釋一個指令的目的.機器語言就是為了這個目的設計的,而不是讓人們更容易理解而設計。一個其他語言寫的程序必須轉換成CPU的本地機器語言,才能在電腦上運行。
編譯器是一個將用用程序語言寫的程序翻譯成特殊結構的電腦的機器語言的程序。通常,每一種類型的CPU都有它自己唯一的機器語言。這是為什么為Mac寫的程序不能在IBM類型PC機運行的一個原因。
電腦通過使用時鐘來同步指令的執(zhí)行。時鐘脈沖在一個固定的頻率(稱為時鐘頻率)。當你買了一臺1.5GHz的電腦,1.5GHz就是時鐘頻率。時鐘并不記錄分和秒。它以不變的速率簡單跳動。電子計算機通過使用這個跳動來正確執(zhí)行它們的操作,就像節(jié)拍器的跳動如何來幫助你以正確的節(jié)奏播放音樂。一個指令需要跳動的次數(或就像他們經常說的執(zhí)行周期)依賴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,F(xiàn)LAGS。它們僅僅支持1M字節(jié)的內存,而且只能工作在實模式下。在這種模式下,一個程序可以訪問任何內存地址,甚至其它程序的內存!這會使排除故障和保證安全變得非常困難!而且,程序的內存需要分成段。每段不能大
于64K。
80286: 這種CPU使用在AT系列的PC機中。它在8088/86的基本機器語言中加入了一些新的指令。然而,它主要的新的特征是16位保護模式。在這種模式下,它可以訪問16M字節(jié)的內存和通過阻止訪問其它程序的內存來保護程序??墒?,程序依然是分成不能大于64K的段。
80386: 這種CPU極大地增強了80286的性能。首先,它擴展了許多寄存器來容納32位數據(EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP,EIP)而且增加了兩個新的16位寄存器(FS,GS)。它同樣增加了一個新的32位保護模式。在這種模式下,它可以訪問4G字節(jié)。程序同樣分成段,但是現(xiàn)在每段大小同樣可以到4G。
80486/Pentium/Pentium Pro: 這些80x86家族的成員增加了不多的新的特征。它們主要是提高了指令執(zhí)行的速度。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都當做獨立的一個字節(jié)的寄存器來用;但是,清楚它們不能獨立于AX是非常重要的。改變AX的值將會改變AH和AL的值反之亦然。通用寄存器多數使用在數據移動和算術指令中。
這有兩個16位指針寄存器:SI 和DI 。通常它們都是當作指針來使用,但是在許多情況下也可以像通用寄存器一樣使用。但是,它們不可以分解成8位寄存器。
16位BP和SP 寄存器用來指向機器語言堆棧里的數據,被各自稱為基址寄存器和堆棧指針寄存器。這些將在以后討論。
16位CS,DS,SS 和ES 寄存器是段寄存器。它們指出程序不同部分所使用的內存。CS代表代碼段,DS 代表數據段,SS 代表堆棧段和ES代表附加段。ES當作一個暫時段寄存器來使用。這些寄存器的細節(jié)描述在后面的文章中。
指令指針寄存器(IP) 與CS寄存器一起使用來跟蹤CPU下一條執(zhí)行指令的地址。通常,當一條指令執(zhí)行時,IP提前指向內存里的下一條指令。
FLAGS寄存器儲存了前面指令執(zhí)行結果的重要信息。這些結果在寄存器里以單個的位儲存。例如:如果前面指令執(zhí)行結果是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家族,這個
術語現(xiàn)在有一點混亂了。在表1.2里,可以看到字被定義成兩個字節(jié)。它是當8086第一次發(fā)行時被定義成這樣的。當80386開發(fā)出來后,它被決定依舊保持這個字定義不改變,即使寄存器的大小已經改變了。
更多建議: