隨著社會越來越發達,大家都選擇在網絡上汲取相關知識內容,比如匯編指令_匯編指令入門級整理 ,為了更好的解答大家的問題,小編也是翻閱整理了相應內容,下面就一起來看一下吧!
匯編指令(匯編指令的初級精加工)
【資料圖】
作者|艾伯特
出品| CSDN博客
序
我們大多數人都被高級語言寵壞了,各種各樣的高級語言正在逐漸增加源源不斷的新功能。匯編作為最接近機器指令的低級語言,已經很少被直接用來寫程序了。但是我真的遇到過一個,以前的同事,寫代碼的時候因為成員函數的權限和可見性的問題,無法正確調用自己想要執行的函數。于是,他開始在C++代碼中嵌入匯編,繞過了各種問題。
因為項目是跨平臺的,所以當代碼在Linux上編譯時,他發現匯編代碼的語法在Linux和Windows之間其實是不一樣的。于是,他用一個宏來判斷平臺,來定義一個“完美”的解決方案。最后這些代碼肯定是重寫了,因為可讀性太差了。最近在學習左值、右值、左引用、右引用的時候,總有人用程序編譯生成的中間匯編代碼來說明問題,讓我覺得很茫然,所以我決定先熟悉一下簡單的匯編指令,邊學邊記,以后可以直接用來復習。
什么是匯編語言?
匯編語言是最接近機器語言的編程語言,機器語言解釋為:
匯編語言是電子計算機、微處理器、微控制器或其他可編程設備的低級語言,也稱為符號語言。在匯編語言中,助記符用來代替機器指令的操作碼,地址符號或標號用來代替指令或操作數的地址。匯編語言也被稱為第二代計算機語言。
匯編語言的原因
對于絕大多數人來說,二進制程序是不可讀的。當然也有有能力的人看得懂,比如之一代程序員。然而,這種人正在滅絕。直接看二進制不容易看出做了什么。比如最簡單的加法指令二進制表示為0000011,如果混在一大串01字符串中就很難找出來。所以匯編語言主要是解決二進制代碼的可讀性問題。
匯編和二進制的關系
換句話說,匯編語言是把顯示給機器的二進制代碼翻譯成人類語言,匯編指令是機器尤優資源網指令的助記符,與機器指令一一對應,是一種易讀易記的書寫格式。有效地解決了機器指令編寫困難的問題,編譯器可以很容易地將匯編程序翻譯成機器指令,比如前面提到的0000011加法指令,對應的匯編指令是ADD,調用匯編程序時會翻譯成0000011。
注冊
說到匯編指令,寄存器就不得不提了。寄存器本身是用來存儲數據的,因為CPU本身只負責邏輯運算。數據需要分開存放在其他地方,但是對于不熟悉寄存器的人來說會有疑問。數據不是存儲在硬盤上嗎?還是數據不存在于內存中?這些想法都是正確的,那么寄存器是用來做什么的呢?
寄存器功能
其實硬盤和內存都是用來存儲數據的,但是CPU的運算速度遠高于內存的讀寫速度,更不用說從硬盤上取數據了。所以為了避免被拖慢,影響效率,所有的CPU都有自己的一級緩存和二級緩存。有些CPU甚至增加了三級緩存。從這些緩存中讀寫數據要比內存快很多,但是還是無法使用運行速度快的CPU,所以有寄存器。
后來沒有加注冊,最初計算的時候就設計了優優資源網。相比較而言,多級緩存出現的比較晚。通常,最頻繁讀寫的數據會放在寄存器中。CPU優先讀寫寄存器,然后通過寄存器和緩存與內存交換數據,達到緩沖的目的。因為寄存器可以通過名字訪問,所以訪問速度最快,所以也叫零級緩存。
訪問速度比較
從上面的描述我們可以知道,訪問速度從高到低是:寄存器>一級緩存>二級緩存>三級緩存>內存>硬盤。至于它們的訪問速度,舉個例子就很容易理解了。比如我們做飯的時候(CPU工作),我們手里拿著的肉和菜(寄存器)一定是最快的。如果沒有,我們需要在案板上處理掉它們(一級緩存)。如果不在案板上,就去更遠的洗碗池(二級緩存)里找。如果還沒找到,就去冰箱里找找(三級緩存)。這個時候你發現家里真的沒有。然后去樓下的蔬菜店(記憶)買一些。一輪下來,你發現你什么都不想要。最后,你更好開車去農貿市場(硬盤)買。
通過上面的例子,我們應該可以了解它們的速度關系。既然緩存這么快,為什么不用緩存代替內存,或者把二級和三級緩存都改成一級緩存?這里有一個成本問題。速度越快,價格越高。如果你買過機械硬盤和固態硬盤,應該很好理解。
寄存器分類
有八種常用的x86 CPU寄存器:EAX、EBX、ECX、ed x、EDI、ESI、EBP、ESP。據說現在注冊總數已經超過100個。找到相關資料我會補充的。以上寄存器是最常用的,這些名字經常出現在編譯后的代碼中。
我們常說的32位和64位CPU是指數據總線的寬度或根數,而寄存器是暫時存儲數據和中間結果的單元。所以寄存器的位數,也就是處理數據的長度和數據總線的根數是一樣的,所以32位CPU對應的寄存器也應該是32位的。
常用寄存器用途
如上所述,八個寄存器有其特定的用途。我們以32位CPU為例,簡單說明一下這些寄存器的作用,并在下表中進行整理:
語域EAX、AX、AH和AL之間的關系
在上面的圖標中,每個常用寄存器后面都有其他名稱。它們是同一語域不同用法下的不同名稱。例如,在32位CPU上,e AX是32位寄存器,而AX是EAX的低16位,AH是AX的高8位,AL是AX的低8位。它們的比較關系如下:
00000000 00000000 00000000 00000000|===============EAX===============|---4個字節|======AX=======|---2個字節|==AH===|-----------1個字節|===AL==|---1個字節匯編語言指令
最后,我們談到了匯編指令,因為linux和windows下的匯編語法有些不同,所以我們先簡單了解一下windows下的匯編指令,稍后再比較它們之間的區別。
數據移動指令
算術運算指令
邏輯操作指令
循環控制指令
自反秩序
Linux和windows下匯編的區別
說起linux和windows在匯編語法上的差異,其實兩者語法上的差異和系統上的差異并沒有絕對的關系。一般在linux上會使用gcc/g++編譯器,而在windows上會使用微軟cl,MSBUILD。因此,由于編譯器不同,生成的代碼也不同。gcc下采用美國 *** 電報公司的匯編語法格式,MSBuild優優資源網d采用Intel匯編語法格式
摘要
匯編指令是機器指令的助記符,與機器指令一一對應。
美國 *** 電報公司的匯編語法格式與英特爾的不同。
常用寄存器:EAX、EBX、ECX、EDX、EDI、ESI、EBP、ESP
訪問速度從高到低依次為:寄存器>一級緩存>二級緩存>三級緩存>內存>硬盤。
常用的匯編指令:mov,je,jmp,call,add,sub,inc,dec,and,or。
版權聲明:本文為CSDN博主“AlbertS”原創文章,遵循CC 4.0 BY-SA版權協議。請附上原始文章和本聲明來源的鏈接。
原文鏈接:https://blog.csdn.net/albertsh/article/details/106041560
?華為全球分析師大會:HMSCore全球開發者應用集成的數量加速增長,打造全場景智慧體驗?騰訊人均月薪8萬,恍恍惚惚,又被平均了??200萬年薪請不到!清華姚班到底有多牛?|原力計劃?量子計算與AI“雙拳”出擊,他們鎖定38種潛在抗疫藥物?我們已經不用AOP做操作日志了!|原力計劃?國外這三位帥小伙,居然搞了個用比特幣付款、無人機運送的水培沙拉項目?關鍵詞: 指令
責任編輯:Rex_23