最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

什么是匯編語言

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

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

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

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

匯編與二進制的關(guān)系

換句話來說,匯編語言就是把給機器看的二進制編碼翻譯成人話,匯編指令是機器指令的助記符,與機器指令是一一對應(yīng)的關(guān)系,是一種便于閱讀和記憶的書寫格式。有效地解決了機器指令編寫程序難度大的問題,并且使用編譯器,可以很方便的把匯編程序轉(zhuǎn)譯成機器指令程序,比如之前提到的 00000011 加法指令,對應(yīng)的匯編指令是 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)存快很多,但是還是無法使用飛速運轉(zhuǎn)的 CPU,所以才會有寄存器的存在。

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

存取速度比較

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

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

寄存器分類

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

我們常說的32位、64位 CPU 是指數(shù)據(jù)總線的寬度或根數(shù),而寄存器是暫存數(shù)據(jù)和中間結(jié)果的單元,因此寄存器的位數(shù)也就是處理數(shù)據(jù)的長度與數(shù)據(jù)總線的根數(shù)是相同的,所以32位 CPU 對應(yīng)的寄存器也應(yīng)該是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ù)運算與數(shù)據(jù)傳送 SP
EBP 基址指針(Base Point)寄存器 只做堆棧指針, 可以訪問堆棧內(nèi)任意地址, 經(jīng)常用于中轉(zhuǎn) ESP 中的數(shù)據(jù), 也常以它為基址來訪問堆棧; 不能用于算術(shù)運算與數(shù)據(jù)傳送 BP

寄存器EAX、AX、AH、AL的關(guān)系

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

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

算術(shù)運算指令

指令 名稱 示例 備注
ADD 加法指令 ADD dest, src 在dest基礎(chǔ)上加src
SUB 減法指令 SUB dest, src 在dest基礎(chǔ)上減src
INC 加1指令 INC dest 在dest基礎(chǔ)上加1
DEC 減1指令 DEC dest 在dest基礎(chǔ)上減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的時候跳轉(zhuǎn)至label,否則執(zhí)行LOOP之后的語句

轉(zhuǎn)移指令

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

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

前面說到 linuxwindows 下的匯編語法是不同的,其實兩種語法的不同和系統(tǒng)不同沒有絕對的關(guān)系,一般在 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)

總結(jié)

匯編指令是機器指令的助記符,與機器指令是一一對應(yīng)的

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

常用寄存器:EAXEBX、ECX、EDX、EDI、ESIEBP、ESP

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

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

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

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

相關(guān)文章

  • 匯編語言中move指令的使用

    匯編語言中move指令的使用

    MOV指令是在ARM匯編語言中用于將數(shù)據(jù)從一個位置或寄存器復制到另一個位置或寄存器的指令,本文就來詳細的介紹一下move指令,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 匯編語言指令集學習CMPXCHG比較并交換操作指令詳解

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

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

    匯編 JCC指令表與筆記

    這篇文章主要介紹了匯編 JCC指令表與筆記,需要的朋友可以參考下
    2020-01-01
  • 匯編語言系列之匯編實現(xiàn)字符串操作

    匯編語言系列之匯編實現(xiàn)字符串操作

    本文列出了字符串匹配和字符串輸入顯示的代碼,對匯編語言系列之匯編實現(xiàn)字符串操作相關(guān)知識感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • 匯編語言實現(xiàn)打印楊輝三角

    匯編語言實現(xiàn)打印楊輝三角

    這篇文章主要介紹了匯編語言實現(xiàn)打印楊輝三角,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • 8086匯編語言nasm版本

    8086匯編語言nasm版本

    這篇文章主要介紹了8086匯編語言nasm版本,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • 匯編語言系列之匯編實現(xiàn)各種碼制的轉(zhuǎn)換(思路詳解)

    匯編語言系列之匯編實現(xiàn)各種碼制的轉(zhuǎn)換(思路詳解)

    本文列出了十六進制轉(zhuǎn)二進制、十進制、ASCII碼及大小寫字母轉(zhuǎn)換的代碼,對匯編語言系列之實現(xiàn)各種碼制的轉(zhuǎn)換問題感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • 匯編實現(xiàn)冒泡排序的方法示例

    匯編實現(xiàn)冒泡排序的方法示例

    這篇文章主要介紹了匯編實現(xiàn)冒泡排序的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • 通過匯編看golang函數(shù)的多返回值問題

    通過匯編看golang函數(shù)的多返回值問題

    這篇文章主要介紹了通過匯編看golang函數(shù)的多返回值問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 匯編語言 跳轉(zhuǎn)指令與C語言的條件分支

    匯編語言 跳轉(zhuǎn)指令與C語言的條件分支

    這篇文章主要介紹了匯編語言 跳轉(zhuǎn)指令與C語言的條件分支,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03

最新評論

乌拉特前旗| 贺州市| 略阳县| 永宁县| 汤原县| 龙泉市| 娄烦县| 渭源县| 宿松县| 长治市| 开封县| 会宁县| 东城区| 蒙城县| 乐都县| 庆元县| 库伦旗| 峨山| 西宁市| 花莲县| 荔波县| 大兴区| 南汇区| 姜堰市| 额尔古纳市| 安多县| 潼南县| 青冈县| 龙山县| 衡水市| 商城县| 铁岭市| 阳城县| 汽车| 清涧县| 永寿县| 安西县| 贵德县| 佛坪县| 永清县| 历史|