欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

匯編語言入門匯編指令及寄存器詳解教程

 更新時間:2021年11月04日 14:56:23   作者:AlbertS  
這篇文章主要為大家介紹了匯編語言入門匯編指令及寄存器的詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

前言

我們大都是被高級語言慣壞了的一代,源源不斷的新特性正在逐步添加到各類高級語言之中,匯編作為最接近機器指令的低級語言,已經(jīng)很少被直接拿來寫程序了,不過我還真的遇到了一個,那是之前的一個同事,因為在寫代碼時遇到了成員函數(shù)權限及可見性的問題,導致他無法正確調(diào)用想執(zhí)行的函數(shù),結果他就開始在 C++ 代碼里嵌入?yún)R編了,繞過了種種限制終于如愿以償,但是讀代碼的我們傻眼了…

因為項目是跨平臺的,代碼推送的 Linux 上編譯的時候他才發(fā)現(xiàn),匯編代碼的語法在 Linux 和 Windows 上居然是不一樣的,結果他又用一個判斷平臺的宏定義“完美”的解決了,最終這些代碼肯定是重寫了啊,因為可讀性太差了,最近在學習左值、右值、左引用和右引用的時候,總是有人用程序編譯生成的中間匯編代碼來解釋問題,看得我迷迷糊糊,所以決定熟悉一下簡單的匯編指令,邊學習邊記錄,方便今后忘記了可以直接拿來復習。

什么是匯編語言

匯編語言是最接近機器語言的編程語言,引用百科中的一段話解釋為:

匯編語言(assembly language)是一種用于電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。在匯編語言中,用助記符代替機器指令的操作碼,用地址符號或標號代替指令或操作數(shù)的地址。匯編語言又被稱為第二代計算機語言。

匯編語言產(chǎn)生的原因

對于絕大多數(shù)人來說,二進制程序是不可讀的,當然有能人可以讀,比如第一代程序員,但這類人快滅絕了,直接看二進制不容易看出來究竟做了什么事情,比如最簡單的加法指令二進制表示為 00000011,如果它混在一大串01字符串中就很難把它找出來,所以匯編語言主要就是為了解決二進制編碼的可讀性問題。

匯編與二進制的關系

換句話來說,匯編語言就是把給機器看的二進制編碼翻譯成人話,匯編指令是機器指令的助記符,與機器指令是一一對應的關系,是一種便于閱讀和記憶的書寫格式。有效地解決了機器指令編寫程序難度大的問題,并且使用編譯器,可以很方便的把匯編程序轉譯成機器指令程序,比如之前提到的 00000011 加法指令,對應的匯編指令是 ADD,在調(diào)用匯編器時就會把 ADD 翻譯成 00000011。

寄存器

說到匯編指令不得不提到寄存器,寄存器本身是用來存數(shù)據(jù)的,因為 CPU 本身只負責邏輯運算,數(shù)據(jù)需要單獨儲存在其他的地方,但是對于不熟悉寄存器的人來說會有疑惑,數(shù)據(jù)不是存在硬盤上嗎?或者說數(shù)據(jù)不是存在內(nèi)存中嗎?這些想法都沒錯,那么寄存器是用來做什么的呢?

寄存器作用

其實硬盤、內(nèi)存都是用來存儲數(shù)據(jù)的,但是 CPU 的運算速度遠高于內(nèi)存的讀寫速度,更不用說從硬盤上取數(shù)據(jù)了,所以為了避免被拖慢速度影響效率,CPU 都自帶一級緩存和二級緩存,一些 CPU 甚至增加了三級緩存,從這些緩存中讀寫數(shù)據(jù)要比內(nèi)存快很多,但是還是無法使用飛速運轉的 CPU,所以才會有寄存器的存在。

寄存器不是后來增加的,在最初的計算中就已經(jīng)設計出來,相比而言,多級緩存出現(xiàn)的更晚一些,通常那些最頻繁讀寫的數(shù)據(jù)都會被放在寄存器里面,CPU 優(yōu)先讀寫寄存器,再通過寄存器、緩存跟內(nèi)存來交換數(shù)據(jù),達到緩沖的目的,因為可以通過名稱訪問寄存器,這樣訪問速度是最快的,因此也被稱為零級緩存。

存取速度比較

通過上面的敘述我們可以知道存取速度從高到低分別是: 寄存器 > 1級緩存 > 2級緩存 > 3級緩存 > 內(nèi)存 > 硬盤,關于它們的存取速度,舉個例子很容易就能明白了,比如我們做菜(CPU工作)時,取手中(寄存器)正拿著的肉和蔬菜肯定是最快的,如果沒有就需要把案板上(1級緩存)處理好的菜拿過來,如果案板上沒有就在更遠一點的洗菜池(2級緩存)中找一找,還沒找到的話就要到冰箱(3級緩存)中看一看了,這時發(fā)現(xiàn)家里真沒有,那去樓下的菜店(內(nèi)存)去買點吧,轉了一圈發(fā)現(xiàn)沒有想要的,最后還是開車去農(nóng)貿(mào)市場(硬盤)買吧。

通過上面這個例子應該能明白它們的速度關系了,既然緩存這么快,為什么不用緩存代替內(nèi)存,或者將2、3級緩存都換成1級緩存呢?這里邊有一個成本問題,速度越快對應著價格越高,如果你買過機械硬盤和固態(tài)硬盤應該很容易就理解了。

寄存器分類

常用的 x86 CPU 寄存器有8個:EAX 、EBXECX、EDX、EDIESI、EBPESP,據(jù)說現(xiàn)在寄存器總數(shù)已經(jīng)超過100個了,等我找到相關資料再來補充,上面這幾個寄存器是最常用的,這些名字也常常出現(xiàn)在匯編的代碼中。

我們常說的32位、64位 CPU 是指數(shù)據(jù)總線的寬度或根數(shù),而寄存器是暫存數(shù)據(jù)和中間結果的單元,因此寄存器的位數(shù)也就是處理數(shù)據(jù)的長度與數(shù)據(jù)總線的根數(shù)是相同的,所以32位 CPU 對應的寄存器也應該是32位的。

常用寄存器用途

上面提到大8個寄存器都有其特定的用途,我們以32位 CPU 為例簡單說明下這些寄存器的作用,整理如下表:

寄存器 含義 用途 包含寄存器
EAX 累加(Accumulator)寄存器 常用于乘、除法和函數(shù)返回值 AX(AH、AL)
EBX 基址(Base)寄存器 常做內(nèi)存數(shù)據(jù)的指針, 或者說常以它為基址來訪問內(nèi)存. BX(BH、BL)
ECX 計數(shù)器(Counter)寄存器 常做字符串和循環(huán)操作中的計數(shù)器 CX(CH、CL)
EDX 數(shù)據(jù)(Data)寄存器 常用于乘、除法和 I/O 指針 DX(DH、DL)
ESI 來源索引(Source Index)寄存器 常做內(nèi)存數(shù)據(jù)指針和源字符串指針 SI
EDI 目的索引(Destination Index)寄存器 常做內(nèi)存數(shù)據(jù)指針和目的字符串指針 DI
ESP 堆棧指針(Stack Point)寄存器 只做堆棧的棧頂指針; 不能用于算術運算與數(shù)據(jù)傳送 SP
EBP 基址指針(Base Point)寄存器 只做堆棧指針, 可以訪問堆棧內(nèi)任意地址, 經(jīng)常用于中轉 ESP 中的數(shù)據(jù), 也常以它為基址來訪問堆棧; 不能用于算術運算與數(shù)據(jù)傳送 BP

寄存器EAX、AX、AH、AL的關系

在上面的圖標中每個常用寄存器后面還有其他的名字,它們是同一個寄存器不同用法下的不同名字,比如在32位 CPU 上,EAX是32位的寄存器,而AX是EAX的低16位,AH是AX的高8位,而AL是AX的低8位,它們的對照關系如下:

00000000 00000000 00000000 00000000
|===============EAX===============|---4個字節(jié)
                  |======AX=======|---2個字節(jié)
                  |==AH===|-----------1個字節(jié)
                          |===AL==|---1個字節(jié)

匯編語言指令

終于說到匯編常用指令了,因為 linuxwindows 下的匯編語法是有些不同的,所以下面我們先通過 windows 下的匯編指令來簡單學習一下,后續(xù)再來比較兩者的不同。

數(shù)據(jù)傳送指令

指令 名稱 示例 備注
MOV 傳送指令 MOV dest, src 將數(shù)據(jù)從src移動到dest
PUSH 進棧指令 PUSH src 把源操作數(shù)src壓入堆棧
POP 出棧指令 POP desc 從棧頂彈出字數(shù)據(jù)到dest

算術運算指令

指令 名稱 示例 備注
ADD 加法指令 ADD dest, src 在dest基礎上加src
SUB 減法指令 SUB dest, src 在dest基礎上減src
INC 加1指令 INC dest 在dest基礎上加1
DEC 減1指令 DEC dest 在dest基礎上減1

邏輯運算指令

指令 名稱 示例 備注
NOT 取反運算指令 NOT dest 把操作數(shù)dest按位取反
AND 與運算指令 AND dest, src 把dest和src進行與運算之后送回dest
OR 或運算指令 OR dest, src 把dest和src進行或運算之后送回dest
XOR 異或運算 XOR dest, src 把dest和src進行異或運算之后送回dest

循環(huán)控制指令

指令 名稱 示例 備注
LOOP 計數(shù)循環(huán)指令 LOOP label 使ECX的值減1,當ECX的值不為0的時候跳轉至label,否則執(zhí)行LOOP之后的語句

轉移指令

指令 名稱 示例 備注
JMP 無條件轉移指令 JMP lable 無條件地轉移到標號為label的位置
CALL 過程調(diào)用指令 CALL labal 直接調(diào)用label
JE 條件轉移指令 JE lable zf =1 時跳轉到標號為label的位置
JNE 條件轉移指令 JNE lable zf=0 時跳轉到標號為label的位置

linux 和 windows 下匯編的區(qū)別

前面說到 linuxwindows 下的匯編語法是不同的,其實兩種語法的不同和系統(tǒng)不同沒有絕對的關系,一般在 linux 上會使用 gcc/g++ 編譯器,而在 windows 上會使用微軟的 cl 也就是 MSBUILD,所以產(chǎn)生不同的代碼是因為編譯器不同,gcc 下采用的是AT&T的匯編語法格式,MSBUILD 采用的是Intel匯編語法格式。

差異 Intel AT&T
引用寄存器名字 eax %eax
賦值操作數(shù)順序 mov dest, src movl src, dest
寄存器、立即數(shù)指令前綴 mov ebx, 0xd00d movl $0xd00d, %ebx
寄存器間接尋址 [eax] (%eax)
數(shù)據(jù)類型大小 操作碼后加后綴字母,“l(fā)” 32位,“w” 16位,“b” 8位(mov dx, word ptr [eax]) 操作數(shù)前面加dword ptr, word ptr,byte ptr的格式 (movb %bl %al)

總結

匯編指令是機器指令的助記符,與機器指令是一一對應的

AT&T的匯編語法格式和Intel匯編語法格式的是不同的

常用寄存器:EAX 、EBX、ECXEDX、EDIESI、EBPESP

存取速度從高到低分別是: 寄存器 > 1級緩存 > 2級緩存 > 3級緩存 > 內(nèi)存 > 硬盤

的匯編指令:movje、jmp、calladd、subinc、dec、and、or

如今的每分每秒都是人生,不要總想著將自然發(fā)生的事情拖到預定的時刻才進行~

以上就是匯編語言入門匯編指令及寄存器詳解教程的詳細內(nèi)容,更多關于匯編語言指令及寄存器的資料請關注腳本之家其它相關文章!

相關文章

  • 一文掌握匯編語言 halt 命令

    一文掌握匯編語言 halt 命令

    匯編 halt 命令,是一條重復執(zhí)行指定標號的循環(huán)命令。處理器暫停,直到出現(xiàn)中斷或復位信號才繼續(xù),這篇文章主要介紹了匯編語言 halt 命令,需要的朋友可以參考下
    2023-01-01
  • 匯編語言指令集學習CMPXCHG比較并交換操作指令詳解

    匯編語言指令集學習CMPXCHG比較并交換操作指令詳解

    這篇文章主要為大家介紹了匯編語言指令集學習CMPXCHG比較并交換操作的指令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • 匯編語言開發(fā)過程詳解

    匯編語言開發(fā)過程詳解

    這篇文章主要介紹了匯編語言開發(fā)過程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 匯編語言lea指令使用方法解析

    匯編語言lea指令使用方法解析

    這篇文章主要介紹了匯編語言lea指令使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 詳解匯編語言 dup偽指令

    詳解匯編語言 dup偽指令

    dup它有多種意義,包括Linux c 函數(shù)、C語言函數(shù)DUP、匯編指令、化學物質(zhì)DUP。這篇文章主要介紹了匯編語言 dup偽指令的相關知識,需要的朋友可以參考下
    2020-01-01
  • 匯編語言中的函數(shù)調(diào)用參數(shù)傳遞及全局與局部變量與“基址”

    匯編語言中的函數(shù)調(diào)用參數(shù)傳遞及全局與局部變量與“基址”

    這篇文章主要介紹了匯編眼中的函數(shù)調(diào)用參數(shù)傳遞以及全局與局部變量與“基址”,本文通過圖文并茂的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 王爽 匯編語言學習筆記(詳細)

    王爽 匯編語言學習筆記(詳細)

    王爽匯編語言第三版是一款高清完整版的專業(yè)編程圖書,該書結構設計合理,內(nèi)容全面涵蓋知識點豐富,適合自學者使用,有需要者快來
    2020-01-01
  • 匯編語言mov指令及基本用法

    匯編語言mov指令及基本用法

    在匯編語言中,MOV指令是數(shù)據(jù)傳送指令,也是最基本的編程指令,用于將一個數(shù)據(jù)從源地址傳送到目標地址(寄存器間的數(shù)據(jù)傳送本質(zhì)上也是一樣的)。這篇文章給大家介紹匯編語言mov指令及基本用法,感興趣的朋友一起看看吧
    2020-01-01
  • 匯編實現(xiàn)直接插入排序的方法示例

    匯編實現(xiàn)直接插入排序的方法示例

    這篇文章主要介紹了匯編實現(xiàn)直接插入排序的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • 匯編語言指令大全 X86和X87匯編指令大全(帶注釋)

    匯編語言指令大全 X86和X87匯編指令大全(帶注釋)

    匯編指令集太多,如果不用就會忘記,所以將i處理器官方的指令集大全寫到博客上,有需要的人可以參考一下
    2021-10-10

最新評論