字組 (電腦)
在電腦領域,對於某種特定的計算機設計而言,字(英語:word)是用於表示其自然的數據單位的術語。在這個特定電腦中,字組是其用來一次性處理事務的一個固定長度的位元(bit)組。一個字組的位數(即字長)是電腦系統結構中的一個重要特性。
字組長度在計算機結構和操作的多個方面均有體現。電腦中大多數寄存器的大小是一個字長。電腦處理的典型數值也可能是以字長為單位。CPU和內存之間的數據傳送單位也通常是一個字長。還有在內存中用於指明一個存儲位置的地址也經常是以字長為單位的。
現代電腦的字長通常為16、32、64位元。其他曾經使用過的字長有:8、9、12、18、24、36、39、40、48、60位元;slab是早期的另一個字長實例。某些最早期的電腦是十進制的而不是二進制的,通常擁有10位或者12位的十進制數字作為字長,還有一些早期的電腦根本就沒有固定字長。
有時候字長被定義為某個特定值是為了與早期的電腦保持兼容。現在個人電腦中最通用的微處理器(例如:Intel的Pentium系列和AMD的Athlon系列)就是一個例子。它們中的IA-32構架是早期的具有16位字長的Intel 8086構架的擴展。而IA-32處理器仍然支持8086(x86)程序程式所以在IA-32中,「字段」的含義仍然為16位,儘管事實上它運行起來(特別是當默認操作數為32位時)更像一台32位電腦。類似地,在更新型的x86-64構架中,「字組」仍然是16位的,雖然64位操作數更為常見。
字的使用
編輯根據計算機的組織情況,字長單位可能被應用到:
- 整數–計算機處理的整數值通常可以有若干種不同的長度,但是其中總有一種正好是該構架的字長。如果有的話,其他的整數長度很可能是字長的倍數或分數。小尺寸的整數尺寸通常是為了提高存儲效率;當它被載入處理器時,它經常被轉換成字長尺寸的形式。
- 浮點數–計算機處理的浮點數通常是一個字長或字長的倍數。
- 地址–計算機處理的存儲器地址必須有足夠的尺寸,以便可以表示需要的數值範圍,但是又不能過大。經常使用的尺寸是字,不過也可以是字的倍數或分數。
- 寄存器– 處理器寄存器根據它要處理的數據類型被設計成適當的尺寸,例如:整數、浮點數、地址。許多計算機構架使用「通用」寄存器,它們可以存儲任何類型的數據,可以允許存儲哪怕是最大的數據類型。它們的尺寸通常是其構架的字長。
- 存儲器-處理器傳送–當處理器從存儲器子系統讀取數據至寄存器,或者,寫寄存器數據到存儲器,傳送的數據通常是字。在簡單的存儲系統中,字在數據總線上傳送,它一般為一個字或半個字。在使用緩存的存儲系統,在處理器和一級緩存之間傳送的是一個字長,而在更低級的存儲層次上傳送的可能是更大的尺寸(這尺寸是字的倍數)。
- 編址單位–在一個給定的構架中,連續的地址值對應連續的存儲器單位;該單位就是編址單位。在大部分計算機中,這個單位或者是一個字符(例如:字節)或者是一個字(少部分計算機也使用位(bit)編址單位)。如果單位是字,那麼用指定長度的地址就可以訪問較大數量的存儲空間。另一方面,如果單位是字節,那麼就可以訪問單個的字符(i.e. selected during the memory operation)。
- 指令– 機器指令通常是字長的分數或倍數。因為指令和數據經常共享同一個存儲子系統,所以自然作出這樣的選擇。而在哈佛架構(Harvard architecture)中,指令和數據的長度並不需要有關聯。
字長的選擇
編輯在設計計算機時,字長的選擇是非常重要的。設計上的考慮傾向於為特定的用途(如地址)設定特定的位長。然而,出於經濟的考慮,又應該僅使用一種尺寸,或者很少的幾種與基本尺寸成倍數或分數(約數)關係的尺寸。這個首選的基本尺寸就成為該構架的字長。
字符的尺寸對於字長的選擇也有影響。20世紀60年代中期以前,字符大部分以6位存儲;這樣最多允許64個字符,因此不能有大寫字母。由於將字長定義成字符尺寸的倍數在處理時間和存儲空間上都比較划算,所以這個時期字長也就被定義為6位(在二進制機器上)的倍數。通常的選擇是36位字長,這也是適合於浮點數格式的一個長度。
隨着IBM360系統的引入——該系統使用8位字符,並支持大小寫字母——標準的字符(確切地說:字節)尺寸也轉變成為8位。從那以後,字長也自然變成了8的倍數,16、32、64位字長被廣泛使用。
各種字長的架構
編輯早期的計算機設計中包括可變字長設計。在這類設計中,數字操作數沒有固定的長度,它們通過檢查某個特殊字符來判斷是否結束。這樣的機器使用BCD編碼表示數字,例如IBM 702、IBM 705、IBM 7080、IBM 7010、UNIVAC 1050、IBM 1401和IBM 1620。
大部分這樣的機器一次處理一個存儲單元,因為每條指令和數據占用的數個單元,所以指令將使用數個周期來讀取存儲器。這類機器經常因為這個原因變得非常慢。例如,在IBM 1620 Model I上,取指令需要8個周期,只是為了讀取12個數字(Model II降低到6個周期,不過如果指令不需要取其中的一個1個地址域的話,可以只需要4個周期;如果兩個都不需要,則只需要1個周期)
字和字節編址
編輯字長對計算機構架的存儲器模式有很大的影響。特別是:通常選擇字作為存儲器的編址方案,所謂存儲器編址方案就是地址碼能夠指定的最小存儲單位。In this approach,編號相鄰的記憶體字組,其位址編號相差一。在計算機中這樣很自然,因為它通常總是要處理以字為單位的數據(或者是以字的倍數)。並且具有讓指令可以使用最小的長度來指定一個地址的優點,這樣,就可以減少指令長度或者可以定義更多的指令條數。
當計算機很大的工作量是用來處理字節時,通常定義字節作為地址編址單位要比字更好。這樣做字符串中的單個字符可以通過地址直接指定。當然,一個字仍然可以被地址訪問,但是比起字編址方案,它的地址將使用更多的位數。在這種組織結構中,字長需要被定義為字符長度的整數倍。這種編址方案在IBM 360中被使用,此後即變成計算機設計中最普遍的方案。
2的冪
編輯數據常常要占用不同大小的存儲空間,例如,有些數值比其他的數值要求有更高的精度。通常使用的長度是編址單位(以字為單位編址或以字節為單位編址)的倍數,這個倍數常常是的2的冪。這樣做是比較便利的,因為這樣的話,將一個處理對象在數組中的索引值轉化為這個處理對象的地址只需要進行一個移位操作(這在硬件上只需要進行布線的變化)而不需要進行乘操作。某些時候這樣的做法還可以避免除操作。因此,一些現代計算機設計使用的字長(或者其他的操作數)是2的冪乘以字節尺寸。
字長家族
編輯隨着計算機設計日益複雜,一個單一字長的核心作用在計算機架構中已經不那麼重要。雖然硬件有能力支持更寬的數據類型,但是在擴展處理器性能時,市場卻有強大的壓力要求新產品保持向後兼容。因此,在一個新構架的向後兼容的設計中,核心的字長不得不與原始機型的字長共存。原始的字長在未來設計中保持可用,這就構成了字長家族的基礎。
這種情形的一個主要的實例是x86系列的設計。原始的8086構架無疑是使用16位字長的。80386在8086的基礎上進行了大幅改進,使其基於32位系統構架。如果不用考慮其他因素,它將是32位的,但是作為8086的擴展,它的字長繼續被當作16位的。(也因此,有人說80386和它的後繼處理器是"32位"的(32-bit),但不是32位字的(32-bit word),原文:As a result of this, one hears of the 80386 and successor processors as being "32-bit", but usually not as having a 32-bit word.——譯者)同樣的情形最近又發生了,當AMD64構架使64位在系統構架具有主要地位,但是它仍然沒有放棄對16位和32位的支持。
因此,今天我們看到的計算機體系結構更多的是基於一個有聯繫的、類似的字長家族,而不是一個單一的字長體系結構。這些尺寸以整因子(integral factors)——通常是2的冪——互相關聯。直接將它們中的任何一個尺寸定義為該系統的字長是武斷的,因為這些尺寸的設計可能是因為這一系列體系構架的發展的歷史原因,而不是體系自己的最新設計中的特性。
Dword和Qword
編輯在計算機科學中, dword(雙倍字)是一種數據單位,它是字的二倍或者說是qword的一半。在具有16位字長的x86平台上,dword數據單位具有32位長度。
qword(四倍字)是一種大小是字長的四倍的數據單位。在通用的x86平台上,該單位的數據具有64位,因為x86系統的字定義為16位(不論實際的機器上工作在那個基本位長上的)
另外,Intel使用術語double quadruple word,或者DQWord(雙四倍字)來指定128位數據,這在SSE和它的更原始版本中可以看到。
字長表
編輯年份 | 計算機 架構 |
字長 | 整數 長度 |
浮點數 長度 |
指令長度 | 編址單位 | 字符 長度 |
---|---|---|---|---|---|---|---|
1941 | Zuse Z3 | 22 b | – | w | 8 b | w | – |
1942 | ABC | 50 b | w | – | – | – | – |
1944 | Harvard Mark I | 23 d | w | – | 24 b | – | – |
1946 (1948) {1953} |
ENIAC (w/Panel #16) {w/} |
10 d | w, 2w (w) {w} |
– | – (2d, 4d, 6d, 8d) |
– – {w} |
– |
1951 | UNIVAC I | 12 d | w | – | ½w | w | 1 d |
1952 | IAS machine | 40 b | w | – | ½w | w | 5 b |
1952 | IBM 701 | 36 b | ½w, w | – | ½w | ½w, w | 6 b |
1952 | UNIVAC 60 | n d | 1d, ... 10d | – | – | – | 2d, 3d |
1953 | IBM 702 | n d | 0d, ... 511d | – | 5d | d | 1 d |
1953 | UNIVAC 120 | n d | 1d, ... 10d | – | – | – | 2d, 3d |
1954 (1955) |
IBM 650 (w/IBM 653) |
10 d | w | – (w) |
w | w | 2 d |
1954 | IBM 704 | 36 b | w | w | w | w | 6 b |
1954 | IBM 705 | n d | 0d, ... 255d | – | 5d | d | 1 d |
1954 | IBM NORC | 16 d | w | w, 2w | w | w | – |
1956 | IBM 305 | n d | 1d, ... 100d | – | 10d | d | 1 d |
1958 | UNIVAC II | 12 d | w | – | ½w | w | 1 d |
1958 | SAGE | 32 b | ½w | – | w | w | 6 b |
1958 | Autonetics Recomp II | 40 b | w, 79 b, 8d, 15d | 2w | ½w | ½w, w | 5 b |
1959 | IBM 1401 | n d | 1d, ... | – | d, 2d, 4d, 5d, 7d, 8d | d | 1 d |
1959 (TBD) |
IBM 1620 | n d | 2d, ... | – (4d, ... 102d) |
12d | d | 2 d |
1960 | LARC | 12 d | w, 2w | w, 2w | w | w | 2 d |
1960 | IBM 1410 | n d | 1d, ... | – | d, 2d, 6d, 7d, 11d, 12d | d | 1 d |
1960 | IBM 7070 | 10 d | w | w | w | w, d | 2 d |
1960 | PDP-1 | 18 b | w | – | w | w | 6 b |
1961 | IBM 7030 (Stretch) |
64 b | 1b, ... 64b, 1d, ... 16d |
w | ½w, w | b, ½w, w | 1 b, ... 8 b |
1961 | IBM 7080 | n d | 0d, ... 255d | – | 5d | d | 1 d |
1962 | UNIVAC III | 25 b, 6 d | w, 2w, 3w, 4w | – | w | w | 6 b |
1962 | UNIVAC 1107 | 36 b | 1/6w, ⅓w, ½w, w | w | w | w | 6 b |
1962 | IBM 7010 | n d | 1d, ... | – | d, 2d, 6d, 7d, 11d, 12d | d | 1 d |
1962 | IBM 7094 | 36 b | w | w, 2w | w | w | 6 b |
1963 | Gemini Guidance Computer | 39 b | 26 b | – | 13 b | 13 b, 26 b | – |
1963 (1966) |
Apollo Guidance Computer | 15 b | w | – | w, 2w | w | – |
1964 | CDC 6600 | 60 b | w | w | ¼w, ½w | w | 6 b |
1965 | IBM 360 | 32 b | ½w, w, 1d, ... 16d |
w, 2w | ½w, w, 1½w | 8 b | 8 b |
1965 | UNIVAC 1108 | 36 b | 1/6w, ¼w, ⅓w, ½w, w, 2w | w, 2w | w | w | 6 b, 9 b |
1965 | PDP-8 | 12 b | w | – | w | w | 8 b |
1970 | PDP-11 | 16 b | w | 2w, 4w | w, 2w, 3w | 8 b | 8 b |
1971 | Intel 4004 | 4 b | w, d | – | 2w, 4w | w | – |
1972 | Intel 8008 | 8 b | w, 2d | – | w, 2w, 3w | w | 8 b |
1972 | Calcomp 900 | 9 b | w | – | w, 2w | w | 8 b |
1974 | Intel 8080 | 8 b | w, 2w, 2d | – | w, 2w, 3w | w | 8 b |
1975 | Cray-1 | 64 b | 24 b, w | w | ¼w, ½w | w | 8 b |
1975 | Motorola 6800 | 8 b | w, 2d | – | w, 2w, 3w | w | 8 b |
1975 | MOS Tech. 6501 MOS Tech. 6502 |
8 b | w, 2d | – | w, 2w, 3w | w | 8 b |
1976 | Zilog Z80 | 8 b | w, 2w, 2d | – | w, 2w, 3w, 4w, 5w | w | 8 b |
1978 (1980) |
Intel 8086 (w/Intel 8087) |
16 b | ½w, w, 2d (w, 2w, 4w) |
– (2w, 4w, 5w, 17d) |
½w, w, ... 7w | 8 b | 8 b |
1978 | VAX-11/780 | 32 b | ¼w, ½w, w, 1d, ... 31d, 1b, ... 32b | w, 2w | ¼w, ... 14¼w | 8 b | 8 b |
1979 | Motorola 68000 | 32 b | ¼w, ½w, w, 2d | – | ½w, w, ... 7½w | 8 b | 8 b |
1982 (1983) |
Motorola 68020 (w/Motorola 68881) |
32 b | ¼w, ½w, w, 2d | – (w, 2w, 2½w) |
½w, w, ... 7½w | 8 b | 8 b |
1985 | ARM1 | 32 b | w | – | w | 8 b | 8 b |
1985 | MIPS | 32 b | ¼w, ½w, w | w, 2w | w | 8 b | 8 b |
1989 | Intel 80486 | 16 b | ½w, w, 2d w, 2w, 4w |
2w, 4w, 5w, 17d | ½w, w, ... 7w | 8 b | 8 b |
1989 | Motorola 68040 | 32 b | ¼w, ½w, w, 2d | w, 2w, 2½w | ½w, w, ... 7½w | 8 b | 8 b |
1991 | PowerPC | 32 b | ¼w, ½w, w | w, 2w | w | 8 b | 8 b |
2000 | IA-64 | 64 b | 8 b, ¼w, ½w, w | ½w, w | 41 b | 8 b | 8 b |
2002 | XScale | 32 b | w | w, 2w | ½w, w | 8 b | 8 b |
說明: b:位, d: 10進制數, w:該構架的字長, n:變量長度(variable size) |
參見
編輯參考資料
編輯- Gerrit A. Blaauw & Frederick P. Brooks, Computer Architecture: Concepts and Evolution(Addison-Wesley, 1997, ISBN 0-201-10557-8)
- Anthony Ralston & Edwin D. Reilly, Encyclopedia of Computer Science Third Edition(Van Nostrand Reinhold, 1993, ISBN 0-442-27679-6)