2012-04-25 23 views
9

關於什麼機器代碼實際上似乎有很多意見。我聽說有人說它是程序集,二進制或十六進制。實際機器代碼在各個點上的外觀如何?

它是正確的說,機器代碼本質上是爲特定的處理器的指令集?如果是這樣,我想這些可以用二進制或十六進制表示法或彙編表示。但是非翻譯的「實際」機器代碼是什麼樣的?它是基於體系結構的字大小嗎?或者是十六進制的所有意圖和目的的默認表示?

坐在硬盤上時它看起來像什麼?坐在登記冊裏的樣子是什麼?如何處理它,它只是一組電壓變化?

+6

這是有意義的二進制值只對特定的處理器。如果您願意,您可以將它表示爲十六進制,或者您喜歡的任何其他基礎。它「看起來像」,然而你選擇代表它。 – 2012-04-25 22:47:33

+2

它不是程序集,二進制或十六進制,它們都是它們:-)它們都是同一件事的表示。最終彙編和十六進制都映射到二進制。該二進制映射到CPU中一堆晶體管的狀態。該狀態可以表示要處理的指令,或者可以表示要處理的數據。 – Benj 2012-04-25 22:52:40

+1

它是零和一個,沒有更多。十六進制和彙編指令適用於人員,而不是計算機。 – 2012-04-25 22:58:44

回答

15

機器碼只是二進制數據,對應於特定處理器架構的CPU指令。

我不會去到它是如何存儲太多,因爲這取決於它的存儲位置。例如,在磁盤上,通常將其存儲爲一系列磁化區域。機器碼與存儲方面的其他二進制數據沒有區別。如果您的問題更多地涉及數據如何存儲在計算機上,您應該研究計算機中的各種數據存儲設備,例如HDD,RAM和寄存器等等。

可視化的機器代碼是如何存儲的最簡單的方法是看一些在十六進制編輯器。這顯示了由十六進制數字表示的二進制數據。例如,採取指令:

0xEB 0xFE 

這很容易被寫1110101111111110,或60414.這取決於你怎麼想二進制轉換爲人類可讀的形式。

該指令表示無限循環。 (這是假設它是被一個x86 CPU上運行,但是他們希望其他的CPU可以解釋它。)它可以裝配這樣的編碼:

j: 
jmp j 

當您運行彙編程序,它需要上面的代碼並將其轉換爲上面的二進制機器碼。

該指令實際上是兩部分。首先是所謂的操作碼,並且是0xEB。當這段代碼進入CPU時,這意味着:從程序中讀取一個字節,並跳過那麼多字節的數據。然後CPU讀取字節0xFE。由於它期望一個有符號的整數,因此它將二進制數據解釋爲數字-2。指令然後被讀取完畢,指令指針前進2個字節。然後執行指令,使指令指針向前移動-2(0xFE)個字節,這有效地將指令指針設置爲與指令開始時相同的值。

我希望這回答了你的問題。如果您想知道CPU的內部工作原理,請閱讀微碼和電子邏輯門。基本上,這是一組電壓差異,例如1位是5伏電荷,0位是0位電荷。

+0

因此,爲了澄清,將機器代碼稱爲字節代碼更準確,而不是真正表示爲二進制代碼。當然,一組位構成了一個字節,但是機器指令的最小原子大小實際上是存在於字節級別的呢? – 2012-04-26 18:05:48

+0

實際上,幾乎總是這樣,因爲當前的技術被設計用於處理字節而不是位。理論上,沒有。例如,基於brainf * ck語言的CPU可能有3位指令。 – 2012-04-26 18:10:34

+0

謝謝Kendall,理解數據抽象直到你得到多位(通常是字節)指令纔會開始。我想現在我明白了,但這是一個啓示。 – 2012-04-26 19:52:13

-2

解釋初學者

從地上爬起來的計算機有很多「開關」的。例如,LED燈可以關閉
或打開,只有2個選項(1 =開或0 =關)。如果您有2個LED指示燈,您可以關閉LED 1並打開
2,反之亦然,也可以打開或關閉它們。現在有更多的可能性。

您可以計算出有多少種不同的可能性。
1燈= 2^= 2可能性
2個燈= 2^= 4可能性
8個燈= 2^= 256的可能性

所以該計算機讀取唯一零的和一個人。 根據CPU的容量,電腦有很多開關。爲了讓電腦啓動燈泡,您需要在系統中添加0和1,這將是一項非常艱鉅的任務。爲了避免這種情況,他們將可能性轉換爲十六進制數字。程序集只是一種計算機語言,可將您鍵入的字母轉換爲0和1(二進制代碼)並按照說明進行操作。

6

和我一樣,你似乎很好奇電腦如何在引擎蓋下工作。我無法很好地回答你的問題(無論如何,這是一個很大的話題),但我強烈推薦史蒂夫吉布森的「Let's Design a Computer」播客系列。下面是「機器語言」成績單的摘錄,給你一個口味。 。 。

和所有跳躍的手段是不是增加一個程序計數器,我們添加兩個,或者我們添加一個兩次,這實際上是這些機器是如何工作的當年。這只是讓我們跳過跳躍。所以基本上這意味着我們可以分支到任何我們想要記憶的地方或繼續前進,這使我們儘管非常簡單,但卻可以讓我們有足夠的能力讓機器做出決定。我們有輸入/輸出;我們有數學;我們有能力將數據從內存中的一個位置傳輸到另一個位置。這些都是機器運作方式的基本要素。這是機器語言。

現在,最重要的一層人性就是所謂的「彙編語言」,它只是命名的東西。例如,您爲不同的指令創建了一種所謂的助記符。所以,例如,加載累加器將是LDA。存儲累加器STA。你希望他們很短,因爲你會打字很多。請記住,您最終會使用很多小指令來完成任務。然後是彙編語言的唯一其他東西,它允許您在內存中命名位置。

因此,例如,您可能會說負載累加器當前得分的LDA。當前分數僅僅是指一個變量,就像一個變量本質上一樣,是一個記憶中的一個位置,您將其標記爲「當前分數」。然後,如果你做STA,存儲累加器,新的分數,那麼它會首先將當前分數加載到累加器中,然後將它存儲到不同的位置,稱爲新分數。所以,我們所談論的只是一些簡單的縮寫,幫助記憶和使用這些單獨的說明和便利的標籤,以便記憶中的位置,以便您不必記住,噢,那是在位置329627.我的意思是,誰可以做到這一點?因此,您只需使用英文和某種類型的字母數字短語標記該位置,然後用該短語而不是其實際數字引用該位置。

其實你不在乎數字是什麼。這就是彙編程序爲你做的事情之一,你只是說我需要稱爲這些東西的內存。而且它擔心他們去哪裏,因爲只要他們一致提及,它對你來說並不重要。這就是整個過程。這是機器語言和彙編語言。這就是50年前的情況,現在它或多或少就是這樣。

。 。但他比這更進一步備份,並從晶體管和邏輯門開始。從我可以告訴,這裏是完整的系列(和聽衆在維基貢獻了有用的圖表):

如果有人需要用問題什麼史蒂夫說,在這些事件中,最好的地方,提供反饋是http://www.grc.com/feedback.htmhttp://www.grc.com/discussions.htmhttps://twitter.com/SGgrc

相關問題