專利名稱:支持程序編碼長度減小的微處理器的制作方法
技術(shù)領(lǐng)域:
本發(fā)明有關(guān)根據(jù)程序中的指示處理數(shù)據(jù)的一個微處理器,詳細(xì)地說,涉及一個用來支持程序編碼長度減小的微處理器。
背景技術(shù):
對于新的微處理器嵌入式產(chǎn)品,人們目前都希望具有高性能。為了實現(xiàn)這種高性能產(chǎn)品,微處理器的程序變得越來越長。然而,在微處理器嵌入式產(chǎn)品中,程序應(yīng)該被存儲在一個或多個ROM中,如果程序中采用的編碼長度增大,一個ROM的容量和/或ROM的數(shù)量也要增加,這是研制廉價產(chǎn)品的一個障礙。因此,在研制這種產(chǎn)品時,需要盡可能地壓縮編碼長度。
壓縮編碼長度的一種常規(guī)技術(shù)對微處理器執(zhí)行的每條指令的編碼長度進(jìn)行壓縮(例如NEC的V800系列和日立的SH7000系列)。這種技術(shù)的微處理器執(zhí)行的指令長度比數(shù)據(jù)總線、算術(shù)邏輯單元(ALU)或寄存器的長度(以下稱為ALU長度)短。例如,微處理器執(zhí)行16位指令,而ALU長度為32位。
該技術(shù)允許用16位指令來替代32位指令,從而排除了不必要的位,并有效壓縮了程序的總編碼長度。
然而,這種第一常規(guī)技術(shù)有下面所述的問題。
雖然指令長度比ALU長度要短,但指令長度應(yīng)該等于或N倍于微處理器的指令譯碼器的長度(N是整數(shù))。也就是說,一條指令以8位為單位擴(kuò)展。例如,如果譯碼器為8位長,指令長度應(yīng)該是8位、16位、24位、32位、...中的一個。該擴(kuò)展單位不能減少到8位以下。因此,即使不需要8位來代表一個數(shù)值,也必須用8位。這就造成了編碼長度的浪費。
圖1示出了用于常規(guī)微處理器中的一條指令的格式。指令“add#4,d0”指示微處理器將立即值“4”加到寄存器d0中存儲的一個值中。該指令共采用16位,其中8位用于指示操作碼“add#4,d0”,8位用于指定立即值“#n”,在該例中為“4”。然而,用8位來表示“4”太多。從“-8”到“+7”的一個整數(shù)只需4位來表示。這就是說,對于只需12位的指令用了16位,從而造成了編碼長度的浪費。
壓縮編碼長度的第二種常規(guī)技術(shù)是從/向一個存儲器有效地讀出/寫入數(shù)據(jù)的方法。這通過例如改進(jìn)一條數(shù)據(jù)轉(zhuǎn)移指令中采用的尋址模式來實現(xiàn)。
圖2A和圖2B都是從/向存儲器讀出/寫入數(shù)據(jù)的程序,都指示微處理器讀出儲存在存儲器中的一個值,對該值進(jìn)行計算,并將計算結(jié)果存入存儲器。
圖2A中的指令a1是一條裝入指令,用該指令將存儲在用一個絕對地址指定的存儲器存儲單元中的一個數(shù)據(jù)讀到寄存器D0中。指令a2是一條加指令,用該指令將存儲在寄存器D1中的一個值與寄存器D0中的一個值相加,并將結(jié)果存入寄存器D0中。指令a3是一條存儲指令,用該指令將存儲在寄存器D0中的一個值存儲在用一個絕對地址指定的存儲器存儲單元中。這些指令的基本部分長度為8位。一個絕對地址的長度是16位。因此,圖2A的程序的總編碼長度為7個字節(jié),也就是說,要用7個字節(jié)來完成從/向存儲器的數(shù)據(jù)讀出/寫入。
在圖2A的程序中,對于兩個存儲器存取的每一個均用了16位的絕對地址。在圖2B的程序中,采用一個地址寄存器來進(jìn)行存儲器存取。
圖2B的程序與圖2A的不同之處在于第一,它將存儲器的一個絕對地址轉(zhuǎn)移到一個地址寄存器中(指令b1),第二,它通過指定地址寄存器將數(shù)據(jù)從存儲器轉(zhuǎn)移到寄存器D0中(指令b2),第三,它通過指定地址寄存器將計算結(jié)果存儲在存儲器中(指令b4)。
雖然圖2B的程序另外還包括一條將絕對地址轉(zhuǎn)移到地址寄存器中的指令,但只有指令b1包括一個絕對地址。因此,與圖2A的程序相比,總編碼長度被減小了一個字節(jié)。
如果一組存儲器存取所用的編碼長度被減小,那么在微處理器中可以縮小大量的程序空間。
然而,第二常規(guī)技術(shù)的問題是地址寄存器當(dāng)它們被用于指定存儲器的絕對地址時被占用,因此,具有較少地址寄存器的處理器不可能總能采用這種方法。另外,由于微處理器,特別是內(nèi)置式微處理器,常常從/向存儲器讀出/寫入數(shù)據(jù),地址寄存器不可能用于其它操作。
發(fā)明內(nèi)容
因此,本發(fā)明的第一個目的是提供一臺執(zhí)行被有效減小的指令的微處理器,減小指令是通過解除指令長度應(yīng)該等于或N倍于微處理器的指令譯碼器的長度(N是整數(shù))的限制,從而使得產(chǎn)生的程序比具有同樣內(nèi)容的常規(guī)程序的編碼長度要短。
本發(fā)明的第二個目的是提供一臺不占用地址寄存器就能使得編碼長度減小的微處理器。
第一個目的通過支持編碼長度減小的一種微處理器來實現(xiàn),該微處理器包括一個用于譯碼指令的譯碼器,該指令長度為“w”,用表達(dá)式w=a+nb表示,其中“a”表示由所述譯碼器譯碼的指令的最小長度,“n”是0或大于0的整數(shù),“b”是一個小于“a”的正整數(shù),其中,一條指令被分為一個或多個代碼,并且其中所述的指令至少包括長度為“a”的一條指令和長度為“(a+b)”的一條指令;一個執(zhí)行裝置,用于根據(jù)從由所述譯碼器譯碼的所述指令中得到的信息對數(shù)據(jù)進(jìn)行處理,由所述微處理器譯碼和執(zhí)行的程序包括長度為“a”的一條指令和長度為“(a+b)”的一條指令。
這個微處理器擴(kuò)展指令時不必受到指令長度應(yīng)該等于或n倍于微處理器的指令譯碼器的長度的限制(n為整數(shù))。這就是說,微處理器以小于“a”的“b”為單位擴(kuò)展指令,從而本發(fā)明減少了指令編碼中包括的不必要的位,縮短了總程序長度。
在上述微處理器中,“a”的長度可能等于一個字,“b”的長度可能等于半個字,其中字和半個字是長度單位。
這個微處理器以半個字為單位擴(kuò)展指令,這樣指令長度“w”將是a、1.5a、2a、2.5a、3a、...中的任何一個。在這種情況下,由一條指令指定的信息量增加較少的位。例如,指令可以用更多的信息定義,并且數(shù)據(jù)可以用更多的信息指定。
微處理器可能進(jìn)一步包括一個用于保持一條預(yù)取指令的指令緩沖器;一個用于對每半個字存儲保持在指令緩沖器中的指令一個狀態(tài)的信息的存儲裝置;一個第一判斷裝置,用于根據(jù)譯碼裝置譯碼的指令所獲得的信息判斷接下來要被譯碼的一個代碼長度是否是半個字或一個字;和一個控制裝置,用于根據(jù)第一判斷裝置判斷的長度和存儲在存儲裝置中的狀態(tài)來控制指令緩沖器,使得存儲在指令緩沖器中的指令的代碼被轉(zhuǎn)移到譯碼器,并且用于更新存儲在指令緩沖器中的狀態(tài)。
該微處理器在指令緩沖器中存儲一條預(yù)取指令,并且對每半個字將預(yù)取指令的狀態(tài)信息存儲在存器中和更新該信息。此外微處理器判斷下一個代碼長度是一個字還是半個字,這使得微處理器能判斷下一個代碼在指令緩沖器中以半個字為單位如何被定位。
微處理器的譯碼器可以包括一個高位譯碼寄存器,用于存儲一個代碼的高位半個字;一個低位譯碼寄存器,用于存儲此一代碼的低位半個字;其中指令緩沖器包括一個第一寄存器,用于存儲最后取出的一個字代碼;一個第二寄存器,用于存儲比第一寄存器中存儲的代碼優(yōu)先的一個字代碼;一個選擇裝置,用于根據(jù)控制裝置的指示,有選擇的轉(zhuǎn)移一個代碼到譯碼器;其中第一寄存器包括一個第一高位寄存器,用于存儲一個代碼的高位半個字;一個第一低位寄存器,用于存儲此一代碼的低位半個字;其中第二寄存器包括一個第二高位寄存器,用于存儲一個代碼的高位半個字;一個第二低位寄存器,用于存儲此一代碼的低位半個字;其中選擇裝置包括一個高位選擇裝置,用于從第二高位寄存器、第二低位寄存器和低位譯碼寄存器中的任一個有選擇的轉(zhuǎn)移一個代碼到高位譯碼寄存器;一個低位選擇裝置,用于從第二高位寄存器、第二低位寄存器和第一低位寄存器中的任一個有選擇地轉(zhuǎn)移一個代碼到低位譯碼寄存器;其中存儲裝置存儲任何一個下面所述的內(nèi)容指示第二高位寄存器和第二低位寄存器都沒有存儲代碼的一個第一狀態(tài),指示第二高位寄存器存儲一個代碼而第二低位寄存器沒有存儲代碼的一個第二狀態(tài),和指示第二高位寄存器和第二低位寄存器都存儲一個代碼的一個第三狀態(tài)。
該微處理器取出1-字代碼,并將它們分成半字代碼之后存儲在指令緩沖器中。一個選定的代碼被以半字為單位獨立地轉(zhuǎn)移到譯碼寄存器。存儲裝置存儲代碼如何在指令緩沖器中定位的狀態(tài),該代碼將在下一周期轉(zhuǎn)移到譯碼寄存器。這使得微處理器能在指令緩沖器中存儲必要的代碼,并且將它們以半個字為單位獨立地轉(zhuǎn)移到譯碼寄存器來進(jìn)行譯碼。
微處理器的控制裝置可以控制選擇裝置,因而如果存儲裝置存儲第二狀態(tài),而且第一判斷裝置判斷接下來要被譯碼的一個代碼長度為一個字,則高位選擇裝置將一個代碼從第二高位寄存器轉(zhuǎn)移到高位譯碼寄存器,以及低位選擇裝置將一個代碼從第一低位寄存器轉(zhuǎn)移到低位譯碼寄存器。
微處理器將存儲在兩個以上寄存器中的一個1-字代碼轉(zhuǎn)移到譯碼寄存器進(jìn)行譯碼,這使得微處理器能夠正確地譯碼和執(zhí)行由兩個地址指定的外存中兩個以上存儲單元內(nèi)存儲的一個1-字代碼,并使得微處理器不受外存中定位代碼的字定位限制。
微處理器的控制裝置可以控制選擇裝置,因而如果存儲裝置存儲第三狀態(tài),并且第一判斷裝置判斷接下來要被譯碼的一個代碼長度為半個字,那么高位選擇裝置將一個代碼從低位譯碼寄存器轉(zhuǎn)移到高位譯碼寄存器和低位選擇裝置將一個代碼從第二低位寄存器轉(zhuǎn)移到低位譯碼寄存器,并且將存儲在存儲裝置中的信息從第三狀態(tài)更新為第二狀態(tài)。
微處理器只將一個半字代碼從第二低位寄存器轉(zhuǎn)移到譯碼寄存器,并用先前被譯碼的另一個半字代碼對其進(jìn)行譯碼,且對二者予以執(zhí)行。這使得微處理器能夠正確地譯碼和執(zhí)行一個半字代碼,即使該半字代碼存儲在外存中的一個低位位置。
微處理器的控制裝置可以控制選擇裝置,因而如果存儲裝置存儲第二狀態(tài),并且第一判斷裝置判斷接下來要被譯碼的一個代碼長度為半個字,則高位選擇裝置將一個代碼從低位譯碼寄存器轉(zhuǎn)移到高位譯碼寄存器和低位選擇裝置將一個代碼從第二高位寄存器轉(zhuǎn)移到低位譯碼寄存器,并且將存儲在存儲裝置中的信息從第二狀態(tài)更新為第三狀態(tài)。
微處理器只將一個半字代碼從第二高位寄存器轉(zhuǎn)移到譯碼寄存器,并用先前被譯碼的另一個半字代碼對其進(jìn)行譯碼,并對二者予以執(zhí)行。這使得微處理器能夠正確地譯碼和執(zhí)行一個半字代碼,即使該半字代碼存儲在外存中的一個高位位置。
該微處理器可以進(jìn)一步包括一個第二判斷裝置,用于根據(jù)存儲在存儲裝置中的信息和從譯碼指令得到的信息,判斷由譯碼器譯碼的一條指令是否是一條存儲在外存儲器中在半字位置結(jié)束的一個存儲單元中的轉(zhuǎn)移子程序指令,其中如果第二判斷裝置判斷由譯碼器譯碼的一條指令是一條存儲在外存儲器中在半字位置結(jié)束的一個存儲單元中的轉(zhuǎn)移子程序指令,則當(dāng)指定了一個子程序的一個返回地址后,該執(zhí)行裝置執(zhí)行該子程序,該返回地址是通過將半個字加到半字位置得到的。
采用這樣一種結(jié)構(gòu),即使一條轉(zhuǎn)移子程序指令存儲在外存中從一個半字邊界開始的存儲單元中,該轉(zhuǎn)移子程序指令通常通過保存一個返回地址來予以執(zhí)行,該返回地址與在一個字邊界結(jié)束的轉(zhuǎn)移子程序指令的地址具有相同的長度。結(jié)果,對堆棧的存取次數(shù)被減小,并阻止了對堆棧的不必要使用,從而改進(jìn)了微處理器的吞吐量。
本發(fā)明的第二個目的是由支持代碼長度減小的一種微處理器實現(xiàn)的,它包括一個操作數(shù)地址緩沖器,用于保持目標(biāo)存儲器存取地址,其中操作數(shù)地址緩沖器與一個外部存儲器相連;一個用于取指令的取指裝置;一個指令檢測裝置,用于檢測已被取指裝置取出并準(zhǔn)備訪問外部存儲器的一條指令;一個判斷裝置,用于判斷由指令檢測裝置檢測的指令是否指定存儲在操作數(shù)地址緩沖器中的目標(biāo)存儲器存取地址;一個第一控制裝置,用于控制操作數(shù)地址緩沖器,因而如果判斷裝置判定由指令檢測裝置檢測的指令指定目標(biāo)存儲器存取地址,則操作數(shù)地址緩沖器中存儲的地址被輸出到外部存儲器;一個第二控制裝置,用于將從指令檢測裝置檢測的指令的一個操作數(shù)中得到的地址存入操作數(shù)地址緩沖器,并且控制操作數(shù)地址緩沖器,因而如果判斷裝置判定指令不指定存儲在操作數(shù)地址緩沖器中的目標(biāo)存儲器存取地址,則所存儲的地址被輸出到外部存儲器。
這個微處理器可以訪問一個存儲器而不必指定任何絕對地址,并且也不必采用地址寄存器,這是因為如果該地址被指定為目標(biāo)存儲器存取地址,那么存儲在一個操作數(shù)地址緩沖器中的地址被輸出到該存儲器。
另外,即使在存儲器映象I/O中有許多對I/O端口的I/O存取,如同在內(nèi)置式微處理器中那樣,地址寄存器也不會占用。因此該微處理器可以有效地利用地址寄存器。
此外,當(dāng)同一I/O端口在每個確定的周期被監(jiān)控,并且I/O端口的一個值被重復(fù)裝入時,或者當(dāng)外圍設(shè)備通過一個I/O端口被控制,并且I/O端口的一個值在每個確定的周期被重寫時,通過將存儲在操作數(shù)地址緩沖器中的地址指定為目標(biāo)存儲器存取地址,地址寄存器能得到有效的使用。
地址寄存器增大的使用效率有助微處理器大大地減小編碼長度,原因是較少絕對地址被轉(zhuǎn)移到地址寄存器,較少數(shù)據(jù)從/向地址寄存器恢復(fù)/保存,并且地址寄存器可以用于許多其它目的。
該微處理器不僅成功地減小了編碼長度,并且成功地加快了執(zhí)行時間。其原因是,如果一地址被指定為一個目標(biāo)存儲器存取地址,由于存儲在一個操作數(shù)地址緩沖器中的該地址被輸出到存儲器,計算地址的次數(shù)被減少,因此數(shù)據(jù)轉(zhuǎn)移到ALU的次數(shù)被減少,并且計算的地址被較少轉(zhuǎn)移到操作數(shù)地址緩沖器。
本發(fā)明的第二個目的也可以通過一種支持編碼長度減小的微處理器來實現(xiàn),它包括一個用于包括對n個操作數(shù)地址緩沖器重復(fù)使用的緩沖器陣列,這些緩沖器分別將從一個立即處理的目標(biāo)存儲器存取地址至n倍于在過去對所述外部存儲器的先前存取中使用的目標(biāo)存儲地址的地址存儲起來,其中n是2或大于2的整數(shù),并且其中所述緩沖器陣列與一個外部存儲器相連接;一個用于取指令的取指裝置;一個指令檢測裝置,用于檢測已被所述取指裝置取出并準(zhǔn)備訪問所述外部存儲器的一條指令;一個判斷裝置,用于判斷由所述指令檢測裝置檢測的所述指令是否指定任何一個所述操作數(shù)地址緩沖器;一個第一控制裝置,用于控制所述緩沖器陣列,使得如果所述判斷裝置斷定由所述指令檢測裝置檢測的所述指令指定所述操作數(shù)地址緩沖器,則所述地址緩沖器被輸出到所述外部存儲器;一個第二控制裝置,用于將從指令檢測裝置檢測的所述指令的一個操作數(shù)中得到的地址存入任何一個所述操作數(shù)地址緩沖器,并且控制所述緩沖器陣列,使得如果所述判斷裝置判定所述指令不指定任何一個操作數(shù)地址緩沖器,則所述存儲地址被輸出到所述外部存儲器。
采用這樣一種結(jié)構(gòu),微處理器通過選擇存儲在n個操作數(shù)地址緩沖器中的任何一個先前的目標(biāo)存儲器存取地址,可以從n個操作數(shù)地址緩沖器的如何一個中輸出一目標(biāo)存儲器存取地址。這樣微處理器可以訪問一個存儲器而不必指定任何絕對地址,并且不必采用地址寄存器,因為存儲在操作數(shù)地址緩沖器中的地址被作為目標(biāo)存儲器存儲地址被輸出到存儲器。
根據(jù)本發(fā)明的一種用于支持程序編碼長度減小的微處理器,包括一個用于譯碼指令的譯碼器,該指令長度為“w”,用表達(dá)式w=a+nb表示,其中“a”表示由所述譯碼器每次譯碼時的代碼長度,“n”是0或大于0的整數(shù),“b”是一個小于“a”的正整數(shù),其中,一條指令被分為一個或多個代碼,并且其中所述的指令至少包括長度為“a”的一條指令和長度為“(a+b)”的一條指令;一個執(zhí)行裝置,用于根據(jù)從由所述譯碼器譯碼的所述指令中得到的信息對數(shù)據(jù)進(jìn)行處理;一個指令緩沖器,用于保持一條預(yù)取指令;一個存儲裝置,用于對每半個字存儲保存在所述指令緩沖器中的所述指令的一個狀態(tài);一個第一判斷裝置,用于根據(jù)所述譯碼器譯碼的指令所獲得的信息判斷接下來要被譯碼的一個代碼長度是否是半個字或一個字;一個控制裝置,用于根據(jù)由所述第一判斷裝置判斷的所述長度和存儲在所述存儲裝置中的所述狀態(tài)控制所述指令緩沖器,使得存儲在所述指令緩沖器中的所述指令的代碼被轉(zhuǎn)移到所述譯碼器,并且用于更新存儲在所述指令緩沖器中的所述狀態(tài);其中,所述譯碼器包括一個高位譯碼寄存器,用于存儲一個代碼的高位半個字;一個低位譯碼寄存器,用于存儲一個所述代碼的低位半個字;所述指令緩沖器包括一個第一寄存器,用于存儲最后取出的一個字代碼;一個第二寄存器,用于存儲比所述第一寄存器中存儲的所述代碼優(yōu)先的一個字代碼;一個選擇裝置,用于根據(jù)所述控制裝置的指示,有選擇的轉(zhuǎn)移一個代碼到所述譯碼器;所述第一寄存器包括一個第一高位寄存器,用于存儲一個代碼的高位半個字;一個第一低位寄存器,用于存儲一個所述代碼的低位半個字;所述第二寄存器包括一個第二高位寄存器,用于存儲一個代碼的高位半個字;一個第二低位寄存器,用于存儲一個所述代碼的低位半個字;所述選擇裝置包括一個高位選擇裝置,用于從所述第二高位寄存器、所述第二低位寄存器和所述低位譯碼寄存器中的任一個有選擇的轉(zhuǎn)移一個代碼到所述高位譯碼寄存器;一個低位選擇裝置,用于從所述第二高位寄存器、所述第二低位寄存器和所述第一低位寄存器中的任一個有選擇地轉(zhuǎn)移一個代碼到所述低位譯碼寄存器;所述存儲裝置存儲任何一個下面所述的內(nèi)容指示所述第二高位寄存器和所述第二低位寄存器都沒有存儲一個代碼的一個第一狀態(tài),指示所述第二高位寄存器存儲一個代碼而所述第二低位寄存器沒存存儲一個代碼的一個第二狀態(tài),指示所述第二高位寄存器和所述第二低位寄存器都存儲一個代碼的一個第三狀態(tài)。
根據(jù)本發(fā)明的一種微處理器,包括一個譯碼器,用于逐條地對指令進(jìn)行譯碼,并且輸出譯碼的指令;和,一個執(zhí)行裝置,用于根據(jù)從由所述譯碼器譯碼的指令對數(shù)據(jù)進(jìn)行處理,其中所述譯碼器包括多個譯碼單元,其中(1)當(dāng)一個代碼指令具有等于一個最小指令長度乘以一個正整數(shù)所得到的長度時,所述譯碼器重復(fù)地以所述正整數(shù)的次數(shù)利用所有所述多個譯碼單元對所述代碼指令進(jìn)行譯碼;和,(2)當(dāng)一個代碼指令包括一個其長度等于所述最小指令長度乘以一個正整數(shù)所得到的長度的第一部分、并且還包括一個其長度等于所述最小指令長度乘以一個大于零且小于1的值所得到的長度的第二部分時,所述譯碼器重復(fù)地以所述正整數(shù)的次數(shù)利用所有所述多個譯碼單元對所述代碼指令的所述第一部分進(jìn)行譯碼,并且利用所述多個譯碼單元的一部分對所述代碼指令的所述第二部分進(jìn)行譯碼,由所述微處理器譯碼和執(zhí)行的程序包括長度為“a”的一條指令和長度為“(a+b)”的一條指令。
從下面結(jié)合示意本發(fā)明特定實施例的附圖所作的描述,本發(fā)明的上述以及其它目的、優(yōu)點和特性將變得顯而易見。
圖1示出了用于常規(guī)微處理器中的一條指令的格式。
圖2A示出了包括兩個絕對地址規(guī)格說明的一個常規(guī)程序。
圖2B示出了包括采用地址寄存器的一條LOAD指令和一條STORE指令的一個常規(guī)程序。
圖3是示意本發(fā)明第一實施例的一個微處理器結(jié)構(gòu)的方框圖。
圖4是示意指令譯碼塊100的結(jié)構(gòu)的方框圖。
圖5示出了本發(fā)明第一實施例的一個微處理器的指令譯碼塊100的狀態(tài)。
圖6示出了由本發(fā)明第一實施例的微處理器執(zhí)行的兩類指令格式。
圖7A示出了一條包括5-半字節(jié)的指令的格式。
圖7B示出了當(dāng)指令存儲在外存儲器中從一個字節(jié)邊界開始的存儲單元時,圖7A中所示的指令的1-半字節(jié)組成的代碼是如何定位的。
圖7C示出了當(dāng)圖7A中所示的指令被指令譯碼塊100讀出時,在每個時鐘周期的指令流水線。
圖8A示出了當(dāng)指令存儲在外部存儲器中從一半字節(jié)邊界開始的存儲單元中時,圖7A中所示的指令的一半字節(jié)組成的代碼是如何定位的。
圖8B示出了當(dāng)圖7A中所示的指令被指令譯碼塊100讀出時,在每個時鐘周期的指令流水線。
圖9示出了無條件轉(zhuǎn)移指令“jmp”的格式。
圖10的流程圖示出了當(dāng)指令“jsr”被執(zhí)行時,本發(fā)明第一實施例的微處理器的運行。
圖11A示出了存儲在外存儲器中起始于一個字節(jié)邊界的存儲單元中的指令“jsr”與返回地址的關(guān)系。
圖11B示出了存儲在外存儲器中起始于半字節(jié)邊界的存儲單元中的指令“jsr”與返回地址的關(guān)系。
圖12的方框圖示出了本發(fā)明第二實施例的一臺微處理器的結(jié)構(gòu)。
圖13示出了緩沖器OAB5、LDB6、STB7、IAB10和IFB11是如何用于微處理器中的。
圖14A示出了用于PA尋址的LOAD指令和STORE指令的公用格式。
圖14B示出了用于PA尋址的LOAD指令。
圖14C示出了用于PA尋址的STORE指令。
圖15A示出了用于PA尋址的一個程序段。
圖15B示出了用于指定兩個絕對地址的PA尋址的一個程序段。
圖15C示出了用于包括采用一個地址寄存器的LOAD指令和STORE指令的PA尋址的一個程序段。
圖16示出了圖12中所示的每個部件的運行時序圖。
圖17示出了圖12中所示的每個部件的運行時序圖。
圖18是對圖12的部分放大,該區(qū)域包括OAB5。
圖19A示出了在中斷被處理之前的堆棧。
圖19B示出了在中斷處理過程中的堆棧。
圖20示出了第三實施例的OAB陣列。
圖21A示出了用于PA尋址的一條指令的格式。
圖21B示出了用于PA尋址中的LOAD指令的助記符。
圖22示出了用PA尋址的一個程序,該程序指定OAB陣列中的OAB52,以及OAB陣列是如何由程序操作的。
圖23A示出了在第三實施例中在處理一個中斷之前的堆棧。
圖23B示出了在第三實施例中在處理一個中斷的過程中的堆棧。
圖24示出了第三實施例的應(yīng)用。
具體實施例方式
下面參考附圖描述本發(fā)明的最佳實施例。
(第一實施例)(a)結(jié)構(gòu)圖3的方框圖示出了本發(fā)明第一實施例的一臺微處理器的結(jié)構(gòu)。該微處理器包括一個16位外部地址總線212和一個8位數(shù)據(jù)總線213,它被分為數(shù)據(jù)通道塊200和指令譯碼塊100。注意,存儲將要執(zhí)行的指令的一個外部存儲器沒有示于圖中,但通過上述總線與處理器相連。
用于傳送數(shù)據(jù)或執(zhí)行計算的數(shù)據(jù)通道塊200包括選擇器(SEL)201、寄存器組202、內(nèi)部總線A203、內(nèi)部總線B204、譯碼計數(shù)器(DECPC)205、預(yù)取計數(shù)器(PFC)206、增量器(INC)207、算術(shù)邏輯單元(ALU)208、地址緩沖器(ADB)209、存儲數(shù)據(jù)緩沖器(STB)210和裝入數(shù)據(jù)緩沖器(LDB)211,括號中的字符代表縮寫。上述部件具有通用的功能。
構(gòu)成一個保持地址信息單元的堆棧指針(SP)202a、譯碼計數(shù)器(DECPC)205、預(yù)取計數(shù)器(PFC)206、增量器(INC)207和地址緩沖器(ADB)209的長度都是16位。另一方面,構(gòu)成一個保持?jǐn)?shù)據(jù)信息單元的通用寄存器(REG)202b、存儲數(shù)據(jù)緩沖器(STB)210和裝入數(shù)據(jù)緩沖器(LDB)的長度都是8位。數(shù)據(jù)通路塊200和指令譯碼塊100由內(nèi)部總線B204相連。
圖4的方框圖示出了指令譯碼塊100的結(jié)構(gòu)。
用于將從外部存儲器取出的指令進(jìn)行譯碼的指令譯碼塊100包括取指緩沖器(IFB)101、指令緩沖器(IB)102、指令選擇器(SI)103、指令寄存器(IR)104、譯碼單元105、執(zhí)行單元108、控制單元109和存儲單元110。
IFB101是用于存儲經(jīng)由外部數(shù)據(jù)總線213從外部存儲器取出的一個1-字代碼的寄存器。
“字”是用于譯碼指令的單位,本裝置處理一個8位的字,即一個1-字節(jié)的字。在第一實施例中,外部存儲器存儲1-字代碼,即1-字節(jié)代碼,每個代碼由一個16位地址定位。
“指令”向處理器指出了指示的邏輯單元,如“add#4,d0”。另一方面,“代碼”指出了一條編碼指令的全部或部分。例如“0c2”和“0c”都是代碼,其中“0c2”是以16進(jìn)制記數(shù)法表示的指令“add#4,d0”,“0c”則是“0c2”的一部分。
IFB101包括高位取指緩沖器(IFBH)101a和低位取指緩沖器(IFBL)101b。二者都存儲一個取代碼的半字節(jié)(四位)。注意數(shù)據(jù)通道塊200的預(yù)取指計數(shù)器(PFC)206保持一個代碼的外部存儲器地址,該代碼由IFB101保持,該地址經(jīng)由地址總線傳送。
IB102是用于存儲由IFB101輸出的一個代碼的寄存器,它包括高位指令緩沖器(IBH)102a和低位指令緩沖器(IBL)102b。二者都存儲一個半字節(jié)的代碼。注意,根據(jù)從執(zhí)行單元108來的指令,已由IFB101和IB102保持的一個代碼經(jīng)由一個選擇器(圖中沒有示出)輸出到內(nèi)部總線B204,然后被傳送到數(shù)據(jù)通路塊200。
IR104是用于存儲一個要被譯碼的一個1-字節(jié)代碼的寄存器,它包括高位指令寄存器(IRH)104a和低位指令寄存器(IRL)104b。二者都存儲一個半字節(jié)的代碼。注意,數(shù)據(jù)通路塊200的DECPC205存儲由IR104保持的一個代碼的外部存儲器的地址。
IFB101、IB102和IR104構(gòu)成一條指令流水線??偟膩碚f,三個字節(jié)的代碼(讀出代碼為兩個字節(jié),譯碼的代碼為一個字節(jié))被存儲在這條指令流水線中。
SI103包括兩個獨立的部件高位指令選擇器(SIH)103a,用于將IBH102a、IBL102b和IRL104b的任意一個中存儲的一個代碼的半字節(jié)傳送到IRH104a;低位指令選擇器(SIL)103b,用于將IFBL101b、IBH102a和IBL102b的任意一個中存儲的一個代碼的半字節(jié)傳送到IRL104b。
存儲單元110存儲一個數(shù)字值,該值指示代碼是如何存儲在IB102中的。詳細(xì)地說,存儲單元110存儲與圖5中所示的三種狀態(tài)的任何一種相關(guān)的一個數(shù)字值,這三種狀態(tài)是狀態(tài)S0指示在IBH102a和IBL102b中都沒有存儲一個半字節(jié)代碼;狀態(tài)S1指示在IBH102a中存儲了一個半字節(jié)代碼,而在IBL102b中沒有;狀態(tài)S2指示IBH102a和IBL102b都存儲了一個半字節(jié)代碼。
譯碼單元105訪問存儲單元110,并且對存儲在IR104中的一個1-字節(jié)代碼進(jìn)行譯碼,然后將結(jié)果送到執(zhí)行單元108和控制單元109。譯碼單元105的總的功能是譯碼,它也包括代碼長度判斷單元107和字定位判斷單元106。
代碼長度判斷單元107判斷接下來要被譯碼的一個代碼是一個半字節(jié)還是1-字節(jié)代碼,并將判斷結(jié)果送到控制單元109。
控制單元109根據(jù)代碼長度判斷單元107的判斷和存儲單元110中存儲的狀態(tài)控制SI103,并且更新存儲單元110中存儲的狀態(tài)。
字定位判斷單元106判斷一條被譯碼的指令是否是存儲在外存儲器中起始于一個半字節(jié)邊界的存儲單元中的轉(zhuǎn)移到子程序指令,并將判斷結(jié)果送到執(zhí)行單元108。字節(jié)邊界是在外存儲器中兩個相鄰的1-字節(jié)存儲單元之間的邊界。半字節(jié)邊界是在外存儲器中一個1-字節(jié)存儲單元的高位半字節(jié)和低位半字節(jié)之間的邊界或中心。
執(zhí)行單元108根據(jù)譯碼單元105的輸出控制指令譯碼塊100和數(shù)據(jù)通路塊200的部件,并且進(jìn)行數(shù)據(jù)傳送、計算等等。注意,圖3和圖4沒有示出從執(zhí)行單元108向每個部件傳送的控制信號。還要注意,包括執(zhí)行單元108在內(nèi)的所有部件,在每個時鐘周期與圖中沒有示出的一個時鐘信號上同步運行。
(b)指令格式現(xiàn)在描述第一實施例的微處理器的指令格式。圖6示出了兩類指令格式。本微處理器譯碼和執(zhí)行的所有指令都屬于圖6A和6B所示的格式1和格式2。
格式1中的指令具有可變的長度,并且包括一個1-字節(jié)基本指令字和一個或多個半字節(jié)擴(kuò)充字。格式1中的某些指令可以沒有任何擴(kuò)充字。基本指令字是用于指示一條指令的一個操作碼,且被譯碼單元105譯碼。擴(kuò)充字指示一個數(shù)據(jù),如位移值、立即值等等,該數(shù)據(jù)被用于由基本指令字指定的一條指令所執(zhí)行的計算中。擴(kuò)充字不用由譯碼單元105譯碼。
例如,指令“add#2,d0”指示微處理器將立即值2加到寄存器d0中存儲的一個值中,該條指令由代碼“0c2”(16進(jìn)制)表示。代碼“0c2”包括基本指令字“0c”(16進(jìn)制)和擴(kuò)充字“2”。基本指令字“0c”指示“將由隨后的一個半字節(jié)擴(kuò)充字表示的一個值加到存儲在寄存器d0中的一個值中”。對指示微處理器采用由一個半字節(jié)表示的值進(jìn)行計算的一條指令的常規(guī)的微處理器共需要16位,而本微處理器只需要三個半字節(jié),即12位,這是因為常規(guī)的微處理器以字節(jié)(表示上述擴(kuò)充字“02”(16進(jìn)制))為單位擴(kuò)充指令。
因此,本微處理器的格式1中的指令比常規(guī)微處理器的相應(yīng)指令具有較少的位。
格式2中的指令有一個3-半字節(jié)基本指令字和1-半字節(jié)擴(kuò)充字,并具有可變長度。例如,指令“XOR#ff,d0”指示微處理器對立即值ff(16進(jìn)制)和寄存器d0中存儲的一個值執(zhí)行異或運算,它由代碼“208ff”(16進(jìn)制)表示。代碼“208ff”包括基本指令字“208”(16進(jìn)制)和擴(kuò)充字ff(16進(jìn)制),基本指令字208指示“對由隨后的兩個1-半字節(jié)擴(kuò)充字表示的一個值和寄存器d0中存儲的一個值執(zhí)行異或運算?!碑?dāng)這條指令被執(zhí)行時,譯碼單元105只對基本指令字的三個半字節(jié)譯碼。
定義格式2的基本指令字的第一1-半字節(jié)代碼是“2”或“3”,也就是說,格式2的基本指令字是“2--”(16進(jìn)制)或“3--”(16進(jìn)制)。通過這種安排,僅僅從第一個半字節(jié)的值就可以判斷一條指令是格式1還是格式2。
用這種方法,本微處理器具有8、12、16、20、24、...位的指令,最小長度是8位,可以以4位為單元擴(kuò)充。這就是說,指令可以以小于指令譯碼器的長度(8位)的4位為單位擴(kuò)充。從而本處理器通過減小代碼長度而縮短了程序。
(c)微處理器的操作下面對本微處理器的操作進(jìn)行描述。
注意,這里只對本微處理器的特征性操作而不是總的操作進(jìn)行描述。因此,下面將主要對指令譯碼塊100進(jìn)行解釋,而不對數(shù)據(jù)通路塊200進(jìn)行描述。
譯碼實例1在這個例子中,一個存儲在外存儲器從一個字節(jié)邊界開始的存儲單元中的一個5-半字節(jié)的指令由本微處理器進(jìn)行譯碼和執(zhí)行。
圖7A示出了指令的格式,它包括一個3-半字節(jié)基本指令和兩個1-半字節(jié)擴(kuò)充字。信號A至E分別代表構(gòu)成指令的1-半字節(jié)代碼。圖7B示出了當(dāng)指令存儲在外存儲器從一個字節(jié)開始的存儲單元中時,圖7A所示的指令的1-半字節(jié)代碼是如何定位的。注意,對基本指令字的1-半字節(jié)代碼的定位次序和對擴(kuò)充字的那些1-半字節(jié)代碼的定位次序是互不相同的。
圖7C示出了當(dāng)指令譯碼塊100讀出指令時,1-半字節(jié)代碼是如何存儲在IFB101、IB102和IR104以及在每個時鐘周期上的存儲單元110的狀態(tài)如何。IFB101、IB102和IR104構(gòu)成指令流水線。
在時鐘周期1,1-半字節(jié)代碼B和A被讀取到IFB101中。
在時鐘周期2,1-半字節(jié)代碼E和C被讀取到IFB101中,并且1-半字節(jié)代碼B和A被轉(zhuǎn)移到IB102中。注意,代碼的讀取和轉(zhuǎn)移是根據(jù)在每個時鐘周期從執(zhí)行單元108送出的指示來執(zhí)行的。在時鐘周期2存儲單元110的狀態(tài)是S2,因為先前的指令已經(jīng)被譯碼。
在時鐘周期3,控制單元109識別存儲單元110的狀態(tài)是S2,并從代碼長度判斷單元107接收下一個將被譯碼的代碼有一個字節(jié)的判斷。結(jié)果,控制單元109通過傳送一個選擇信號到SI103,指示SI103將存儲在IB102中的一個1-字節(jié)代碼轉(zhuǎn)移到IR104,并將狀態(tài)“S2”寫入存儲單元110。根據(jù)選擇信號的指示,SIH103a將存儲在IBL102b中的1-半字節(jié)代碼A傳送到IRH104b,SIL103b將存儲在IBH102a中的1-半字節(jié)代碼B傳送到IRL104b。
結(jié)果,IR104存儲1-半字節(jié)代碼A和B,然后這些1-半字節(jié)代碼被譯碼單元105譯碼。從第一1-半字節(jié)代碼A的譯碼結(jié)果,代碼長度判斷單元107判斷基本指令字有三個半字節(jié),接下來要被譯碼的代碼有一個半字節(jié),它是基本指令字的其余部分。
在時鐘周期4,控制單元109識別存儲單元110的狀態(tài)是S2,并從代碼長度判斷單元107接收下一個將被譯碼的代碼有一個半字節(jié)的判斷。結(jié)果,控制單元109通過傳送一個選擇信號到SI103,指示SI103將存儲在IBL102b中的一個1-半字節(jié)代碼轉(zhuǎn)移到IRL104b,并將狀態(tài)“S1”寫入存儲單元110。根據(jù)選擇信號的指示,SIH103a將存儲在IRL104b中的1-半字節(jié)代碼B傳送到IRH104a,SIL103b將存儲在IBL102b中的1-半字節(jié)代碼C傳送到IRL104b。
結(jié)果,IR104存儲1-半字節(jié)代碼B和C,然后這些1-半字節(jié)代碼被譯碼單元105譯碼。根據(jù)譯碼結(jié)果,執(zhí)行單元108經(jīng)由內(nèi)部總線B204將存儲在IFB101和IB102中的擴(kuò)充字D和E轉(zhuǎn)移到數(shù)據(jù)通路塊200。然后,經(jīng)過某些必要的數(shù)據(jù)處理后,指令的執(zhí)行被完成。
注意,在這個例子中,限定第一個1-半字節(jié)代碼A只傳達(dá)基本指令字有三個半字節(jié),還限定隨后的1-半字節(jié)代碼B和C有實質(zhì)性的指令,例如“將一個立即值加到寄存器d0中存儲的一個值中?!币虼耍瑘?zhí)行單元108根據(jù)1-半字節(jié)代碼B和C的譯碼結(jié)果執(zhí)行指令,并且不需要1-半字節(jié)代碼A和B的譯碼結(jié)果。
以這種方式,譯碼單元105對其輸入容量的1.5倍大的一個3-半字節(jié)基本指令正確地譯碼。
譯碼實例2在這個例子中,一個存儲在外存儲器從一個半字節(jié)邊界開始的存儲單元中的5-半字節(jié)的指令由本微處理器進(jìn)行譯碼和執(zhí)行。
指令的格式與譯碼實例1的相同。圖8A示出了當(dāng)指令存儲在外存儲器從一個半-字節(jié)開始的存儲單元中時,圖7A所示的指令的1-半字節(jié)代碼是如何定位的。
圖8B與譯碼實例1中的圖7C一樣,示出了指令流水線中的數(shù)據(jù)流。
在時鐘周期1,1-半字節(jié)代碼A被讀取到IFB101中。
在時鐘周期2,1-半字節(jié)代碼B和C被讀取到IFB101中,并且1-半字節(jié)代碼A被轉(zhuǎn)移到IB102中。在時鐘周期2存儲單元110的狀態(tài)是S1,因為前一條指令的最后1-半字節(jié)代碼已經(jīng)被存儲在外存儲器的起始于一個半-字節(jié)邊界的存儲單元中了。
在時鐘周期3,控制單元109識別存儲單元110的狀態(tài)是S1,并從代碼長度判斷單元107接收下一個將被譯碼的代碼有一個字節(jié)的判斷。結(jié)果,控制單元109通過傳送一個選擇信號到SI103,指示SI103將包含存儲在IFB101中的一個半字節(jié)和存儲在IB102中的另一個半字節(jié)的一個1-字節(jié)代碼轉(zhuǎn)移到IR104,并將狀態(tài)“S1”寫入存儲單元110。根據(jù)選擇信號的指示,SIH103a將存儲在IBH102a中的1-半字節(jié)代碼A傳送到IRH104b,SIL103b將存儲在IFBL101b中的1-半字節(jié)代碼B傳送到IRL104b。
結(jié)果,IR104存儲1-半字節(jié)代碼A和B,然后這些1-半字節(jié)代碼被譯碼單元105譯碼。從第一1-半字節(jié)代碼A的譯碼結(jié)果,代碼長度判斷單元107判斷基本指令字有三個半字節(jié),接下來要被譯碼的代碼有一個半字節(jié),它是基本指令字的其余部分。
在時鐘周期4,控制單元109識別存儲單元110的狀態(tài)是S1,并從代碼長度判斷單元107接收下一個將被譯碼的代碼有一個半字節(jié)的判斷。結(jié)果,控制單元109通過傳送一個選擇信號到SI103,指示SI103將存儲在IBH102a中的一個1-半字節(jié)代碼轉(zhuǎn)移到IRL104b,并將狀態(tài)“S2”寫入存儲單元110。根據(jù)選擇信號的指示,SIH103a將存儲在IRL104b中的1-半字節(jié)代碼B傳送到IRH104a,SIL103b將存儲在IBH102a中的1-半字節(jié)代碼C傳送到IRL104b。
結(jié)果,IR104存儲1-半字節(jié)代碼B和C,然后這些1-半字節(jié)代碼被譯碼單元105譯碼。根據(jù)譯碼結(jié)果,執(zhí)行單元108經(jīng)由內(nèi)部總線B204將存儲在IB102中的擴(kuò)充字D和E轉(zhuǎn)移到數(shù)據(jù)通路塊200。然后,經(jīng)過某些必要的數(shù)據(jù)處理后,指令的執(zhí)行被完成。
以這種方式,即使指令存儲在外存儲器從一個半-字節(jié)邊界開始的存儲單元中,本微處理器也能正確地譯碼和執(zhí)行指令。
轉(zhuǎn)移實例1在這個例子中,描述一條轉(zhuǎn)移指令的格式,以及當(dāng)程序轉(zhuǎn)移到外存儲器從一個半-字節(jié)邊界開始的存儲單元中時,本微處理器的操作。
圖9示出了無條件轉(zhuǎn)移指令“jmp”的格式。這條指令包括一個8位的基本指令字和16位的擴(kuò)充字,共計有6個1-半字節(jié)代碼。
對本處理器來說,16位并不足以對一條轉(zhuǎn)移指令指定一個轉(zhuǎn)移目標(biāo)地址,因為轉(zhuǎn)移目標(biāo)指令可以被存儲在外存儲器的起始于一個半-字節(jié)邊界的存儲單元中。也就是說,應(yīng)該由16位地址指定程序是轉(zhuǎn)移到存儲單元中的一個高位半字節(jié),還是低位半字節(jié)?;谶@樣的目的,可以考慮一個7-半字節(jié)指令,其中的另一個半字節(jié)用于指定一個轉(zhuǎn)移目標(biāo)地址。
然而,7-半字節(jié)指令會包括不必要的3位,從而增大代碼長度。
因此,指令“jmp”的基本指令字的最低有效位(LSB)被用于指示一條轉(zhuǎn)移目標(biāo)指令是否存儲在外存儲器的從一個字節(jié)邊界或一個半字節(jié)邊界開始的存儲單元中,如圖9所示。也就是說,限定用包括兩個字節(jié)的擴(kuò)充字和基本指令字的LSB的17位來指定一個轉(zhuǎn)移目標(biāo)地址。采用這種限定,無條件轉(zhuǎn)移指令“jmp”從7個1-半字節(jié)代碼被壓縮為6個1-半字節(jié)代碼。這防止了代碼中使用不必要的位。
下面描述當(dāng)指令“jmp”執(zhí)行時,本微處理器是如何運行的。
假定指令“jmp”已經(jīng)從外存儲器中取出并且在IFB101、IB102和IR104中存儲了1-半字節(jié)代碼。
譯碼單元105只將IR104中存儲的基本指令字的LSB的信息傳送到控制單元109。如果接受的信息是“1”,控制單元109將狀態(tài)“S1”寫入存儲單元110,如果是“0”,則將狀態(tài)“S2”寫入存儲單元110。
然后,譯碼單元105對存儲在IR104中的基本指令字的7個高位位譯碼,并向執(zhí)行單元108傳送指令是一條無條件轉(zhuǎn)移指令的判斷。當(dāng)接收到該判斷時,執(zhí)行單元108將IFB101和IB102中存儲的一個16位的轉(zhuǎn)移目標(biāo)地址傳送到數(shù)據(jù)通路塊200,并將地址輸出到外部地址總線212。結(jié)果,存儲在經(jīng)由外部地址總線212傳送的一個地址所指定的外存儲器的一個存儲元中存儲的指令以字節(jié)為單位被讀取到指令譯碼塊100。
當(dāng)指令的第一字節(jié)被傳送到IB102后,根據(jù)存儲單元110的狀態(tài),控制單元109控制SI103,因而在下一時鐘周期要被譯碼的一個代碼被確定。
更詳細(xì)地說,如果存儲單元110的狀態(tài)是S2,控制單元109指示SI103將存儲在IB102中的1-字節(jié)代碼傳送到IR104。該指示與譯碼實例1中時鐘周期3中所示的一樣,通過該指示存儲在外存儲器中起始于一個字節(jié)邊界的存儲單元中的一條指令被譯碼。也就是說,它等同于向該字節(jié)邊界的一次轉(zhuǎn)移。
另一方面,如果存儲單元110的狀態(tài)是S1,控制單元109指示SI103將包括存儲在IFB101中的一個半字節(jié)和存儲在IB102中的另一個半字節(jié)的1-字節(jié)代碼傳送到IR104。該指示與譯碼實例2中時鐘周期3中所示的一樣,通過該指示存儲在外存儲器中起始于一個半一字節(jié)邊界的存儲單元中的一條指令被譯碼。也就是說,它等同于向該半字節(jié)邊界的一次轉(zhuǎn)移。
以這種方式,完成了由3-字節(jié)無條件轉(zhuǎn)移指令“jmp”執(zhí)行的向一個字節(jié)邊界或一個半字節(jié)邊界的轉(zhuǎn)移。
轉(zhuǎn)移實例2下面描述當(dāng)一條轉(zhuǎn)移子程序指令(下面稱指令“jsr”)被執(zhí)行,并且當(dāng)該指令執(zhí)行后存儲在外存儲器起始于一個半字節(jié)邊界的存儲單元中的一條指令應(yīng)該被執(zhí)行時,本微處理器的運行狀況。
指令“jsr”是一條轉(zhuǎn)移指令,它在轉(zhuǎn)移執(zhí)行之前將指令“jsr”的地址之后的一個地址保存到由堆棧指針(SP)202a指定的一個存儲區(qū)域(下稱棧)。該保存地址也被稱為返回地址。指令“jsr”和用于指示子程序結(jié)束的一條返回指令結(jié)合使用。當(dāng)指令“jsr”被執(zhí)行時,一條返回指令也被執(zhí)行,然后存儲在棧中的返回地址被讀出,并且由返回地址指定的存儲單元中存儲的指令被執(zhí)行。
此時如轉(zhuǎn)移實例1中所述,如果指令被存儲在外部存儲器從一個半字節(jié)邊界開始的存儲單元中,那么至少需要17位來指定一個返回地址。因此用于指示一個返回地址的代碼需要3個字節(jié)。這意味著每次指令“jsr”或返回指令被執(zhí)行時,棧被存取3次。
由于對棧的存取次數(shù)增加,微處理器的吞吐量減小。特別是由C語言寫的程序頻繁訪問堆棧,這影響了微處理器的吞吐量。
本微處理器減小了編碼代碼長度。即使指令“jsr”是存儲在外存儲器起始于半字節(jié)邊界的存儲單元中,本微處理器能夠只用兩個字節(jié)指定一個返回地址。
指令“jsr”的格式與無條件轉(zhuǎn)移指令“jmp”的一樣,如圖9所示。也就是說,該指令包括一個8位的基本指令字和16位的擴(kuò)充字。轉(zhuǎn)移地址由基本指令字的LSB和16位擴(kuò)充字指定。因此不管程序轉(zhuǎn)移到外存儲器中的一個字節(jié)邊界或一個半字節(jié)邊界,執(zhí)行與轉(zhuǎn)移實例1相同的轉(zhuǎn)移。
下面參考圖10描述當(dāng)指令“jsr”被執(zhí)行時,本微處理器是如何執(zhí)行的。
圖10的流程圖示出了本微處理器在執(zhí)行指令“jsr”時的過程。
當(dāng)指令“jsr”的基本指令字存儲在IR104之后,字定位判斷單元106識別指令,通過參考存儲單元110的狀態(tài),判斷指令是否已存儲在外存儲器中從一個字節(jié)邊界或從一個半字節(jié)邊界開始的存儲單元中了,并將判斷結(jié)果傳送到執(zhí)行單元108(步驟S81)。
一旦接收到指令已經(jīng)存儲在起始于一個字節(jié)邊界的存儲單元中的判斷,執(zhí)行單元108識別指令的長度為6個半字節(jié)(步驟S82),在棧中保存接在指令地址之后的一個16位地址,并指定一個字節(jié)邊界(步驟S84)。圖11A示出了存儲在起始于一個字節(jié)邊界的存儲單元中的指令“jsr”和返回地址的關(guān)系。
另一方面,一旦接收到指令已經(jīng)存儲在起始于一個半字節(jié)邊界的存儲單元中的判斷,執(zhí)行單元108識別指令的長度為7個半字節(jié)(步驟S83),在棧中保存接在7-半字節(jié)指令地址之后的一個16位地址并指定該字節(jié)邊界(步驟S84)。詳細(xì)地說,執(zhí)行單元108從DECPC205讀出指令的一個地址,將該地址傳送到ALU208,通過假定指令長度為7個半字節(jié)來計算一個返回地址,并且控制相關(guān)部件,因而得到的返回地址被寫入堆棧。圖11B示出了存儲于從一個半字節(jié)邊界開始的存儲單元中的指令“jsr”和返回地址的關(guān)系。
當(dāng)返回地址被保存到堆棧之后,該微處理器與轉(zhuǎn)移實例1一樣運行。執(zhí)行單元108轉(zhuǎn)移到由指令的低位17位指定的一個子程序(步驟S85)。
以這種方式,無論指令“jsr”是存儲在外存儲器起始于一個字節(jié)邊界,還是半個字節(jié)邊界的存儲單元中,將要存儲在堆棧中的一個返回地址只需要兩個字節(jié)。
當(dāng)一條返回指令在子程序執(zhí)行結(jié)束后被執(zhí)行時,執(zhí)行單元108從堆棧讀出返回地址,將該地址存儲在ADB209,并且指示相關(guān)的部件執(zhí)行由返回地址指定的外存儲器存儲單元中存儲的一條指令。
為了實現(xiàn)上述操作,指令“jsr”和下一條指令必須根據(jù)上述操作被定位在外存儲器中。也就是說,當(dāng)指令“jsr”被存儲在外存儲器起始于一個半字節(jié)邊界的存儲單元中時,它應(yīng)該被認(rèn)為有7個半字節(jié)。這由一個被稱之為一個連接程序的地址分配程序進(jìn)行。連接程序的運行在此不作描述,因為它與本發(fā)明的主題不相關(guān)。
由上述描述可以理解,無論指令是存儲在起始于一個字節(jié)邊界,還是一個半字節(jié)邊界的外存儲器存儲單元中,本微處理器存儲只有兩個字節(jié)的一個返回地址。因此,處理時間被縮短。
注意,由本實施例限定的單元可以被改變。例如一個字可以有12位而不是8位。在這種情況下,指令譯碼塊100和數(shù)據(jù)通路塊200的部件將都被調(diào)節(jié)為處理12位,代碼也作相同的調(diào)節(jié)。
還要注意到,存儲單元110除了存儲IB102狀態(tài)之外,還可以存儲其它信息,例如存儲單元110可以存儲IFB101和IB102的狀態(tài)。通過這種安排,可以實現(xiàn)更特定的控制。
還要注意,指令流水線的級數(shù)不限于“3”,這在帶有級IFB101、IB102和IR104的本實施例中示出。
第二實施例(a)結(jié)構(gòu)圖12的方框圖示出了本發(fā)明第二實施例的微處理器的結(jié)構(gòu)。
該微處理器包括指令緩沖器1、指令寄存器2、驅(qū)動器3、ALU4、操作數(shù)地址緩沖器5、裝入緩沖器6、存儲緩沖器7、驅(qū)動器8、驅(qū)動器9、指令地址緩沖器10、指令讀取緩沖器11、譯碼器12、微指令寄存器13、狀態(tài)寄存器14、預(yù)取計數(shù)器15、增量器16、譯碼程序計數(shù)器17、執(zhí)行程序計數(shù)器18、寄存器組19、程序狀態(tài)字20、中斷接收單元21、選擇器23、選擇器24、選擇器25、內(nèi)部總線30、內(nèi)部總線31、內(nèi)部總線32、地址總線33、數(shù)據(jù)總線34、ROM35、RAM36、外圍電路37、通路41、通路42、通路43和通路44。
圖12中,ROM35和RAM36分別存儲指令和數(shù)據(jù)。另外,外圍電路37包括I/O設(shè)備,如記時器、串行端口等等。每個I/O設(shè)備被分配一個存儲器地址(被稱之為存儲變換I/O)。
指令緩沖器1(下稱IB1,如圖中所示)在一條指令被執(zhí)行之前,預(yù)存儲從ROM35中取出的該指令。
指令寄存器2(下稱IR2,如圖中所示)存儲將要由譯碼器12譯碼的一條指令。
驅(qū)動器3是用于將存儲在IB1中的數(shù)據(jù)輸出到B2 BUS 32的一個3態(tài)驅(qū)動器,詳細(xì)地說,如果絕對地址或操作數(shù)的值被存儲在IB1中,數(shù)據(jù)在微指令寄存器13的控制下被輸出。
由譯碼器12控制的ALU4執(zhí)行普通運算、地址運算等等。例如在地址計算中,如果帶有位移的一個間接地址由指令中的一個操作數(shù)指定,則ALU4用存儲在寄存器組19的一個地址寄存器中的值和存儲在IB1中的位移值計算目標(biāo)存儲地址,并將計算的地址輸出到操作數(shù)地址緩沖器5。如果絕對地址由一條指令中的操作數(shù)指定,則ALU4將絕對地址從IB1傳送到操作數(shù)地址緩沖器5。
操作數(shù)地址緩沖器5(下稱OAB5)是用于存儲一個目標(biāo)存儲地址的一個16位緩沖器。將被存取的存儲器是ROM35、RAM36和外圍電路37。
裝入緩沖器6(下稱LDB6)是用于存儲在OAB5中的目標(biāo)存儲器地址的存儲數(shù)據(jù)的一個16位緩沖器。
存儲緩沖器7(下稱STB7)是一個16位緩沖器,用于存儲將要寫入到由OAB5中存儲的地址指定的存儲器存貯單元中的數(shù)據(jù)。
驅(qū)動器8是一個3態(tài)驅(qū)動器,用于當(dāng)處理中斷時,在譯碼器12和MIR13的控制下,把存儲在OAB5中的數(shù)據(jù)傳送到A總線30。
驅(qū)動器9是一個3態(tài)驅(qū)動器,用于當(dāng)訪問存儲器時,在譯碼器12和MIR13的控制下,將存儲在OAB5中的數(shù)據(jù)輸出到地址總線33。也就是說,存儲在OAB5中的一個值被作為存儲器地址傳送到ROM35、RAM36和外圍電路37。
指令地址緩沖器10(下稱IAB10)存儲ROM35中的一個存儲單元的16位地址,在該存儲單元存儲了將要讀取的一條指令。
指令讀取緩沖器11(下稱IFB11)存儲從ROM35取出的一條16位指令。
譯碼器12將存儲在IR2中的指令和狀態(tài)寄存器14中的數(shù)據(jù)進(jìn)行譯碼,并輸出一條微指令來執(zhí)行該指令。
微指令寄存器13(下稱MIR13)相應(yīng)于從譯碼器12來的一條微指令輸出,傳送一個控制信號。
狀態(tài)寄存器14(下稱SR14)存儲用于譯碼指令的狀態(tài)標(biāo)志位。
預(yù)取計數(shù)器15(下稱PFC15)和增量器16構(gòu)成所謂的程序計數(shù)器,該計數(shù)器在譯碼器12的控制下,有序地產(chǎn)生將要讀取的指令的地址。
譯碼程序計數(shù)器17(下稱DECPC17)存儲處于指令譯碼階段的一條指令的地址。
執(zhí)行程序計數(shù)器18(下稱EXPC18)存儲處于指令執(zhí)行階段的一條指令的地址。
寄存器組19包括4個數(shù)據(jù)寄存器D0~D3、4個地址寄存器A0~A3和一個堆棧指針,每個都有16位。
程序狀態(tài)字20(下稱PSW20)存儲用于指示微處理器內(nèi)部狀態(tài)的標(biāo)志位。
中斷接收單元21接收中斷信號IPT0~I(xiàn)PT6,并根據(jù)接收的中斷信號的級輸出中斷級信號。中斷信號IPT0~I(xiàn)PT6表達(dá)從外部I/O設(shè)備傳來的中斷請求。具有任何優(yōu)先級IRQ0~I(xiàn)RQ6的一個中斷級信號請求譯碼器12根據(jù)該中斷級處理一個中斷。當(dāng)接收到一個不可屏蔽中斷(下稱NMI)時,中斷接收單元照原樣輸出NMI到譯碼器12。NMI是比中斷信號IPT0~I(xiàn)PT6優(yōu)先的一個中斷,并且不能被軟件屏蔽。
選擇器23有選擇地從內(nèi)部總線30、內(nèi)部總線32和ALU4的任何一個傳送數(shù)據(jù)到ALU4的一個輸入端口。
選擇器24有選擇地從內(nèi)部總線31和內(nèi)部總線32的任何一個傳送數(shù)據(jù)到ALU4的另一個輸入端口。
內(nèi)部總線30(下稱ABUS30)、內(nèi)部總線31(下稱B1BUS31)和內(nèi)部總線32(下稱B2BUS32)是微處理器的內(nèi)部總線。
下面解釋各個緩沖器的功能。圖13示出了緩沖器OAB5、LDB6、STB7、IAB10和IFB11是如何用于微處理器中的。
如圖中所示,OAB5保持了一個目標(biāo)RAM36地址,如箭頭j1所示。LDB6保持了由該目標(biāo)地址所指定的RAM36的存儲單元中讀出的數(shù)據(jù),如箭頭j3所示。STB7保持了將要寫入RAM36的同一存儲單元中的數(shù)據(jù),如箭頭j2所示。
另一方面,IAB10保持了一個目標(biāo)ROM35地址,如箭頭j4所示,以及IFB11保持了由該目標(biāo)地址所指定的ROM35中從存儲單元中讀出的數(shù)據(jù),如箭頭j5所示。
當(dāng)程序計數(shù)器被更新時,存儲在IAB10中的值也被更新,如虛框矩形j6和j7所示,也就是說,該值隨程序計數(shù)器的每次更新而更新。另一方面,當(dāng)計算出一個地址時,或者當(dāng)指定一個絕對地址時,如虛框矩形j8和j9所示,存儲在OAB5中的值被更新。也就是說,除非計算出一個地址或者指定一個絕對地址,否則該值不會被更新。
(b)PA尋址本微處理器使用將存儲在OAB中的值指定為目標(biāo)存儲地址的指令,在該文獻(xiàn)中這樣一種尋址方法被稱為先前地址(PA)尋址。
圖14A示出了用于PA尋址的LOAD指令和STORE指令的通用格式。
通過對指令中的操作數(shù)指定“(PA)”(助記符)完成對目標(biāo)存儲地址的說明。
如圖14A所示,LOAD/STORE指令的格式包括指示指令類型(LOAD指令、STORE指令等等)的字段d1、確定對機(jī)器語言碼的PA尋址的一位字段d2、用于確定寄存器組19的任何一個微據(jù)寄存器d0~d3的兩位字段d3。
字段d1確定指令是LOAD還是STORE,操作是否是加、減、乘、除或移位,以及指令是采用8位數(shù)據(jù)還是16位數(shù)據(jù)。
字段d2指示是否采用了PA尋址“1”表示“是”,“0”表示“否”。
字段d3指示其值被用作一個操作數(shù)的一個寄存器“00”代表寄存器D0,“01”代表D1,“10”代表D2,“11”代碼D3。
圖14B示出了PA尋址的LOAD指令,圖14C示出了STORE指令。
圖中的“LD(PA),Dn”指示了用于PA尋址的一條LOAD指令,盡管一條通用的LOAD指令從存儲器讀出數(shù)據(jù),并將該數(shù)據(jù)存儲到寄存器,但進(jìn)行PA尋址的一條LOAD指令以存儲在操作數(shù)地址緩沖器中的一個地址從存儲器的存儲單元讀出數(shù)據(jù)。
例如,在同一圖中,地址“0043”被存儲在操作數(shù)地址緩沖器中。如果操作數(shù)(PA)在LOAD指令中被確定,那么存儲在地址“0043”處的存儲單元中的數(shù)據(jù)被讀出,并被傳送到數(shù)據(jù)寄存器Dn,如虛線箭頭所示。
圖14C中的“ST Dn,(PA)”表示PA尋址的一條STORE指令。一條通用的STORE從寄存器讀出數(shù)據(jù),并將該數(shù)據(jù)存儲到存儲器的存儲單元中。而PA尋址的一條STORE指令將數(shù)據(jù)存儲到由OAB中存儲的一個地址指定的存儲器存儲單元中。
例如,在圖14C中,地址“0043”被存儲在OAB中。如果操作數(shù)(PA)在STORE指令中被指定,存儲在數(shù)據(jù)寄存器Dn中的數(shù)據(jù)被傳送到由地址“0043”確定的一個存儲器的存儲單元中,如虛線箭頭所示。
在圖15A和15B中,一個PA尋址程序(圖15A)與常規(guī)技術(shù)的程序(圖15B)進(jìn)行比較,后者取自圖2A和2B。注意這些程序指示微處理器讀出存儲在存儲器中的一個值,對該值進(jìn)行計算,并將該計算結(jié)果存入該存儲器。
圖15A示出了用PA尋址從/向一個存儲器讀出/寫入數(shù)據(jù)的一個程序,圖15B示出了用兩個絕對地址達(dá)到同樣目的的一個程序,圖15C示出了采用一個地址寄存器達(dá)到同樣目的的一個程序。
圖15A的程序通過指定一個絕對地址,將數(shù)據(jù)從存儲器轉(zhuǎn)移到寄存器。到目前為止,它與圖15B程序(指令a1和a2)是一樣的,然而,圖15B的程序又指定了一個絕對地址來將數(shù)據(jù)從寄存器轉(zhuǎn)移到存儲器(指令a3),圖15A的程序指定先前地址(PA)(指令a4)。因此,顯然當(dāng)程序由PA尋址編碼時,由虛線矩形a5所示的絕對地址的指定是不需要的。
下面對圖15A和圖15C進(jìn)行比較。圖15C的程序包括將一個絕對地址轉(zhuǎn)移到一個地址寄存器的指令b1、采用該地址寄存器的指令b2(它是一條LOAD指令),以及采用該地址寄存器的指令b4(它是一條STORE指令)。與此相反,圖15A的程序不包括采用地址寄存器的任何指令。
下面就代碼長度對這些指令進(jìn)行比較。圖15A的程序比圖15B的程序少兩個字節(jié),比圖15C的程序少一個字節(jié)。因此,顯然大量的從/向存儲器、外圍電路等的數(shù)據(jù)讀/寫可用較少的代碼長度來完成。
(c)運行下面描述第二實施例的微處理器的運行。假定運行程序包括下面所示的指令,其中指令(2)~(4)與圖15A的程序的三條指令一樣。
(1)LD(d8,An),Dn(2)LD(abs16),Dn(3)ADD Dm,Dn(4)ST Dn,(PA)(c)-1圖16和17的時序圖示出了圖12所示的部件的運行情況,假定指令“LD(An),Dn”在時間t1之前已經(jīng)被執(zhí)行。
在時間t1,OAB5保存存儲在地址寄存器An中的一個值“An”,它是包括在指令“LD(An),Dn”的源操作數(shù)中的一個地址值。另外,在時間t1,指令“LD(d8,An),Dn”的一個操作碼被從IB1傳送到IR2。該操作碼被譯碼器12譯碼。
在時間t2,一旦接收到被譯碼的操作碼,MIR13就送出一個控制信號,以便執(zhí)行地址計算“adr.calc”。MIR13將存儲在寄存器組19的一個地址寄存器中的值“An”輸出到ABUS30(箭頭y1)。MIR13指示驅(qū)動器3將存儲在IB1中的一個位移值(disp8)輸出到B2BUS32(箭頭y2)。
在時間t3,值“An”出現(xiàn)在ABUS30,并且B2BUS32有一個8位的位移值(disp8)。MIR13送出一個控制信號,使得一個選擇器(23或24)被切換到另一個選擇器,并且ALU4采用存儲在地址寄存器中的值和一個8位位移值(disp8)做加法運算。
在時間t4,MIR13送出一個控制信號,以便進(jìn)行“裝入”。然后加法運算的結(jié)果“An+disp8”從ALU4傳送到OAB5(箭頭y3)。
在時間t1到時間t4的過程中,OAB5保持先前的目標(biāo)存儲地址“An”,然后在時間t5保持“An+disp8”。
在時間t6,MIR13送出一個控制信號,以使得驅(qū)動器9將值“An+disp8”從OAB5轉(zhuǎn)移到地址總線33。MIR13還輸出一個控制信號,使得數(shù)據(jù)從RAM36裝入(箭頭y6)。結(jié)果由地址“An+disp8”指定的RAM36的存儲單元中存儲的數(shù)據(jù),經(jīng)由數(shù)據(jù)總線34被傳送到LDB6。然后該數(shù)據(jù)經(jīng)由選擇器25從LDB6傳送到寄存器組19的數(shù)據(jù)寄存器Dn中(箭頭y7)。
(c)-2在時間t5,指令“LD(abs16),Dn”的一個操作碼從IB1傳送到IR2,該操作碼被譯碼器12譯碼。
在時間t6,一旦接收到被譯碼的操作碼,MIR13送出一個控制信號以便執(zhí)行地址計算“adr.calc”。MIR13送出一個控制信號,使得驅(qū)動器3將一個16位的絕對地址(abs16)從IB1傳送到B2BUS32(箭頭y4)。結(jié)果該絕對地址經(jīng)由B2BUS32通過ALU4傳送到OAB5(箭頭y5)。
在時間t5到時間t8的過程中,OAB5保持指令“LD(d8,An),Dn”的目標(biāo)存儲地址“An+disp8”,然后在時間t9保持“abs16”。
在時間t9,MIR13送出一個控制信號,使得驅(qū)動器3將值“abs16”從OAB5轉(zhuǎn)移到地址總線33。MIR13還輸出一個控制信號,使得數(shù)據(jù)從RAM36裝入(箭頭y8)。結(jié)果由地址“abs16”指定的RAM36的存儲單元中存儲的數(shù)據(jù),經(jīng)由數(shù)據(jù)總線34被傳送到LDB6,然后該數(shù)據(jù)經(jīng)由選擇器25從LDB6傳送到寄存器組19的數(shù)據(jù)寄存器Dn中(箭頭y9)。
(c)-3在時間t9,指令“ADD Dm,Dn”的操作碼從IB1被傳送到IR2,該操作碼被譯碼器12譯碼。MIR13送出一個控制信號,使得數(shù)據(jù)從數(shù)據(jù)寄存器Dn被傳送到ABUS30和B2BUS32,然后ALU4采用該數(shù)據(jù)執(zhí)行一個運算。其結(jié)果經(jīng)由ABUS30被傳送到寄存器組19的數(shù)據(jù)寄存器Dn中(箭頭y10和y11)。
注意,在時間t9到時間t11,OAB5仍然保持“abs16”,因為在此期間存儲器沒有被存取。
(c)-4在時間t11,指令“ST Dn,(PA)”的一個操作碼從IB1被傳送到IR2,該操作碼被譯碼器12譯碼。此時指令“ST Dn,(PA)”的PA尋址位是“1”。一旦檢測到PA尋址位為“1”,譯碼器12指示MIR13送出一個控制信號,使得一個值被從寄存器Dn傳送到具有PA尋址的一個存儲器中。
在時間t13,MIR13送出一個控制信號,使得一個值從寄存器組19的寄存器Dn被經(jīng)由ABUS30傳送到STB7。然后MIR13送出一個控制信號,使得驅(qū)動器9從OAB5傳送一個值“abs16”到地址總線33(箭頭y12),但是不執(zhí)行地址計算。MIR13傳送一個控制信號,使得該數(shù)據(jù)被存儲在RAM36中。結(jié)果存儲在STB7中的一個值,被存儲在RAM36中由存儲在OAB5中的一個地址,即“abs16”指定的一個存儲單元中。
以這種方式,先前的目標(biāo)存儲地址被用在PA尋址方法中。
(d)中斷前面(c)中所作的描述是基于這樣的假設(shè),即存儲在OAB5中的值沒有被破壞。然而在實際運行中,這些值可能會被中斷破壞。本實施例對此準(zhǔn)備了防范措施,即圖18中所示的一條保存通路。
圖18是圖12的放大部分,該部分包括OAB5。如圖中的虛線所示,通路41、42、43、44和ABUS30構(gòu)成了保存通路,該通路用于將OAB5中的一個值保存到存儲器中。當(dāng)驅(qū)動器8被啟動時,該值通過保存通道被保存在存儲器的堆棧中。
下面參考圖19描述OAB5中存儲的值是如何被譯碼器12和MIR13通過保存通路保存到堆棧中的。圖19A示出了中斷被處理之前的堆棧。圖19B示出了中斷處理過程中的堆棧。
(d)-1NMI中斷當(dāng)中斷接收單元21接收一個NMI中斷時,譯碼器12指示MIR13送出一個控制信號,使得寄存器組19中的一個堆棧指針被更新(SP-6→SP)。更新之后,譯碼器12指示MIR13送出一個控制信號,使得驅(qū)動器設(shè)定保存通路。然后通過該保存通路把存儲在OAB5中的一個值被傳送到由堆棧指針指定的堆棧中的一個存儲單元(OAB5→(SP+4))。存儲在EXPC18中的一個值被傳送到堆棧(EXPC→(SP+2)),接下來是存儲在PSW20中的一個值送堆棧(PSW→(SP))。
圖19B示出了通過上述三個步驟將數(shù)據(jù)保存之后的堆棧。
由于已經(jīng)存儲了數(shù)據(jù)來處理中斷,因此NMI中斷的起始地址被保存在IAB10和PFC15中。
下面描述被保存的數(shù)據(jù)是如何恢復(fù)的。
首先,存儲在堆棧的第一存儲單元的值被傳送到PSW20((SP)→PSW)。然后存儲在第二存儲單元中的值被傳送到程序計數(shù)器18((SP+2)→EXPC)。最后存儲在第三存儲單元中的值,經(jīng)由ABUS30和ALU4被傳送到OAB5((SP+4)→OAB5)。
(d)-2IRQn中斷IRQn中斷的處理與NMI中斷的處理大致一樣,只有以下兩點不同(1)中斷級被寫入PSW20的IMSK字段;(2)基于IRQn的級n得到一個中斷目標(biāo)地址。
從上面的描述,很顯然,具有PA尋址的第二實施例的微處理器在沒有絕對尋址的情況下,訪問一個存儲器,并且能夠在不采用地址寄存器的情況下從/向存儲器讀出/寫入數(shù)據(jù)。另外,即使對存儲變換I/O中的I/O端口有許多次I/O訪問,地址寄存器也不會被占據(jù)。因此,第二實施例的微處理器可以有效地使用地址寄存器。
第三實施例第三實施例與包括若干操作數(shù)地址緩沖器(OAB)的微處理器相關(guān)。包括這些OAB的塊被稱為OAB陣列。
圖20示出了第三實施例的OAB陣列。該OAB陣列包括OAB50~54,以及輸入選擇器60。圖20中的OAB50與OAB5的構(gòu)造相同,其后跟隨的4個緩沖器(OAB51~54)與OAB5的構(gòu)造也相同。這5個緩沖器分別存儲先前的目標(biāo)存儲地址,達(dá)到以前地址的五倍。
輸入選擇器60根據(jù)接收的OABSEL信號63有選擇地輸出存儲在OAB50~54中的一個值。
OABSFT信號61是用于移位存儲在OAB陣列中的數(shù)據(jù)的一個控制信號。當(dāng)該控制信號被輸出時,存儲在OAB50~54中的值被向下移位到下一個OAB。然后存儲在最后的OAB54中的值被廢除。當(dāng)譯碼器12對一條LOAD指令或一條STORE指令譯碼時,OABSFT信號61被MIR13輸出。因此,每次譯碼器12譯碼一條LOAD指令或STORE指令,存儲在OAB陣列中的數(shù)據(jù)就被移位一次。
OABW信號62是用于將數(shù)據(jù)從ALU4傳送到OAB50的一個控制信號。當(dāng)先前的數(shù)據(jù)通過輸出OABSFT信號61被移位到OAB51后,每當(dāng)OAB50接收OABW信號62時,它就保持從ALU4輸出的一個目標(biāo)存儲地址。
OABSEL信號63包括指定OAB50~54中的任意一個的信息。選擇器60從指定的OAB輸出一個值。
在第三實施例中,采用一個操作碼來確定OAB陣列中的一個OAB。下面參考圖21A和21B來描述第三實施例的PA尋址。圖21A示出了用于PA尋址的指令的格式。圖21B示出了用于PA尋址的STORE指令的助記符。
如圖21A所示,用于PA尋址的指令包括指示指令類型(LOAD指令、STORE指令等等)的字段d1、確定機(jī)器語言代碼的PA尋址的字段d2(1位)、在寄存器組19的D0~D3中確定一個數(shù)據(jù)寄存器的兩位字段d3、用“0”和“1”指定OAB50或OAB51至54中的任意一個的字段d4(1位)、確定OAB51至54中的任意一個的字段d5(2位)。
字段d4用“0”指定OAB50,用“1”指定OAB51至54中的任意一個。
字段d5用“00”指定OAB51,用“01”指定OAB52,用“10”指定OAB53,用“11”指定OAB54。
如圖21B所示,在助記符中,“(PA)”說明示PA尋址,“(PA1)”說明PA尋址并且指示存儲在OAB51中的一個值被用作目標(biāo)存儲地址。與此類似,“(PA2)”相關(guān)于OAB52,“(PA3)”相關(guān)于OAB53,“(PA4)”相關(guān)于OAB54。
圖22示出了采用PA尋址的一個程序,該PA尋址確定了OAB陣列的一個OAB,并且還示出了程序?qū)AB陣列的操作。
(1)指令“LD(adr1),D0”IB1存儲“LD(adr1),D0”?!癓D(adr1),D0”的操作碼從IB1被傳送到IR2,并進(jìn)一步到譯碼器12。譯碼器12對該操作碼譯碼。由于操作碼指示一條LOAD指令,因此譯碼器12指示MIR13輸出OABSFT信號61。一旦接收到OABSFT信號61,OAB陣列就對數(shù)據(jù)移位,并且MIR13將“adr1”輸出到OAB50。地址“adr1”是指令“LD(adr1),D0”的一個源操作數(shù),它被經(jīng)由ALU4傳送到OAB50。MIR13輸出OABSEL信號63并且地址“adr1”被輸出到地址總線33。然后允許從RAM36裝入數(shù)據(jù)。存儲在地址“adr1”中的一個值被經(jīng)由數(shù)據(jù)總線34從RAM36裝載到LDB6。然后該值被存儲在寄存器組19的數(shù)據(jù)寄存器Dn中。
(2)指令“ST D0,(adr2)”
IB1存儲“ST D0,(adr2)”?!癝T D0,(adr2)”的操作碼從IB1被傳送到IR2,并進(jìn)一步到譯碼器12。譯碼器12對該操作碼譯碼。由于操作碼指示一條STORE指令,因此譯碼器12指示MIR13輸出OABSFT信號61。一旦接收到OABSFT信號61,OAB陣列就對數(shù)據(jù)移位,并且地址“adr1”被從OAB50移位到OAB51。地址“adr2”是指令“ST D0,(adr2)”的一個目地操作數(shù),它被經(jīng)由ALU4傳送到OAB50。由于指令的操作數(shù)沒有確定PA尋址,因此“adr2”被OABSEL信號63從OAB50輸出到地址總線33。由于這是一條STORE指令,存儲在寄存器組19的數(shù)據(jù)寄存器Dn中的一個值被通過B2BUS32傳送到STB7。當(dāng)該值被存儲在STB7中之后,MIR13發(fā)出一個控制信號到RAM36,以允許向RAM36存儲數(shù)據(jù)。然后該值被從STB7傳送到RAM36中由地址“adr2”指定的一個存儲單元。
(3)指令“LD(adr3),D0”IB1存儲“LD(adr3),D0”?!癓D(adr3),D0”的操作碼從IB1被傳送到IR2,并進(jìn)一步到譯碼器12。譯碼器12對該操作碼譯碼。由于操作碼指示一條LOAD指令,因此譯碼器12指示MIR13輸出OABSFT信號61。
一旦接收到OABSFT信號61,OAB陣列就對數(shù)據(jù)移位。地址“adr1”從OAB51被移位到OAB52,并且地址“adr2”從OAB50被移位到OAB51。地址“adr3”是指令“LD(adr3),D0”的一個源操作數(shù),它被經(jīng)由ALU4傳送到OAB50。由于指令的操作數(shù)并不指定PA尋址,“adr3”被OABSEL信號63從OAB50輸出到地址總線33。MIR13送出一個控制信號,允許從RAM36裝入數(shù)據(jù)。然后存儲在RAM36中由地址“adr3”指定的存儲單元中的一個值被經(jīng)由數(shù)據(jù)總線34裝載到LDB6。該值被存儲在寄存器組19的數(shù)據(jù)寄存器Dn中。
(4)指令“ADD D0,D1”IB1存儲“ADD D0,D1”?!癆DD D0,D1”的一個操作碼被從IB1傳送到IR2,再進(jìn)一步到譯碼器12。譯碼器12對該操作碼譯碼。由于該操作碼表示ADD操作,因此譯碼器12不命令MIR13輸出OABSFT信號61。
譯碼器12命令A(yù)LU4采用存儲在寄存器D0和D1中的值,即“adr1”和“adr3”執(zhí)行一個運算。由于寄存器D1在指令“ADD D0,D1”中被確定為一個目的地,因此譯碼器12將運行結(jié)果存在寄存器D1中。
(5)指令“ST D1,(PA2)”
“ST D1,(PA2)”的一個操作碼被存儲在IR2。譯碼器12對該操作碼進(jìn)行譯碼。由于該操作碼確定PA尋址以及OAB52。譯碼器12將OABSEL信號63傳送到選擇器60,使得輸出目的地從OAB50改變到OAB52。由于這是一條STORE指令,一個值被從寄存器組19中的數(shù)據(jù)寄存器D1經(jīng)由B2BUS32傳送到STB7。當(dāng)該值被存儲在STB7中之后,MIR13輸出一個控制信號到RAM36,以允許向RAM36存儲數(shù)據(jù)。然后該值被從STB7傳送到由地址“adr2”確定的RAM36的一個存儲單元中,該地址被存儲在OAB52(圖22中的陰影框)中,如虛線箭頭所示。
(6)中斷與第二實施例一樣,存儲在OAB50~54中的數(shù)據(jù)在中斷發(fā)生時應(yīng)該被保存起來。下面參考圖23描述數(shù)據(jù)是如何保存的。圖23A示出了在第三實施例中處理中斷之前的堆棧。圖23B示出了在第三實施例中處理中斷過程中的堆棧。
當(dāng)中斷接收單元21接收一個NMI中斷時,譯碼器12更新中斷指針(SP-14→SP)。
更新之后,譯碼器12啟動驅(qū)動器8為OAB50設(shè)置保存通路。譯碼器12向輸入選擇器60發(fā)送指定OAB50的OABSEL信號63,以使得存儲在OAB50中的一個值被輸出,該值經(jīng)由ABUS30傳送到STB7,然后傳送到堆棧。
當(dāng)數(shù)據(jù)從OAB50輸出之后,譯碼器12向輸入選擇器60送出指定OAB51的OABSFT信號61,以使得存儲在OAB51中的值被輸出。該值被類似的經(jīng)由驅(qū)動器9-ABUS30-STB7的保存通路被傳送到堆棧。然后譯碼器12按次序向輸入選擇器60傳送指定OAB52、53和54的控制信號,以使得存儲在OAB中的值被傳送到堆棧。
當(dāng)存儲在OAB陣列中的數(shù)據(jù)被保存之后,存儲在EXPC18的數(shù)據(jù)也被保存(EXPC→(SP+2)),存儲在PSW20中的數(shù)據(jù)也被保存(PSW→(SP)),并且控制移到中斷目標(biāo)地址。當(dāng)上述處理結(jié)束后,如圖23A所示的堆棧的內(nèi)容被改變到如圖23B所示的內(nèi)容。IRQn中斷的處理與NMI中斷的處理基本相同,但有以下區(qū)別(1)中斷級被寫入PSW20的IMSK字段;(2)根據(jù)IRQn的級n得到一個中斷目標(biāo)地址。
反過來進(jìn)行上述步驟,即可將保存的數(shù)據(jù)恢復(fù)。
從上面的描述,很顯然第三實施例的微處理器有選擇地采用先前的存儲器存取,并且減小了地址寄存器被占用的幾率以及代碼長度。
(7)第三實施例的應(yīng)用在第三實施例中,存儲在OAB陣列中的數(shù)據(jù),在每次執(zhí)行一條LOAD指令或STORE指令時被移位。然而這種安排對STORE指令的執(zhí)行可能是不需要,因為很少會將數(shù)據(jù)重復(fù)存儲在同一個存儲單元。
下面參考圖24描述第三實施例對這樣一種情況的應(yīng)用。
在第三實施例的上述例子中,當(dāng)指令“ST D0,(adr2)”被執(zhí)行時,地址“adr1”從OAB50移位到OAB51。然而,當(dāng)指令“ST D0,(adr2)”被譯碼時,OABSEL信號63沒有被輸出。因此,當(dāng)指令“ST D0,(adr2)”被執(zhí)行后,OAB50仍然保持地址“adr1”。當(dāng)指令“LD(adr3),D1”被執(zhí)行時,地址“adr1”從OAB50移位到OAB51。然后OAB50保持地址“adr3”。
指令“ADDD0,D1”被執(zhí)行后,指令“STD1,(PA1)”的操作碼被保存。由于該操作碼指定PA尋址,譯碼器12將OABSEL信號63傳送到輸入選擇器60,以使得數(shù)據(jù)輸出目標(biāo)從OAB50切換到OAB51。由于OAB51存儲地址“adr1”,該地址被輸出到地址總線33。MIR13傳送一個控制信號以允許從RAM36裝載數(shù)據(jù)。結(jié)果,由存儲在OAB51中的地址指定的RAM36的存儲單元中存儲的值被經(jīng)由數(shù)據(jù)總線34裝載到LDB6。然后,該數(shù)據(jù)被傳送到寄存器組19的數(shù)據(jù)寄存器Dn中。
只要保持其內(nèi)在特征,本發(fā)明可以有多種形式的應(yīng)用。例如指令可以向OAB中存儲的一個值指定一個相對地址。
另外,加、減或移位運算指令的操作數(shù)可以指定存儲在OAB中的一個值。
在第三實施例中串行連接的OAB50~54可以并行連接。OAB陣列中的OAB數(shù)量例如也可以增加到9,10,...,等等,或者減小到2,3,或4。
雖然本發(fā)明是結(jié)合附圖以實例的形式來描述的,但對本領(lǐng)域的技術(shù)人員來說,可以作各種改進(jìn)和變化。因此,只要這些改進(jìn)和變化不偏離本發(fā)明的范圍,它們應(yīng)該被包括在本發(fā)明中。
權(quán)利要求
1.一種用于支持代碼長度減小的微處理器,包括一個操作數(shù)地址緩沖器,用于保持目標(biāo)存儲器存取地址,其中所述操作數(shù)地址緩沖器與一個外部存儲器相連,并且所述目標(biāo)存儲器存取地址已被所述微處理器用于立即處理對所述外部存儲器的存??;一個用于取指令的取指裝置;一個指令檢測裝置,用于檢測已被所述取指裝置取出并準(zhǔn)備訪問所述外部存儲器的一條指令;一個判斷裝置,用于判斷由所述指令檢測裝置檢測的所述指令是否指定存儲在所述操作數(shù)地址緩沖器中的所述目標(biāo)存儲器存取地址;一個第一控制裝置,用于控制所述操作數(shù)地址緩沖器,使得如果當(dāng)所述判斷裝置判定由所述指令檢測裝置檢測的所述指令指定所述目標(biāo)存儲器存取地址,則所述地址緩沖器被輸出到所述外部存儲器;一個第二控制裝置,用于將從指令檢測裝置檢測的所述指令的一個操作數(shù)中得到的地址存入所述操作數(shù)地址緩沖器,并且控制所述操作數(shù)地址緩沖器,使得如果所述判斷裝置判定所述指令不指定存儲在所述操作數(shù)地址緩沖器中的所述目標(biāo)存儲器存取地址,則所述被存儲的地址被輸出到所述外部存儲器。
2.根據(jù)權(quán)利要求1所述的微處理器,其特征在于,進(jìn)一步包括一個中斷檢測裝置,用于檢測一個中斷處理的開始和結(jié)束;一個保存裝置,用于當(dāng)所述中斷檢測裝置檢測到一個中斷處理的開始時,從所述操作數(shù)地址緩沖器保存一個地址到一個堆棧;一個恢復(fù)裝置,用于當(dāng)所述中斷檢測裝置檢測到所述中斷處理的結(jié)束時,從所述堆?;謴?fù)所述地址到所述操作數(shù)地址緩沖器。
3.一種用于支持編碼長度減小的微處理器,包括一個用于包括對n個操作數(shù)地址緩沖器重復(fù)使用的緩沖器陣列,這些緩沖器分別將從一個立即處理的目標(biāo)存儲器存取地址至n倍于在過去對所述外部存儲器的先前存取中使用的目標(biāo)存儲地址的地址存儲起來,其中n是2或大于2的整數(shù),并且其中所述緩沖器陣列與一個外部存儲器相連接;一個用于取指令的取指裝置;一個指令檢測裝置,用于檢測已被所述取指裝置取出并準(zhǔn)備訪問所述外部存儲器的一條指令;一個判斷裝置,用于判斷由所述指令檢測裝置檢測的所述指令是否指定任何一個所述操作數(shù)地址緩沖器;一個第一控制裝置,用于控制所述緩沖器陣列,使得如果所述判斷裝置斷定由所述指令檢測裝置檢測的所述指令指定所述操作數(shù)地址緩沖器,則所述地址緩沖器被輸出到所述外部存儲器;一個第二控制裝置,用于將從指令檢測裝置檢測的所述指令的一個操作數(shù)中得到的地址存入任何一個所述操作數(shù)地址緩沖器,并且控制所述緩沖器陣列,使得如果所述判斷裝置判定所述指令不指定任何一個操作數(shù)地址緩沖器,則所述存儲地址被輸出到所述外部存儲器。
4.根據(jù)權(quán)利要求3所述的微處理器,其特征在于,所述第二控制裝置包括一個第一子控制裝置,用于控制所述緩沖器陣列,使得所述指令檢測裝置每次監(jiān)測到一條指令,存儲在每個操作數(shù)地址緩沖器中的每個地址被移位到下一個操作數(shù)地址緩沖器;一個第二子控制裝置,用于控制所述緩沖器陣列,使得在所述第一子控制裝置的所述地址移位完成之后,從由所述取指裝置取出的一條指令的一個操作數(shù)中得到的一個地址被存儲在第一操作數(shù)地址緩沖器中;一個第三子控制裝置,用于控制所述緩沖器陣列,使得由所述第二子控制裝置存儲的所述地址被輸出到所述外部存儲器。
5.根據(jù)權(quán)利要求4所述的微處理器,其特征在于,進(jìn)一步包括一個中斷檢測裝置,用于檢測一個中斷處理的開始和結(jié)束;一個保存裝置,用于當(dāng)所述中斷檢測裝置檢測到一個中斷處理的開始時,從所述n個操作數(shù)地址緩沖器保存所述n個地址到一個堆棧;一個恢復(fù)裝置,用于當(dāng)所述中斷檢測裝置檢測到一個所述中斷處理的結(jié)束時,從所述堆?;謴?fù)所述n個地址到所述n個操作數(shù)地址緩沖器。
全文摘要
提供一臺支持對編碼長度減小的微處理器,其中指令從一個基本的一字代碼以0.5字為單位擴(kuò)展。從外部存儲器取出的指令的一個字經(jīng)由以半字為單位運行的指令緩沖器和選擇器轉(zhuǎn)移到譯碼寄存器,然后被譯碼器譯碼。一個存儲單元存儲指令緩沖器中存儲的一條指令的狀態(tài)。一個控制單元根據(jù)譯碼器的指示和存儲單元中存儲的狀態(tài)控制選擇器,因而指令以半字為單位從指令緩沖器轉(zhuǎn)移到譯碼寄存器。
文檔編號G06F9/318GK1492318SQ0215749
公開日2004年4月28日 申請日期1996年5月31日 優(yōu)先權(quán)日1995年5月31日
發(fā)明者松崎敏道, 出口雅士, 濱口敏文, 多那瀨寬, 松本政彥, 士, 寬, 彥, 文 申請人:松下電器產(chǎn)業(yè)株式會社