匯編指令入門級整理 匯編指令

匯編指令(匯編指令的初級加工)
作者| AlbertS
制作人| CSDN博客

我們大多數人都是被高級語言寵壞的一代人,各種高級語言正在逐漸加入源源不斷的新特性 。匯編作為最接近機器指令的底層語言,很少被直接用來寫程序,但我真的遇到過一個,以前的同事,因為寫代碼時成員函數權限和可見性的問題,無法正確調用自己想執行的函數 。于是,他開始在C++代碼中嵌入匯編,繞開了各種問題 。
因為這個項目是跨平臺的,他發現在Linux上編譯代碼時,匯編代碼的語法實際上在Linux和Windows之間是不同的 。因此,他用一個宏觀定義來判斷平臺,從而“完美”地解決了這個問題 。最后這些代碼肯定是重寫了,因為可讀性太差了 。最近在學習左值、右值、左引用、右引用的時候,總有人用程序編譯生成的中間匯編代碼來解釋問題,這讓我很困惑,所以我決定先熟悉一下簡單的匯編指令,同時學習并記錄下來,這樣以后忘記了就可以直接用來復習了 。
什么是匯編語言?
匯編語言是最接近機器語言的編程語言,引用百科全書中的一段話來解釋:
匯編語言是用于電子計算機、微處理器、微控制器或其他可編程設備的低級語言,也稱為符號語言 。匯編語言中,用助記符代替機器指令的操作碼,用地址符號或標號代替指令或操作數的地址 。匯編語言也被稱為第二代計算機語言 。
匯編語言產生的原因
對于大多數人來說,二進制程序是不可讀的,當然也有會讀的有能力的人,比如第一代程序員,但是這類人正在消亡,直接看二進制不容易看出他們做了什么,比如最簡單的加法指令用二進制表示為0000011,如果混在一串01串里面就很難找到,所以匯編語言主要是解決二進制編碼的可讀性問題 。
【匯編指令入門級整理 匯編指令】程序集和二進制文件之間的關系
換句話說,匯編語言就是把顯示給機器的二進制代碼翻譯成人類語言 。匯編指令是機器指令的助記符,與機器指令一一對應,是一種易讀易記的書寫格式 。它有效地解決了機器指令編程難的問題,利用編譯器可以很容易地將匯編程序翻譯成機器指令程序,比如前面提到的00000011加法指令,對應的匯編指令是ADD,調用匯編程序時會翻譯成0000011 。
注冊
說到匯編指令,我們不得不提到寄存器 。寄存器本身是用來存儲數據的,因為CPU本身只負責邏輯運算,數據需要單獨存儲在其他地方 。但是,不熟悉登記冊的人會有疑問 。數據不是存儲在硬盤上嗎?還是數據沒有存儲在內存中?所有這些想法都是對的,那么寄存器是用來做什么的呢?
寄存器功能
其實硬盤和內存都是用來存儲數據的,但是CPU的運算速度遠高于內存的讀寫速度,更不用說從硬盤中取數據了 。因此,為了避免被拖慢而影響效率,CPU有自己的一級緩存和二級緩存,有的CPU甚至會增加三級緩存 。從這些緩存中讀取和寫入數據比內存快得多,但仍然不可能使用快速運行的CPU,所以有寄存器 。
寄存器不是后來添加的,而是在初始計算中設計的 。相比較而言,多級緩存出現的比較晚 。通常,最頻繁讀取和寫入的數據將放在寄存器中 。CPU會先讀寫寄存器,然后通過寄存器和緩存與內存交換數據,達到緩沖的目的 。因為寄存器可以按名稱訪問,所以訪問速度最快,所以也叫零級緩存 。
訪問速度比較
從上面的描述可以知道,訪問速度從高到低依次為:寄存器一級緩存二級緩存>三級緩存內存硬盤 。例如,很容易理解它們的訪問速度 。比如我們做飯的時候(CPU工作),拿在手里的肉和蔬菜(寄存器)肯定是最快的 。如果沒有,我們需要把處理好的菜拿到案板上(一級緩存) 。如果不在案板上,就去更遠的菜槽(二級緩存)看看 。如果還沒找到,就去冰箱里找找(三級緩存) 。當你發現家里真的沒有的時候,就去樓下的蔬菜店(記憶)買點東西,轉身發現自己不想要了 。最后開車去農貿市場(硬盤)買 。
從上面的例子中,我們應該能夠理解它們的速度關系 。既然緩存這么快,為什么不用緩存代替內存,或者用一級緩存代替二級和三級緩存呢?這里有一個成本問題 。速度越快,價格越高 。如果你買過機械硬盤和固態硬盤,應該很容易理解 。
寄存器分類
常用的x86 CPU寄存器有八個:EAX、EBX、ECX、ed x、EDI、ESI、EBP、ESP 。據說現在寄存器總數已經超過100個了,找到相關資料我會補充的 。這些寄存器是最常用的寄存器,這些名稱經常出現在編譯代碼中 。

推薦閱讀