• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
             

            1. 通用寄存器:

            EAX

            (accumulator)"累加器",很多加法乘法指令的缺省寄存器.

            EBX

            (base)"基地址"寄存器, 在內(nèi)存尋址時(shí)存放基地址.

             

            ECX

            (counter)計(jì)數(shù)器, 是重復(fù)(REP)前綴指令和LOOP指令的內(nèi)定計(jì)數(shù)

            EDX

            用來放整數(shù)除法產(chǎn)生的余數(shù).

            低16位:AX,BX,CX和DX

            低8位 :AL,BL,CL和DL

            高8位 :AH,BH,CH和DH

            ESI

            (source index)"源索引寄存器", DS:ESI指向源串,如:字符串操作指令中,

            EDI

            (destination index)"目標(biāo)索引寄存器",ES:EDI指向目標(biāo)串

            EBP

            (BASE POINTER)"基址指針",被用作高級(jí)語言函數(shù)調(diào)用的

            ,ESP(這個(gè)雖然通用,但
            很少被用做除了堆棧指針外的用途) 這些32位可以被用作多種4個(gè)寄存器的又可

             函數(shù)的返回值經(jīng)常被放在EAX中. ESI/EDI分別叫做"源/目標(biāo)索引寄存器"(source/destination index

            ),因?yàn)樵诤芏嘧址僮髦噶钪? DS:ESI指向源串,而. EBP是"基址指針"(BASE POINTER), 它最經(jīng)常"

            框架指針"(frame pointer). 在破解的時(shí)候,經(jīng)常可以看見一個(gè)標(biāo)準(zhǔn)的函數(shù)起始代碼: push ebp ;保存當(dāng)前ebp mov ebp,esp ;EBP設(shè)為當(dāng)前堆棧指針

            sub esp, xxx ;預(yù)留xxx字節(jié)給函數(shù)臨時(shí)變量. ... 這樣一來,EBP 構(gòu)成了該函數(shù)的一個(gè)框架, 在EBP上方分別是原來的EBP, 返回地址和參數(shù). EBP下

            方則是臨時(shí)變量. 函數(shù)返回時(shí)作 mov esp,ebp/pop ebp/ret 即可. ESP 專門用作堆棧指針. 2. 段寄存器: CS(Code Segment,代碼段) 指定當(dāng)前執(zhí)

            行的代碼段. EIP (Instruction pointer, 指令指針)則指向該段中一個(gè)具體的指令. CS:EIP指向哪個(gè)指令, CPU 就執(zhí)行它. 一般只能用jmp, ret,

            jnz, call 等指令來改變程序流程,而不能直接對(duì)它們賦值. DS(DATA SEGMENT, 數(shù)據(jù)段) 指定一個(gè)數(shù)據(jù)段. 注意:在當(dāng)前的計(jì)算機(jī)系統(tǒng)中, 代碼和數(shù)

            據(jù)沒有本質(zhì)差別, 都是一串二進(jìn)制數(shù), 區(qū)別只在于你如何用它. 例如, CS 制定的段總是被用作代碼, 一般不能通過CS指定的地址去修改該段. 然而

            ,你可以為同一個(gè)段申請一個(gè)數(shù)據(jù)段描述符"別名"而通過DS來訪問/修改. 自修改代碼的程序常如此做. ES,FS,GS 是輔助的段寄存器, 指定附加的數(shù)

            據(jù)段. SS(STACK SEGMENT)指定當(dāng)前堆棧段. ESP 則指出該段中當(dāng)前的堆棧頂. 所有push/pop 系列指令都只對(duì)SS:ESP指出的地址進(jìn)行操作. 3. 標(biāo)志

            寄存器(EFLAGS): 該寄存器有32位,組合了各個(gè)系統(tǒng)標(biāo)志. EFLAGS一般不作為整體訪問, 而只對(duì)單一的標(biāo)志位感興趣. 常用的標(biāo)志有: 進(jìn)位標(biāo)志C(

            CARRY), 在加法產(chǎn)生進(jìn)位或減法有借位時(shí)置1, 否則為0. 零標(biāo)志Z(ZERO), 若運(yùn)算結(jié)果為0則置1, 否則為0 符號(hào)位S(SIGN), 若運(yùn)算結(jié)果的最高位置

            1, 則該位也置1. 溢出標(biāo)志O(OVERFLOW), 若(帶符號(hào))運(yùn)算結(jié)果超出可表示范圍, 則置1. JXX 系列指令就是根據(jù)這些標(biāo)志來決定是否要跳轉(zhuǎn), 從而

            實(shí)現(xiàn)條件分枝. 要注意,很多JXX 指令是等價(jià)的, 對(duì)應(yīng)相同的機(jī)器碼. 例如, JE 和JZ 是一樣的,都是當(dāng)Z=1是跳轉(zhuǎn). 只有JMP 是無條件跳轉(zhuǎn). JXX 指

            令分為兩組, 分別用于無符號(hào)操作和帶符號(hào)操作. JXX 后面的"XX" 有如下字母: 無符號(hào)操作: 帶符號(hào)操作: A = "ABOVE", 表示"高于" G = "

            GREATER", 表示"大于" B = "BELOW", 表示"低于" L = "LESS", 表示"小于" C = "CARRY", 表示"進(jìn)位"或"借位" O = "OVERFLOW", 表示"溢出" S

            = "SIGN", 表示"負(fù)" 通用符號(hào): E = "EQUAL" 表示"等于", 等價(jià)于Z (ZERO) N = "NOT" 表示"非", 即標(biāo)志沒有置位. 如JNZ "如果Z沒有置位則跳

            轉(zhuǎn)" Z = "ZERO", 與E同. 如果仔細(xì)想一想,就會(huì)發(fā)現(xiàn) JA = JNBE, JAE = JNB, JBE = JNA, JG = JNLE, JGE= JNL, JL= JNGE, .... 4. 端口 端口

            是直接和外部設(shè)備通訊的地方。外設(shè)接入系統(tǒng)后,系統(tǒng)就會(huì)把外設(shè)的數(shù)據(jù)接口映射到特定的端口地址空間,這樣,從該端口讀入數(shù)據(jù)就是從外設(shè)讀

            入數(shù)據(jù),而向外設(shè)寫入數(shù)據(jù)就是向端口寫入數(shù)據(jù)。當(dāng)然這一切都必須遵循外設(shè)的工作方式。端口的地址空間與內(nèi)存地址空間無關(guān),系統(tǒng)總共提供對(duì)

            64K個(gè)8位端口的訪問,編號(hào)0-65535. 相鄰的8位端口可以組成成一個(gè)16位端口,相鄰的16位端口可以組成一個(gè)32位端口。端口輸入輸出由指令

            IN,OUT,INS和OUTS實(shí)現(xiàn),具體可參考匯編語言書籍。

             

            中央處理器(CPU)在微機(jī)系統(tǒng)處于“領(lǐng)導(dǎo)核心”的地位。匯編語言被編譯成機(jī)器語言之后,將由處理器來執(zhí)行。那么,首先讓我們來了解一下處理器的主要作用,這將幫助你更好地駕馭它。

            典型的處理器的主要任務(wù)包括
            • 從內(nèi)存中獲取機(jī)器語言指令,譯碼,執(zhí)行
            • 根據(jù)指令代碼管理它自己的寄存器
            • 根據(jù)指令或自己的的需要修改內(nèi)存的內(nèi)容
            • 響應(yīng)其他硬件的中斷請求

            一般說來,處理器擁有對(duì)整個(gè)系統(tǒng)的所有總線的控制權(quán)。對(duì)于Intel平臺(tái)而言,處理器擁有對(duì)數(shù)據(jù)、內(nèi)存和控制總線的控制權(quán),根據(jù)指令控制整個(gè)計(jì)算機(jī)的運(yùn)行。在以后的章節(jié)中,我們還將討論系統(tǒng)中同時(shí)存在多個(gè)處理器的情況。

            處理器中有一些寄存器,這些寄存器可以保存特定長度的數(shù)據(jù)。某些寄存器中保存的數(shù)據(jù)對(duì)于系統(tǒng)的運(yùn)行有特殊的意義。

            新的處理器往往擁有更多、具有更大字長的寄存器,提供更靈活的取指、尋址方式。

            寄存器

            如前所述,處理器中有一些可以保存數(shù)據(jù)的地方被稱作寄存器。

            寄存器可以被裝入數(shù)據(jù),你也可以在不同的寄存器之間移動(dòng)這些數(shù)據(jù),或者做類似的事情。基本上,像四則運(yùn)算、位運(yùn)算等這些計(jì)算操作,都主要是針對(duì)寄存器進(jìn)行的。

            首先讓我來介紹一下80386上最常用的4個(gè)通用寄存器。先瞧瞧下面的圖形,試著理解一下:

            上圖中,數(shù)字表示的是位。我們可以看出,EAX是一個(gè)32-bit寄存器。同時(shí),它的低16-bit又可以通過AX這個(gè)名字來訪問;AX又被分為高、低8bit兩部分,分別由AH和AL來表示。

            對(duì)于EAX、AX、AH、AL的改變同時(shí)也會(huì)影響與被修改的那些寄存器的值。從而事實(shí)上只存在一個(gè)32-bit的寄存器EAX,而它可以通過4種不同的途徑訪問。

            也許通過名字能夠更容易地理解這些寄存器之間的關(guān)系。EAX中的E的意思是“擴(kuò)展的”,整個(gè)EAX的意思是擴(kuò)展的AX。X的意思Intel沒有明示,我個(gè)人認(rèn)為表示它是一個(gè)可變的量 。而AH、AL中的H和L分別代表高和低 。

            為什么要這么做呢?主要由于歷史原因。早期的計(jì)算機(jī)是8位的,8086是第一個(gè)16位處理器,其通用寄存器的名字是AX,BX等等;80386是Intel推出的第一款I(lǐng)A-32系列處理器,所有的寄存器都被擴(kuò)充為32位。為了能夠兼容以前的16位應(yīng)用程序,80386不能將這些寄存器依舊命名為AX、BX,并且簡單地將他們擴(kuò)充為32位——這將增加處理器在處理指令方面的成本。

            Intel微處理器的寄存器列表(在本章先只介紹80386的寄存器,MMX寄存器以及其他新一代處理器的新寄存器將在以后的章節(jié)介紹)

            通用寄存器
            下面介紹通用寄存器及其習(xí)慣用法。顧名思義,通用寄存器是那些你可以根據(jù)自己的意愿使用的寄存器,修改他們的值通常不會(huì)對(duì)計(jì)算機(jī)的運(yùn)行造成很大的影響。通用寄存器最多的用途是計(jì)算。

            EAX
            32-bit寬

            通用寄存器。相對(duì)其他寄存器,在進(jìn)行運(yùn)算方面比較常用。在保護(hù)模式中,也可以作為內(nèi)存偏移指針(此時(shí),DS作為段 寄存器或選擇器)

            EBX
            32-bit寬

            通用寄存器。通常作為內(nèi)存偏移指針使用(相對(duì)于EAX、ECX、EDX),DS是默認(rèn)的段寄存器或選擇器。在保護(hù)模式中,同樣可以起這個(gè)作用。

            ECX
            32-bit寬

            通用寄存器。通常用于特定指令的計(jì)數(shù)。在保護(hù)模式中,也可以作為內(nèi)存偏移指針(此時(shí),DS作為 寄存器或段選擇器)。

            EDX
            32-bit寬

            通用寄存器。在某些運(yùn)算中作為EAX的溢出寄存器(例如乘、除)。在保護(hù)模式中,也可以作為內(nèi)存偏移指針(此時(shí),DS作為段 寄存器或選擇器)。

            上述寄存器同EAX一樣包括對(duì)應(yīng)的16-bit和8-bit分組。

            用作內(nèi)存指針的特殊寄存器

            ESI
            32-bit寬

            通常在內(nèi)存操作指令中作為“源地址指針”使用。當(dāng)然,ESI可以被裝入任意的數(shù)值,但通常沒有人把它當(dāng)作通用寄存器來用。DS是默認(rèn)段寄存器或選擇器。

            EDI
            32-bit寬

            通常在內(nèi)存操作指令中作為“目的地址指針”使用。當(dāng)然,EDI也可以被裝入任意的數(shù)值,但通常沒有人把它當(dāng)作通用寄存器來用。DS是默認(rèn)段寄存器或選擇器。

            EBP
            32-bit寬

            這也是一個(gè)作為指針的寄存器。通常,它被高級(jí)語言編譯器用以建造‘堆棧幀’來保存函數(shù)或過程的局部變量,不過,還是那句話,你可以在其中保存你希望的任何數(shù)據(jù)。SS是它的默認(rèn)段寄存器或選擇器。

            注意,這三個(gè)寄存器沒有對(duì)應(yīng)的8-bit分組。換言之,你可以通過SI、DI、BP作為別名訪問他們的低16位,卻沒有辦法直接訪問他們的低8位。

            段寄存器和選擇器

            實(shí)模式下的段寄存器到保護(hù)模式下?lián)u身一變就成了選擇器。不同的是,實(shí)模式下的“段寄存器”是16-bit的,而保護(hù)模式下的選擇器是32-bit的。

            CS 代碼段,或代碼選擇器。同IP寄存器(稍后介紹)一同指向當(dāng)前正在執(zhí)行的那個(gè)地址。處理器執(zhí)行時(shí)從這個(gè)寄存器指向的段(實(shí)模式)或內(nèi)存(保護(hù)模式)中獲取指令。除了跳轉(zhuǎn)或其他分支指令之外,你無法修改這個(gè)寄存器的內(nèi)容。
            DS 數(shù)據(jù)段,或數(shù)據(jù)選擇器。這個(gè)寄存器的低16 bit連同ESI一同指向的指令將要處理的內(nèi)存。同時(shí),所有的內(nèi)存操作指令 默認(rèn)情況下都用它指定操作段(實(shí)模式)或內(nèi)存(作為選擇器,在保護(hù)模式。這個(gè)寄存器可以被裝入任意數(shù)值,然而在這么做的時(shí)候需要小心一些。方法是,首先把數(shù)據(jù)送給AX,然后再把它從AX傳送給DS(當(dāng)然,也可以通過堆棧來做).
            ES 附加段,或附加選擇器。這個(gè)寄存器的低16 bit連同EDI一同指向的指令將要處理的內(nèi)存。同樣的,這個(gè)寄存器可以被裝入任意數(shù)值,方法和DS類似。
            FS F段或F選擇器(推測F可能是Free?)。可以用這個(gè)寄存器作為默認(rèn)段寄存器或選擇器的一個(gè)替代品。它可以被裝入任何數(shù)值,方法和DS類似。
            GS G段或G選擇器(G的意義和F一樣,沒有在Intel的文檔中解釋)。它和FS幾乎完全一樣。
            SS 堆棧段或堆棧選擇器。這個(gè)寄存器的低16 bit連同ESP一同指向下一次堆棧操作(push和pop)所要使用的堆棧地址。這個(gè)寄存器也可以被裝入任意數(shù)值,你可以通過入棧和出棧操作來給他賦值,不過由于堆棧對(duì)于很多操作有很重要的意義,因此,不正確的修改有可能造成對(duì)堆棧的破壞。

            * 注意 一定不要在初學(xué)匯編的階段把這些寄存器弄混。他們非常重要,而一旦你掌握了他們,你就可以對(duì)他們做任意的操作了。段寄存器,或選擇器,在沒有指定的情況下都是使用默認(rèn)的那個(gè)。這句話在現(xiàn)在看來可能有點(diǎn)稀里糊涂,不過你很快就會(huì)在后面知道如何去做。

            特殊寄存器(指向到特定段或內(nèi)存的偏移量):

            EIP 這個(gè)寄存器非常的重要。這是一個(gè)32位寬的寄存器 ,同CS一同指向即將執(zhí)行的那條指令的地址。不能夠直接修改這個(gè)寄存器的值,修改它的唯一方法是跳轉(zhuǎn)或分支指令。(CS是默認(rèn)的段或選擇器)
            ESP 這個(gè)32位寄存器指向堆棧中即將被操作的那個(gè)地址。盡管可以修改它的值,然而并不提倡這樣做,因?yàn)槿绻悴皇欠浅C靼鬃约涸谧鍪裁矗敲茨憧赡茉斐啥褩5钠茐摹?duì)于絕大多數(shù)情況而言,這對(duì)程序是致命的。(SS是默認(rèn)的段或選擇器)

            IP: Instruction Pointer, 指令指針
            SP: Stack Pointer, 堆棧指針

            好了,上面是最基本的寄存器。下面是一些其他的寄存器,你甚至可能沒有聽說過它們。(都是32位寬):

            CR0, CR2, CR3(控制寄存器)。舉一個(gè)例子,CR0的作用是切換實(shí)模式和保護(hù)模式。

            還有其他一些寄存器,D0, D1, D2, D3, D6和D7(調(diào)試寄存器)。他們可以作為調(diào)試器的硬件支持來設(shè)置條件斷點(diǎn)。

            TR3, TR4, TR5, TR6 和 TR? 寄存器(測試寄存器)用于某些條件測試。

            最后我們要說的是一個(gè)在程序設(shè)計(jì)中起著非常關(guān)鍵的作用的寄存器:標(biāo)志寄存器。

            Posted on 2005-11-11 13:06 艾凡赫 閱讀(1653) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 基礎(chǔ)知識(shí)
            久久精品女人天堂AV麻| 久久精品人成免费| 欧美日韩中文字幕久久久不卡| 国产精品无码久久四虎| 亚洲国产成人久久综合野外| 国内精品九九久久精品| 欧美久久精品一级c片片| 开心久久婷婷综合中文字幕| 久久久噜噜噜久久熟女AA片| 久久综合丝袜日本网| 精品国产日韩久久亚洲| 国产亚洲精久久久久久无码 | 久久久久四虎国产精品| 欧美一级久久久久久久大| 精品人妻久久久久久888| 欧美一级久久久久久久大| 国产精品久久久久天天影视| 久久国产欧美日韩精品| 一本久久a久久精品综合夜夜 | 久久精品国产亚洲av影院| 香蕉久久久久久狠狠色| 99热热久久这里只有精品68| 久久精品国产亚洲AV电影| 性做久久久久久久久久久| 国产一区二区精品久久凹凸 | 国产精品一区二区久久精品无码| 亚洲欧洲日产国码无码久久99| 无码任你躁久久久久久| 久久精品国产一区二区三区| 99久久精品免费看国产| 精品无码久久久久久午夜| 久久久国产精品亚洲一区| 久久婷婷五月综合97色直播| 色狠狠久久综合网| 日韩精品无码久久一区二区三| 久久电影网| 久久久久久无码国产精品中文字幕 | 99久久国产主播综合精品| 久久精品国内一区二区三区| 亚洲一区中文字幕久久| 国产精自产拍久久久久久蜜 |