指令集及流水線基本概念

1地址總線、數據總線和機器字長

1.1 數據總線

數據總線DB(DataBus)用於傳送數據信息。數據總線是雙向三態形式的總線,即它既可以把CPU的數據傳送到存儲器或輸入輸出接口等其它部件,也可以將其它部件的數據傳送到CPU。

1.2 地址總線

地址總線AB(Address Bus;又稱位址總線) 屬於一種電腦總線 (一部份),是由CPU 或有DMA 能力的單元,用來溝通這些單元想要存取(讀取/寫入)電腦內存元件/地方的實體位址。

地址總線AB是專門用來傳送地址的,由於地址只能從CPU傳向外部存儲器或I/O端口,所以地址總線總是單向三態的,這與數據總線不同。地址總線的位數(寬度)決定了CPU可直接尋址的內存空間大小,即決定有多少的內存可以被存取。

1.3 機器字長

機器字長是指CPU一次處理數據的寬度,我們通常所說的“32位CPU”、“64位CPU”中的“32”、“64”就是機器字長。機器字長主要由運算器、寄存器決定,通常寄存器長度等於機器字長。如32位處理器,每個寄存器能存儲32bit數據,加法器支持兩個32bit數據進行相加。

目前嵌入式處理器大都以32位爲主,32位處理器的地址總線通常都是32位,可尋址範圍是4Gbyte,地址總線越寬,可尋址範圍越大。通常數據總線的帶寬都要高於機器字長,32位處理器很多都採用64bit、128bit的數據帶寬,這樣可以一次讀取更多的數據。

2 機器語言和指令集

2.1 機器語言

語言主要包括以下要素:

1.詞彙。一個詞彙代表一個意象片段,每個詞彙與某事物一一對應。

2.語法。包括格式、結構和規則。

3.語句。詞彙按照一定的語法規則有機組合形成語句。

4.語義。亦即動機性,即維特根斯坦說的語言中訓練的部分。它包括詞彙的表意和語句的含義,表達信息或操作命令。

CPU不認識彙編語言,更不認識C/C++等高級語言,它只認識機器語言。計算機數字邏輯電路只認識以高低電平或者開關通斷狀態信號來量化的二進制0和1,因此機器語言都是基於二進制的編碼序列。

在遠古時代,只能使用機器語言編程。當程序需要被運行時,程序員需要將他寫的程序寫入到存儲設備上,最原始的存儲設備就是紙帶,即在紙帶上打相應的孔。每個孔代表一位,穿孔表示0,未穿孔表示1,這些孔序列彙編成機器語言,由譯碼器(掃描器)識別。計算機運算完畢,需要人工翻譯結果。

二進制機器碼太難記了,可以想見打孔編程的工作是多麼的枯燥和乏味。於是人們發明了彙編語言,使用人類語言的單詞作爲助記符與機器碼建立一一對應關係。彙編器維護了這張映射表,並在彙編階段將彙編代碼翻譯成指令機器碼。從大的方面講,彙編是相當簡單的,它只是使用助記符號替代對應的機器碼元。

下表列出了MIPS32中彙編指令add/and與機器碼的對應關係。

ASM
31-26
25-21
20-16
15-11
10-6
5-0
add d,s,t
0
s
t
d
0
32
and d,s,t
0
s
t
d
0
36

MIPS有32個通用寄存器(編碼佔5bit),所有指令都是32位(無Intelx86那樣的可變長指令),3操作數運算指令的操作數只能是寄存器。

“add d,s,t”和“and d,s,t”都屬於3寄存器算術/邏輯運算指令組,域31-26爲6位長的主操作碼“op”,add和and共享op域,都爲0;域5-0爲子操作碼域,用於區分add(32)和and(36)。25-21爲第一個源操作數寄存器s的編碼;20-16爲第二個源操作數寄存器t的編碼;15-11爲目的操作數寄存器d的編碼。

2.2 指令集

在機器語言中,指令就是一個語句。指令格式爲“操作碼域+操作數域”,操作碼域指明瞭指令的操作性質及功能,操作數域則給出了操作數或操作數的地址。操作碼和操作數是機器可識別的詞彙,包括“操作命令”、“內存地址”、“字節”、“寄存器”,它們組合在一起的機器指令體現語義。不同類型的操作命令和操作數,具有不同的組合表現形式。

指令集(IA:InstructionSet)是指CPU指令系統所能識別(翻譯)執行的全部指令的集合。處理器要完成計算任務,需要具備以下幾種指令類型

(1)運算指令

運算由運算器單元(ALU)實現,指令包括算術運算指令、邏輯運算指令和移位指令。

算術運算指令實現加減乘除(+-*/)等基本的算術運算;邏輯運算指令實現與或非(&|~)等基本的邏輯運算;移位指令實現二進制比特位(bit)的左右移(<<>>)運算。

(2)控制指令

除了做計算外,CPU還要實現循環。循環是由跳轉指令實現的,跳回去執行就是循環。循環在一定條件下跳出,否則就成死循環了,條件跳轉指令能完成這個功能。條件跳轉指令在一定條件下實現跳轉,它能實現分支功能。跳轉指令也稱爲控制指令。控制由CPU控制器單元實現。

(3)數據傳送指令

運算和控制指令的操作數從哪裏來的呢?操作數都放在存儲器中。在x86 IA中,運算指令的操作數既可以是寄存器,也可以是存儲器;而在其他RISCIA例如MIPS中,運算指令的操作數只能是寄存器,因此需要先使用加載(load)指令將存儲器中的數據導入到寄存器中,運算完成後,再用存儲(store)指令將寄存器中的運算結果數據導出到存儲器中。這類指令就是數據傳送指令

有了這三類指令,CPU就能完成各種複雜的運算。

2.3 CISC和RISC

處理器的指令集可簡單分爲兩種:複雜指令集(CISC,Complex InstructionSet Computer)和精簡指令集(RISC,Reduced Instruction Set Computer)。

(1)指令集的演進

一開始的處理器都是CISC架構,隨着時間的演進,有越來越多的指令集加入。採用複雜指令系統的計算機有着較強的處理高級語言的能力,這對提高計算機的性能是有益的。當計算機的設計沿着這條道路發展時,有些人沒有隨波逐流,他們回過頭去看一看過去走過的道路,開始懷疑這種傳統的做法:IBM公司設在紐約Yorktown的JhomasI.Wason研究中心於1975年組織力量研究指令系統的合理性問題。因爲當時已感到,日趨龐雜的指令系統不但不易實現,而且還可能降低系統性能。

1979年以帕特遜教授爲首的一批科學家也開始在美國加冊大學伯克萊分校開展這一研究,結果表明,CISC存在許多缺點。首先,在這種體系架構中,各種指令的使用頻率相差懸殊:一個典型程序的運算過程所使用的80%指令只佔一個處理器指令系統的20%,剩餘80%的指令則只佔整個程序的20%。事實上最頻繁使用的指令是取、存和加這些最簡單的指令。於是帕特遜教授提出了精簡指令集的理念,主張指令系統應當只包含那些使用頻率很高的少量指令較爲複雜的指令則利用常用的簡單指令去組合。按照這個原則發展而成的計算機被稱爲精簡指令集計算機(Reduced Instruction Set Computer)結構,簡稱RISC。

設計理念上,RISC的設計重點在於降低由硬件執行指令的複雜度,因爲軟件比硬件容易提供更大的靈活性和更高的智能,因此RISC設計對編譯器有更高的要求;CISC的設計則更側重於硬件執行指令的功能,使CISC的指令變得很複雜。總之RISC對編譯器的要求高,CISC強調硬件的複雜性,CPU的實現更復雜。CISC提供了很多微碼支持,使得彙編程序的工作量減少,而RISC完成同樣的操作則需要更多的指令。

(2)RISC與CISC的比較

<1>指令集——RISC處理器減少指令集的種類,只提供固定長度的簡單指令,大多都在四五個週期內完成,通常一個週期執行一條指令。

<2>寄存器——RISC的寄存器擁有更多的通用寄存器,寄存器操作較多,例如MIPS提供了32個通用寄存器,ARM提供了27個通用寄存器,CISC的寄存器都是用於特定目的的。

<3>內存訪問——處理器只處理寄存器中的數據,運算指令的操作數只能是寄存器。這是因爲訪問存儲器很耗時,同時對外部存儲器的讀寫會影響其壽命;CISC能夠在存儲器中直接運行。對內存變量的直接訪存不利於流水線實現,因此RISC沒有實現可以操作內存變量的指令。RISC內存引用總是通過load指令將內存變量加載到寄存器,通過store指令將寄存器中的值寫回到內存,大型寄存器堆使得這不會成爲一個大問題。

<4>簡化的尋址方式——RISC不像CISC那樣的複雜衆多的尋址方式。例如MIPS只有一種數據尋址模式,幾乎所有的加載和存儲的內存地址都是通過單個基址寄存器的值加上一個16位的有符號偏移量來選擇。

<5>高效的流水線特性——流水線的本質就是CPU並行運行,只是並行運行不像FPGA中的那麼直接,它只是把一條指令分成幾個更小的執行單元;CISC指令的執行需要調用一個微碼,明顯沒有RISC的指令吞吐量大。

固定的指令長度、大型寄存器堆和load/store結構可充分發揮流水線特性。在並行處理方面RISC明顯優於CISC,RISC可同時執行多條指令,它可將一條指令分割成若干個進程或線程,交由多個處理器同時執行。由於RISC執行的是精簡指令集,所以它的製造工藝簡單且成本低廉。

<6>子程序調用——在CISC中,程序調用返回時需要將上下文保存到堆棧中,push/pop指令需要訪問內存操作;而RISC沒有提供push/pop支持,將它們存放在寄存器中,而且參數也是用寄存器傳遞。RISC中斷可視爲特殊的子程序調用:CISC發生中斷時,所有的寄存器內容都被壓入堆棧中,而RISC對中斷進行區分對待,分爲輕量級重量級。對於輕量級中斷只保存需要保存的寄存器內容;對於重量級中斷的處理如同常規中斷。

<7>RISC的缺點——代碼密度不高,可執行文件體積較大,彙編代碼可讀性差。代碼密度不高是值得關注的問題:若不使用cache,會需要更大的指令存儲控件,取指時也佔用更大的內存帶寬;若採用cache,又會降低cache的命中率。而從CPU的設計上來講,由於RISC的核心代碼要少很多,使得其結構相應簡化,因此在體積、造價、功耗、散熱和價格上都具有優勢。

<8>CISCRISC的融合演進

從以上的比較來看,RISC與CISC各有千秋,由於RISC具有更強的實用性,故應該是未來處理器的發展方向。但事實上,當今時代wintel一統江湖,且早期很多軟件都是根據CISC設計的,單純的RISC將無法兼容。此外,現代CISC結構的CPU已經融合了很多RISC的成分,其性能差距已經越來越小。複雜指令可以提供更多的功能,這是程序設計所需要的。例如ARM提供了DSP& SIMD擴展:增強型DSP指令(E變種)和媒體功能擴展(SIMD變種)。因此,CISC與RISC的融合應該是未來的發展方向。

(3)指令集的五朵金花

處理器公司很多,品牌也很多,而指令集則相對穩定,用指令集對處理器公司分類是比較常見的做法。有5種指令集最爲常見,它們構成了處理器領域的5朵金花。

<1>x86——碩大的大象

Intel x86是經典的CISC體系結構,它是史上最賺錢的指令集,幾乎所有的個人計算機都使用Intel x86指令集的處理器。

英特爾的鐘擺策略:在奇數年,英特爾將會推出新的工藝;而在偶數年,英特爾則會推出新的架構。簡單的說,就是奇數工藝年和偶數架構年的概念。鐘擺策略能夠體現英特爾技術變化方向。當有英特爾鐘擺往左擺的時候,tick這個策略會更新工藝;往右擺的時候,tock會更新處理器微架構。

<2>ARM——穩紮穩打的蟻羣

如果要問哪個指令集的處理器銷量最大,很多人會認爲是Intel,不過一家來自英國的公司讓我們大跌眼鏡,這家公司就是ARM公司。

在智能手機領域,ARM(Acorn RISCMachine)獨領風騷,佔據了手機市場90%以上的份額。當今手機上的應用處理器,不管是高通還是TI的,東芝還是三星的,在內部都採用了ARM內核。

ARM11之後的處理器家族改稱爲Cortex,並針對高、中、低階劃分爲A、R、M三大系列處理器。高階智能手機普遍採用Coretex-A系列,例如蘋果iPhone 4、4s和5所採用的A4/A5/A6處理器,設計結構分別是Cortex-A8/Cortex-A9/非標準ARM,都是基於指令集:ARMv7 (Cortex)。

<3>MIPS——優雅的孔雀

如果要說最經典的RISC處理器,那麼非MIPS莫屬,就連它的競爭對手,也不得不承認它的優雅,它被作爲處理器教科書的典範,很多其他的處理器,都能看到它的身影。

MIPS全稱爲Microprocessor without Interlocked Piped Stages,無內部互鎖流水級的微處理器。中國科學院計算所自主研發的龍芯,採用類似於MIPS的簡單指令集。

<4>Power——昔日的貴族

最早提出RISC思想的是IBM公司,PowerPC是一種RISC多發射體系結構

1990年,IBM推出了高性能的POWER(Performance Optimized With Enhanced RISC)處理器。POWER性能卓越,一直以來都被用在IBM自己的服務器上。1997年與國際象棋大師卡斯帕羅夫交戰的深藍計算機,使用POWER2處理器,2011年參加知識競賽電視節目“Jeopardy!”挑戰人類的Watson計算機,使用的是POWER7處理器。

由於POWER的高性能,IBM想到可以將POWER用於PC領域,因此IBM向Apple拋了橄欖枝,Apple當然求之不得。Apple一直都使用Motorola的處理器,因此Apple又把Motorola拉下了水。這3家公司一拍即合,富有傳奇色彩的三大巨頭,同時又是在PC時代只能賺吆喝的3個難兄難弟終於結拜在了一起,於1991年成立了AIM聯盟(AIM爲Apple、IBM、Motorola的3個首字母)。AIM對POWER處理器進行了修改,於是就形成了PowerPC,PC是Performance Computing的縮寫。

Apple公司的Macintosh過去十幾年來用的是IBM研發的PowerPC處理器,但是蘋果於2005年6月宣佈終止與IBM和摩托羅拉長期合作關係,放棄PowerPC支持 全面Intel化。蘋果CEO史蒂夫·喬布斯(Steve Jobs)指出,轉換芯片架構是因爲英特爾提供更優越的產品藍圖。

<5>C6000——偏安一隅的獨立王國

以上介紹的這些處理器,都是較通用的處理器,還有一種較專業的處理器,它的名字叫DSP(Digital SignalProcessor,數字信號處理器),專業做信號處理運算的。

這幾年,全球的無線通信網絡建設如火如荼,視頻網站、視頻通信系統也如雨後春筍般涌現出來,在這些產品或服務的背後,一個是無線通信技術,一個是音視頻技術,這二者的共同點在於:它們都需要大量的信號處理運算,而這正是DSP的強項。

20世紀80年代初,Motorola和TI(德州儀器)都推出了自己的手機DSP芯片,Motorola要強於TI,但由於Motorola的芯片只給自己的手機用,諾基亞、愛立信等公司選擇了TI,從此成就了TI。

現在的DSP芯片主要由TI、Freescale、LSI等公司推出,TI DSP一家獨大,佔據絕大部分市場份額。TI也是半導體領域的先驅之一,第一塊集成電路的發明人、諾貝爾獎得主Jack Kilby就來自於TI。

C6000系列DSP是TI的高端DSP,C62/C64/C64+是定點DSP內核,C67是浮點DSP內核,C66是定點/浮點融合的內核。

與C6000直接競爭的,是Starcore體系結構,最早由Infineon、Agere、Motorola的合資公司設計,公司經過多年的分與合之後,目前這個體系結構的DSP由Freescale和LSI推出。

3 指令的執行

3.1 通用寄存器

指令的語義主要是完成一定的功能操作,其操作對象就是操作數。在進行運算之前,數據必須就位,那麼操作數放在哪裏呢?

CPU內部有很多通用寄存器(General Purpose Register),這些寄存器用來存儲指令的操作數,它對程序員可見。例如x86有8個通用寄存器,MIPS有32個寄存器。這一堆寄存器也被叫做寄存器堆(Register File)。寄存器一般爲SRAM,可將其看做CPU的緩存。

在硬件實現上,算術邏輯運算單元ALU直接訪問通用寄存器進行計算。通用寄存器中的數據需要先讀到ALU輸入寄存器(ALU Input Register)中,ALU運算結束後,數據會存儲在ALU輸出寄存器(ALU Output Register)中,最後再送回通用寄存器中。

在MIPS中,運算指令的操作數只能是寄存器,因此在執行運算指令之前,調用數據傳送指令load將數據從內存加載到通用寄存器中。在x86中一般使用mov指令進行數據傳送。

3.2 指令執行過程

指令的執行過程按時間順序可分爲以下幾個步驟:

(1)CPU發出指令地址。將指令指針寄存器(IP)的內容——指令地址,經地址總線送入存儲器的地址寄存器中。

(2)從地址寄存器中讀取指令。將讀出的指令暫存於存儲器的數據寄存器中。

(3)將指令送往指令寄存器。將指令從數據寄存器中取出,經數據總線送入控制器的指令寄存器中。

(4)指令譯碼。指令寄存器中的操作碼部分送指令譯碼器,經譯碼器分析產生相應的操作控制信號,送往各個執行部件。

(5)按指令操作碼執行。

(6)修改程序計數器的值,形成下一條要取指令的地址。若執行的是非轉移指令,即順序執行,則指令指針寄存器的內容加1,形成下一條要取指令的地址。指令指針寄存器也稱爲程序計數器(PC)。

4 流水線作業

4.1 流水線的概念

關於流水線,生活中到處可見,工廠的生產流水線和食堂的打飯流水線都是流水線的經典範例。在《MIPS體系結構透視》中借用食堂打飯流水線的例子很好的闡述了流水線的概念。

所謂流水線(pipeline),就是將那些重複性的工作分解成幾個串行的部分,使得工作能在工人中間移動。每個熟練工人只需要依次將他們熟悉的那部分工作做好即可。雖然每個顧客等待服務的總時間有所增加,但是卻有四個顧客能同時接受服務,這樣在午餐高峯期能夠接待的顧客數量增加了三倍。

假如Evie的小賣部新增了一種炸雞腿,交由Bert負責派發,這樣Bert在給顧客派發炸土豆時還得派發炸雞腿。此時,Bert這一環節相比以前耗時增加,導致流水線效率下降。如是,Evie再請了一個朋友加入食物派發流水線,專門負責派發雞腿。我們說Evie店的流水線從四步(step)增加到了五步,流水線的級數(深度)增加了一級,相應增加了人力成本。

4.2 CPU指令執行流水線

如果將程序看成是內存中存儲的一些指令的話,一個即將運行的程序看起來和排着隊等待接受服務的顧客沒什麼相似之處。但是,在CPU看來,情況就不一樣了。CPU從內存中提取每條指令,進行譯碼,找到所需要的操作數,執行相應操作,並存儲運算產生的結果——然後又從頭開始重複同樣的工作。這樣等待執行的程序就是一個指令的序列,該隊列中一次只有一條指令經過CPU。

由於每條指令要做不同的工作,因此在CPU內部已經配有各種不同的專用的大塊邏輯電路(每一流水階段都有獨立的邏輯電路來處理),所以構造一個流水線並沒有使CPU複雜度增加多少,只是讓CPU工作得更努力一些而已。

採用流水線技術後,並沒有加速單條指令的執行,每條指令的操作步驟一個也不能少,只是多條指令的不同操作步驟同時執行,因而從總體上看加快了指令流速度,縮短了程序執行時間。

爲了進一步滿足普通流水線設計所不能適應的更高時鐘頻率的要求,高檔次處理器中的流水線的深度(級數)在逐代增多。當流水線深度在5~6級以上時,通常稱爲超流水線結構(SuperPipeline)。顯然,流水線級數越多,每級所花的時間越短,時鐘週期就可以設計的越短,指令速度越快,指令平均執行時間也就越短,但是相應設計成本也會增加。

在TI C6000 DSP中,所有指令的執行大概分爲Fetch(取指)、Decode(譯碼)、Execute(執行)三個大的步驟,每個大的步驟又可以細分爲一些小的步驟,實現了更深的流水線。

4.3 MIPS經典五級流水線

(1)MIPS的五級流水線

MIPS體系架構依據流水線結構設計。只要CPU從緩存中獲取數據,那麼執行每條MIPS指令就被分成五個流水階段,並且每個階段佔用固定的時間,通常是隻耗費一個處理器時鐘週期。RD/WB操作只佔用半個時鐘週期,故MIPS五段流水線只佔用四個時鐘週期。

MIPS處理器在設計時,將處理器的執行階段劃分爲以下五個階段:

<1> IF:Instruction Fetch,取指。從指令緩存(I-Cache)中獲取下一條指令。

<2> ID(RD):InstructionDecode(Read Register),譯碼(讀寄存器)。翻譯指令,識別操作碼和操作數,從寄存器堆中讀取數據到ALU輸入寄存器。

<3> EX(ALU):Execute,執行(算術/邏輯運算)。在一個時鐘週期內,完成算術或邏輯操作。注意,浮點算術運算和整數乘除運算不能在一個時鐘週期內完成。

<4> MEM:Memory Access,內存數據讀或者寫。在該階段,指令可以從數據緩存(D-Cache)中讀/寫內存變量。平均來說,大約四分之三的指令在這一階段沒有執行任何操作,爲每條指令分配這個階段是爲了保證同一時刻不會有兩條指令都訪問數據緩存。

<5> WB:Write Back,寫回。操作完成後,將計算結果從ALU輸出寄存器寫回到通用寄存器中。

對於運算指令,在MEM階段空閒。對於load指令,在EX階段計算要訪問的地址,在MEM階段從內存中將數據讀入到MEMregister(MEM和WB之間的流水線寄存器)中,在WB階段,將MEM register的數據寫回到Register File中。對於store指令,在EX階段計算要訪問的地址,在MEM階段將寄存器中的數據寫回到存儲器中。

(2)流水線和緩存

高效的流水線操作要求每個階段佔用相同的時間。高效的流水線還依賴於高速緩存(Cache),可以將內存訪問速度提高50倍左右。當CPU需要數據時,首先在緩存中查找,如果該數據在緩存中則命中,那麼緩存很快就把數據返回給CPU。由於無法猜測CPU將使用什麼數據,故緩存僅存儲最近一段時間內CPU從主內存中獲取的數據副本。如果緩存缺失(沒有命中),則需要重填(Invalidate and Refill)。

x86的寄存器個數很少,所以同樣的程序編譯給x86會比MIPS使用多得多的數據存取操作。當然,x86使用堆棧來代替寄存器給這些額外存取使用,這些堆棧位置將是內存中使用非常頻繁的區域,對應高速緩存的使用效率非常高。

MIPS體系架構設計時採用了獨立的指令緩存和數據緩存,這樣CPU就可以同時獲取指令和讀寫內存變量。

(3)嚴格流水線的限制

RISC(Reduced Instruction Set Computing,精簡指令集)相對CISC(Complex Instruction Set Computing,複雜指令集)對指令集作了巧妙和有效的規定,從而使得流水線可以高效和成功的實現。所有的MIPS指令都經過嚴格的定義,以遵循同樣的流水線階段順序,即使這些指令在某個流水線階段什麼也不做。於是最終結果是:只要CPU保持從緩存中命中(hit)數據,就能在每個時鐘週期開始一條指令。

流水線的嚴格要求限制了指令的某些操作能力。

首先,要求所有的指令一樣長(剛好是一個機器字長32位),這樣的指令可以在固定時間被讀取。定長指令的要求限制了操作的複雜程度。比如,在指令中沒有足夠的位空間對真正複雜的尋址模式進行編碼。定長指令直接導致的一個問題就是,一個典型的程序在支持變長指令的x86體系架構上,編譯後其指令平均長度只有3個字節,在MIPS代碼中則全部是4個字節,從而佔用了更多的內存空間。通常MIPS二進制文件要比680x0或80x86二進制文件大20%~30%。

第二,MIPS中的指令操作必須符合流水線特性。指令操作只有在正確的流水線階段才能夠執行,並且必須在一個時鐘週期內執行完畢。比如,寄存器寫回階段只允許一個值存儲到寄存器堆,因此這些MIPS指令只能修改一個寄存器的值。出棧操作需要將兩個值(棧中的數據以及遞增的棧指針值)寫回到寄存器中,因此它不適合流水線。所以,MIPS沒有提供對棧操作的硬件支持,沒有x86那樣的push/pop指令。

第三,流水線的設計規則沒有實現可以操作內存變量的指令。緩存或者內存的數據只有在流水線的第四階段才能夠獲得。對於ALU而言,這些數據來得太遲了。內存訪問僅通過簡單的load/store指令來將數據導入或導出寄存器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章