指令系統(tǒng)概述
指令系統(tǒng)的發(fā)展經(jīng)歷了從簡(jiǎn)單到復(fù)雜的演變過(guò)程。早在20世紀(jì)50-60年代,計(jì)算機(jī)大多數(shù)采用分立元件的晶體管或電子管組成,其體積龐大,價(jià)格也很昂貴,因此計(jì)算機(jī)的硬件結(jié)構(gòu)比較簡(jiǎn)單,所支持的指令系統(tǒng)也只有十幾至幾十條最基本的指令,而且尋址方式簡(jiǎn)單。
到60年代中期,隨著集成電路的出現(xiàn),計(jì)算機(jī)的功耗、體積、價(jià)格等不斷下降,硬件功能不斷增強(qiáng),指令系統(tǒng)也越來(lái)越豐富。在70年代,高級(jí)語(yǔ)言己成為大、中、小型機(jī)的主要程序設(shè)計(jì)語(yǔ)言,計(jì)算機(jī)應(yīng)用日益普及。由于軟件的發(fā)展超過(guò)了軟件設(shè)計(jì)理論的發(fā)展,復(fù)雜的軟件系統(tǒng)設(shè)計(jì)一直沒(méi)有很好的理論指導(dǎo),導(dǎo)致軟件質(zhì)量無(wú)法保證,從而出現(xiàn)了所謂的“軟件危機(jī)”。人們認(rèn)為,縮小機(jī)器指令系統(tǒng)與高級(jí)語(yǔ)言語(yǔ)義差距,為高級(jí)語(yǔ)言提供很多的支持,是緩解軟件危機(jī)有效和可行的辦法。計(jì)算機(jī)設(shè)計(jì)者們利用當(dāng)時(shí)已經(jīng)成熟的微程序技術(shù)和飛速發(fā)展的VLSI技術(shù),增設(shè)各種各樣的復(fù)雜的、面向高級(jí)語(yǔ)言的指令,使指令系統(tǒng)越來(lái)越龐大。這是幾十年來(lái)人們?cè)谠O(shè)計(jì)計(jì)算機(jī)時(shí),保證和提高指令系統(tǒng)有效性方面?zhèn)鹘y(tǒng)的想法和作法。
計(jì)算機(jī)的指令格式與機(jī)器的字長(zhǎng)、存儲(chǔ)器的容量及指令的功能都有很大的關(guān)系。從便于程序設(shè)計(jì)、增加基本操作并行性、提高指令功能的角度來(lái)看,指令中應(yīng)包含多種信息。但在有些指令中,由于部分信息可能無(wú)用,這將浪費(fèi)指令所占的存儲(chǔ)空間,并增加了訪(fǎng)存次數(shù),也許反而會(huì)影響速度。因此,如何合理、科學(xué)地設(shè)計(jì)指令格式,使指令既能給出足夠的信息,又使其長(zhǎng)度盡可能地與機(jī)器的字長(zhǎng)相匹配,以節(jié)省存儲(chǔ)空間,縮短取指時(shí)間,提高機(jī)器的性能,這是指令格式設(shè)計(jì)中的一個(gè)重要問(wèn)題。計(jì)算機(jī)是通過(guò)執(zhí)行指令來(lái)處理各種數(shù)據(jù)的。為了指出數(shù)據(jù)的來(lái)源、操作結(jié)果的去向及所執(zhí)行的操作,一條指令必須包含下列信息:(1)操作碼。它具體說(shuō)明了操作的性質(zhì)及功能。一臺(tái)計(jì)算機(jī)可能有幾十條至幾百條指令,每一條指令都有一個(gè)相應(yīng)的操作碼,計(jì)算機(jī)通過(guò)識(shí)別該操作碼來(lái)完成不同的操作。(2)操作數(shù)的地址。CPU 通過(guò)該地址就可以取得所需的操作數(shù)。(3)操作結(jié)果的存儲(chǔ)地址。把對(duì)操作數(shù)的處理所產(chǎn)生的結(jié)果保存在該地址中,以便再次使用。(4)下條指令的地址。執(zhí)行程序時(shí),大多數(shù)指令按順序依次從主存中取出執(zhí)行,只有在遇到轉(zhuǎn)移指令時(shí),程序的執(zhí)行順序才會(huì)改變。為了壓縮指令的長(zhǎng)度,可以用一個(gè)程序計(jì)數(shù)器(Program Counter,PC)存放指令地址。每執(zhí)行一條指令,PC 的指令地址就自動(dòng) +1(設(shè)該指令只占一個(gè)主存單元),指出將要執(zhí)行的下一條指令的地址。當(dāng)遇到執(zhí)行轉(zhuǎn)移指令時(shí),則用轉(zhuǎn)移地址修改 PC 的內(nèi)容。由于使用了 PC,指令中就不必明顯地給出下一條將要執(zhí)行指令的地址。
一條指令實(shí)際上包括兩種信息即操作碼和地址碼。操作碼(OperationCode,OP)用來(lái)表示該指令所要完成的操作(如加、減、乘、除、數(shù)據(jù)傳送等),其長(zhǎng)度取決于指令系統(tǒng)中的指令條數(shù)。地址碼用來(lái)描述該指令的操作對(duì)象,它或者直接給出操作數(shù),或者指出操作數(shù)的存儲(chǔ)器地址或寄存器地址(即寄存器名)。一條指令就是機(jī)器語(yǔ)言的一個(gè)語(yǔ)句,它是一組有意義的二進(jìn)制代碼,指令的基本格式如:操作碼字段地址碼字段其中操作碼指明了指令的操作性質(zhì)及功能,地址碼則給出了操作數(shù)或操作數(shù)的地址。
各計(jì)算機(jī)公司設(shè)計(jì)生產(chǎn)的計(jì)算機(jī),其指令的數(shù)量與功能、指令格式、尋址方式、數(shù)據(jù)格式都有差別,即使是一些常用的基本指令,如算術(shù)邏輯運(yùn)算指令、轉(zhuǎn)移指令等也是各不相同的。因此,盡管各種型號(hào)計(jì)算機(jī)的高級(jí)語(yǔ)言基本相同,但將高級(jí)語(yǔ)言程序(例如 Fortran 語(yǔ)言程序)編譯成機(jī)器語(yǔ)言后,其差別也是很大的。因此將用機(jī)器語(yǔ)言表示的程序移植到其他機(jī)器上去幾乎是不可能的。從計(jì)算機(jī)的發(fā)展過(guò)程已經(jīng)看到,由于構(gòu)成計(jì)算機(jī)的基本硬件發(fā)展迅速,計(jì)算機(jī)的更新?lián)Q代是很快的,這就存在軟件如何跟上的問(wèn)題。大家知道,一臺(tái)新機(jī)器推出交付使用時(shí),僅有少量系統(tǒng)軟件(如操作系統(tǒng)等)可提交用戶(hù),大量軟件是不斷充實(shí)的,尤其是應(yīng)用程序,有相當(dāng)一部分是用戶(hù)在使用機(jī)器時(shí)不斷產(chǎn)生的,這就是所謂第三方提供的軟件。為了緩解新機(jī)器的推出與原有應(yīng)用程序的繼續(xù)使用之間的矛盾,1964 年在設(shè)計(jì) IBM360 計(jì)算機(jī)時(shí)所采用的系列機(jī)思想較好地解決了這一問(wèn)題。從此以后,各個(gè)計(jì)算機(jī)公司生產(chǎn)的同一系列的計(jì)算機(jī)盡管其硬件實(shí)現(xiàn)方法可以不同,但指令系統(tǒng)、數(shù)據(jù)格式、I/O 系統(tǒng)等保持相同,因而軟件完全兼容(在此基礎(chǔ)上,產(chǎn)生了兼容機(jī))。當(dāng)研制該系列計(jì)算機(jī)的新型號(hào)或高檔產(chǎn)品時(shí),盡管指令系統(tǒng)可以有較大的擴(kuò)充,但仍保留了原來(lái)的全部指令,保持軟件向上兼容的特點(diǎn),即低檔機(jī)或舊機(jī)型上的軟件不加修改即可在比它高檔的新機(jī)器上運(yùn)行,以保護(hù)用戶(hù)在軟件上的投資。