2013-08-04 48 views
2

警告1:我對真實的實際CPU設計一無所知。計算機如何將寄存器設置爲常量值?

警告2:我不知道「CPU指令」,「CPU操作」和「CPU功能」等術語之間的區別。也許有一個,也許沒有,但我使用這些就好像它們是同義詞。糾正我,如果我錯了。

背景:想象一下你有一個4位CPU和兩個寄存器。現在你需要加載一個常數值來註冊1!可能有幾種方法可以做到這一點:

  • 指令像0SXX,其中0表示這是一個「設置寄存器X」之類的指令,以及S說哪個寄存器1的側XX應加載。
    • 優點:易於操作寄存器1.只需使用兩個字節的程序存儲器即可設置恆定值。
    • 缺點:消耗可能的CPU指令的HALF。對於我的4位小設備來說這是一場悲劇,但對於8位以上的計算機來說這也不算什麼。
  • 純算術/逐位系列CPU功能(如AND,OR,NOT,XOR,回報率,ROL,INC。,等...)
    • 優點:不需要額外的CPU實現。
    • 缺點:需要更多的指令,更慢的加載常量,當然,在裝配常量之前需要多思考。
  • 這些之間的東西?像清理寄存器一樣,加載??然後邏輯操作?
  • 還有什麼我沒有想到的?

一般:

  • 有沒有一種方式,一切正常,現代的CPU寄存器設置爲恆定值?
    • 如果不是,那麼最常用的方法是什麼?
  • 老的4/8位計算機有不同的方法來做到這一點嗎?

我認爲任何碰過集會的人都會知道這個問題。我非常感謝你的幫助!提前致謝。

+0

清除一個寄存器很簡單:它自己的「xor」通常比一個move-immediate to register指令更短,它將寄存器設置爲指令中包含的值。無序執行CPU需要識別依賴鏈,以便它們可以並行執行所有獨立的事情。他們總是認爲'xor eax,eax'獨立於前一個值,所以它像'mov eax,0'一樣破壞依賴鏈。 –

回答

6

每個處理器架構,x86,arm,mips等都有自己的做法。如果你無法以常量操作,你肯定無法從處理器中獲得太多的用處。

首先並不是所有的處理器都使用寄存器,有些是基於堆棧的,例如,雖然以某種方式在堆棧上放置一個常量,但您也遇到同樣的問題。

有兩種基本方法,都在大多數處理器上都可以找到。一種是你所暗示的,有些指令說明這是一種立即行動(立即表示該常數是在指令本身編碼的),註冊時,術語會有所不同,但操作碼,寄存器號碼和立即值被編碼在指令中。根據CPU的不同,儘管你可能無法在一條指令中加載整個寄存器,例如固定長度的指令集,你不能在32位中填充操作碼,寄存器編號和32位值,例如ARM和MIPS可以一次只加載一部分寄存器。加載一個0x00000078,然後或0x00005600,然後或0x00340000然後或0x12000000或另一架構加載0x00005678和或0x12340000,導致0x12345678。

第二種方法是將常量放在程序存儲器中,通常稱爲.text,然後使用一條指令將數據從存儲器加載或移動到寄存器,並使用pc相對尋址。 pc程序計數器,基本上是程序員和彙編程序(讀取彙編語言並從中生成機器代碼的程序)的組合,已將指令加載,並加載數據,基本上說,採用你正在執行的指令,並添加一些數字X,併產生一個我想要讀取並加載到該寄存器的常量的地址。第二種方法適用於大多數指令集,並且您現在可以根據指令集的規則將任意大小的常量加載到您想要的寄存器中,它不需要兩個或四個或更多指令將您想要的常量拼湊在一起的固定指令長度指令集,它會花費你一個內存週期,這可能會或可能不會影響性能。如果您考慮可變長度指令集,那麼常量本身就是指令流中的一個單獨讀取,因此架構之間的權衡確實沒有什麼不同。

不管他們在歷史上是多麼古老或是新的指令集都是相似的,因爲它們是不同的。舊的到新的指令集往往使用幾個或更多的寄存器,有一個程序計數器,有一個操作,添加和,或不,異或等。有一種方式來讀取和寫入內存(加載和存儲),並有使用即時值的能力。舊的cisc處理器和/或可變長度指令集處理器提供了更多的這些指令,每個alu操作都能夠使用全寬度立即,這種事情,並且當你嘗試用risc提升性能時,你會犧牲這些功能用於更快的流水線操作,更多的指令,但它們移動更快,更平滑,從而產生更快的執行速度(或其他功能)。

指令集信息是在網上爲您消費。 pdp-11或msp430是一個很好的第一個指令集,我經常建議在學習彙編時使用模擬器而不是硬件,直到你有一兩個人在你身邊時才避免使用x86。 msp430/pdp11,arm,mips,avr等等。一兩個pdp8實際上是有趣和教育性的,當然你可能想要去挖掘4004或8008,然後按照6502和6800和8080和那樣的事情。

+0

是的,直接從ROM讀取值是一個好主意!它爲其他指令節省了很多插槽!非常感謝你!並再次感謝您分析(如果有這樣一個詞)CPU。我有這個想法,看了維基百科上的x86指令集,真的很沮喪。這些看起來並不可怕! –

2

我沒有看到您的問題的背景。如果你正在設計一個4位的CPU,你應該閱讀比你看起來更多的東西。大多數現實世界的CPU都使用操作碼的某些位來描述操作的類型(移動,添加,比較等),還有一些位來描述尋址模式(常量,寄存器,寄存器間接,存儲器間接等等。)。並非所有CPU都爲所有操作碼提供所有尋址模式(具有此屬性的指令集稱爲「正交」)。

嘗試保存「CPU實現」(=減少操作數)可能適用於很少使用的「奧術」指令(或例如浮點操作),但不適用於移動常量值登記冊。

+2

謝謝你的asnwer和新術語(opcodes,正交)!對不起,我知道這個問題可能很愚蠢,但我只是一個自學,完全沒有經驗的青少年愛好者,所以關於這個主題的書籍和文章對我來說很難解碼(直到你理解爲止,再讀一遍),這就是爲什麼有時(像這次)我嘗試自己設計事物,導致這些在很久以前就已經解決了問題。抱歉。 –

相關問題