彙編入門-基礎知識


一、彙編語言的位置

   爲什麼要學習彙編語言呢?就像學習美國文化要先懂英語一樣,如果不瞭解計算機的語言,又何談懂計算機呢?我們知道,計算機執行的語言,或者稱之爲命令序列或數據,都是以“1和0”的二進制語言,物理上則表現爲電信號的高低電平。雖然我們現在有C/C++、Java、Python等一系列強大的高級語言,但是其真正落實到計算機的執行時還是需要編譯或解釋成計算機懂的機器語言。最早的時候計算機編程就是在紙帶上打孔表示1或0,以此作爲編程指令,不僅難於操作,而且很難查錯,記憶也很困難。於是人們發明了機器語言的“人性化”表示:彙編語言(Assembly language),每條彙編指令都對應着一條機器二進制串,但是卻更加容易理解和記憶:

   雖然我們現在有許多的高級語言可以用來編程,但是如果想真的理解代碼執行的實際過程,還是需要我們去懂些彙編語言,從本質上理解機器的行爲。因此當今IT的各位童鞋們學習彙編語言還是十分重要的,逆向就更不用說了。

二、機器架構
   瞭解了彙編語言的位置,接下來需要看看機器的架構。計算機的核心是CPU,負責各種運算,其中又包括運算器和寄存器,寄存器中也用來存儲數據,但是一般較小,讀寫速度快,是運算器直接操作的對象;CPU之外有存儲器,存儲器一般指內存,分爲可讀寫的RAM和只可讀的ROM;其餘各種外設比如顯卡、網卡等都通過主板上的總線與CPU相連,CPU通過總線同存儲器以及各種外設中的芯片(進而同外設中的存儲器)進行數據通信。
   存儲器按字節大小分爲存儲單元,例如一個字節是一個存儲單元。CPU訪問存儲器時必須完成三件任務:1. 存儲單元的地址(地址信息);2. 器件的選擇,讀或寫的命令(控制信息);3. 讀或寫的數據(數據信息);因此,CPU同各種存儲器之間自然而然存在三種總線:地址總線、控制總線與數據總線。
   控制總線決定了命令的種類,數據總線決定了一次處理的數據最大位數,8位數據總線處理16位數據時要分兩次進行,而16位數據總線一次就能解決問題。地址總線則決定了CPU的尋址能力,即內存的大小,比如8位的地址總線最大隻有256個單元,即256字節,而32位的地址總線最多有2的32次冪bit,即4GB,這也是x86最多支持4G內存的原因。


   既然說到了4G內存的由來,那麼就可以趁熱打鐵說說內存地址空間了,CPU認識的每個存儲單元默認爲1字節,因此可以定位的所有內存單元最大就是2的N次冪,N爲地址總線長度,因此這個內存地址也就構成了計算機的內存地址空間,即所有可讀寫的存儲器單元必須在這其中,否則就無法爲CPU所定位檢索。一般的架構是這樣的:

   這裏0x9ffff是655539,0xbffff是786431,0xfffff是1048575,這樣認識的會更清楚些(感謝Python的計算機功能,果然方便)。主存儲器地址空間即內存,如果直接操作這個地址空間內的數據,效果就是直接讀寫內存數據;顯存地址空間指的的是顯存中的RAM部分,顯存的ROM以及網卡等其他外設的ROM都在最後的空間中。
發佈了3 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章