• <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>

            唐吉訶德

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              5 Posts :: 75 Stories :: 3 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(2)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            匯編中的寄存器說(shuō)明
            匯編語(yǔ)言和CPU以及內(nèi)存,端口等硬件知識(shí)是連在一起的. 這也是為什么匯編語(yǔ)言沒(méi)有通用性的原因. 下面簡(jiǎn)單講講基本知識(shí)(針對(duì)INTEL x86及其兼容機(jī)) ============================
            x86匯編語(yǔ)言的指令,其操作對(duì)象是CPU上的寄存器,系統(tǒng)內(nèi)存,或者立即數(shù). 有些指令表面上沒(méi)有操作數(shù), 或者看上去缺少操作數(shù), 其實(shí)該指令有內(nèi)定的操作對(duì)象, 比如push指令, 一定是對(duì)SS:ESP指定的內(nèi)存操作, 而cdq的操作對(duì)象一定是eax / edx. 在匯編語(yǔ)言中,寄存器用名字來(lái)訪問(wèn).
            CPU 寄存器有好幾類(lèi), 分別有不同的用處:
               1. 通用寄存器: EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(這個(gè)雖然通用,但很少被用做除了堆棧指針外的用途) 這些32位可以被用作多種用途,但每一個(gè)都有"專(zhuān)長(zhǎng)".
               EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器.
               EBX 是"基地址"(base)寄存器, 在內(nèi)存尋址時(shí)存放基地址.
               ECX 是計(jì)數(shù)器(counter), 是重復(fù)(REP)前綴指令和LOOP指令的內(nèi)定計(jì)數(shù)器.
               EDX是...(忘了..哈哈)但它總是被用來(lái)放整數(shù)除法產(chǎn)生的余數(shù). 這4個(gè)寄存器的低16位可以被單獨(dú)訪問(wèn),分別用AX,BX,CX和DX. AX又可以單獨(dú)訪問(wèn)低8位(AL)和高8位(AH), BX,CX,DX也類(lèi)似. 函數(shù)的返回值經(jīng)常被放在EAX中.
               ESI/EDI分別叫做"源/目標(biāo)索引寄存器"(source/destination index),因?yàn)樵诤芏嘧址僮髦噶钪?
               DS:ESI指向源串,而ES:EDI指向目標(biāo)串. EBP是"基址指針"(BASE POINTER), 它最經(jīng)常被用作高級(jí)語(yǔ)言函數(shù)調(diào)用的"框架指針"(frame pointer). 在破解的時(shí)候,經(jīng)??梢钥匆?jiàn)一個(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í)變量. ... 這樣一來(lái),EBP 構(gòu)成了該函數(shù)的一個(gè)框架, 在EBP上方分別是原來(lái)的EBP, 返回地址和參數(shù). EBP下方則是臨時(shí)變量. 函數(shù)返回時(shí)作 mov esp,ebp/pop ebp/ret 即可. ESP 專(zhuān)門(mén)用作堆棧指針.
            2. 段寄存器: CS(Code Segment,代碼段) 指定當(dāng)前執(zhí)行的代碼段
            EIP (Instruction pointer, 指令指針)則指向該段中一個(gè)具體的指令. CS:EIP指向哪個(gè)指令, CPU 就執(zhí)行它. 一般只能用jmp, ret, jnz, call 等指令來(lái)改變程序流程,而不能直接對(duì)它們賦值. DS(DATA SEGMENT, 數(shù)據(jù)段) 指定一個(gè)數(shù)據(jù)段. 注意:在當(dāng)前的計(jì)算機(jī)系統(tǒng)中, 代碼和數(shù)據(jù)沒(méi)有本質(zhì)差別, 都是一串二進(jìn)制數(shù), 區(qū)別只在于你如何用它. 例如, CS 制定的段總是被用作代碼, 一般不能通過(guò)CS指定的地址去修改該段. 然而,你可以為同一個(gè)段申請(qǐng)一個(gè)數(shù)據(jù)段描述符"別名"而通過(guò)DS來(lái)訪問(wèn)/修改. 自修改代碼的程序常如此做. 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一般不作為整體訪問(wèn), 而只對(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)志來(lái)決定是否要跳轉(zhuǎn), 從而實(shí)現(xiàn)條件分枝. 要注意,很多JXX 指令是等價(jià)的, 對(duì)應(yīng)相同的機(jī)器碼. 例如, JE 和JZ 是一樣的,都是當(dāng)Z=1是跳轉(zhuǎn). 只有JMP 是無(wú)條件跳轉(zhuǎn). JXX 指令分為兩組, 分別用于無(wú)符號(hào)操作和帶符號(hào)操作. JXX 后面的"XX" 有如下字母: 無(wú)符號(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)志沒(méi)有置位. 如JNZ "如果Z沒(méi)有置位則跳轉(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è)寫(xiě)入數(shù)據(jù)就是向端口寫(xiě)入數(shù)據(jù)。當(dāng)然這一切都必須遵循外設(shè)的工作方式。端口的地址空間與內(nèi)存地址空間無(wú)關(guān),系統(tǒng)總共提供對(duì)64K個(gè)8位端口的訪問(wèn),編號(hào)0-65535. 相鄰的8位端口可以組成成一個(gè)16位端口,相鄰的16位端口可以組成一個(gè)32位端口。端口輸入輸出由指令I(lǐng)N,OUT,INS和OUTS實(shí)現(xiàn),具體可參考匯編語(yǔ)言書(shū)籍


             

            posted on 2010-06-29 10:24 心羽 閱讀(518) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): assembly/disassembly
            久久无码一区二区三区少妇 | 久久精品中文字幕一区| 国产一区二区精品久久| 久久99精品国产99久久6| 久久这里有精品| 99精品伊人久久久大香线蕉| 亚洲欧美精品一区久久中文字幕| 伊人久久大香线蕉av一区| 国产情侣久久久久aⅴ免费| 久久亚洲2019中文字幕| 亚洲精品美女久久777777| 国内精品久久久久久久coent| 久久伊人精品一区二区三区| 91精品国产91久久久久久青草| 久久AV无码精品人妻糸列| 久久国产视频99电影| 好属妞这里只有精品久久| 久久妇女高潮几次MBA| 青春久久| 人妻中文久久久久| 久久夜色精品国产亚洲| 国产亚洲精品美女久久久| 久久青青草视频| 久久精品人妻一区二区三区| 91精品观看91久久久久久| 久久er热视频在这里精品| 天天爽天天狠久久久综合麻豆| 伊人久久大香线蕉精品不卡| 国产精品九九久久免费视频 | 久久av无码专区亚洲av桃花岛| 久久一区二区免费播放| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 91精品国产综合久久香蕉| 狠狠色丁香久久婷婷综合五月| 久久精品国产亚洲AV无码麻豆 | 久久99中文字幕久久| 狠狠色丁香婷婷综合久久来| 青青青青久久精品国产h| 四虎国产精品免费久久5151| 99久久精品国产一区二区蜜芽| 色综合久久久久网|