2.4通用寄存器下
本節(jié)必須掌握的知識(shí)點(diǎn):
u掌握DTDebug界面零蓉、并熟練使用
u熟記匯編窗口的組成及寄存器窗口的組成
u?MOV指令的熟練使用
u掌握字節(jié)匆骗、字奋蔚、雙字的知識(shí)
u使用匯編指令對(duì)8位屑柔、16位饲漾、32位寄存器數(shù)據(jù)的存儲(chǔ)
在2.3節(jié)中介紹通用寄存器的知識(shí),并且知道了寄存器是處理器(CPU)中用來(lái)存儲(chǔ)數(shù)據(jù)的地方钓辆。接下來(lái)我們借用軟件了解2.3節(jié)中的知識(shí)點(diǎn)剪验。
2.4.1【DTDebug軟件】
DTDebug.exe是供程序員使用的程序調(diào)試工具∏傲【本節(jié)只簡(jiǎn)單介紹DTDebug的使用功戚,詳細(xì)說(shuō)明書(shū)請(qǐng)到編程達(dá)人官網(wǎng)去下載相關(guān)文檔】
在2.1節(jié)中介紹DTDebug軟件的安裝步驟,相信大家已經(jīng)安裝好這個(gè)軟件似嗤。接下來(lái)介紹這個(gè)軟件的使用啸臀。
雙擊DTDebug.exe軟件圖標(biāo)如圖2-4-1所示,打開(kāi)界面如圖2-4-2所示烁落。
圖2-4-2是軟件的原始界面乘粒,沒(méi)有任何記錄。那該怎么把將要被調(diào)試的程序打開(kāi)哪伤塌?
有四種方式:
1灯萍、在如圖2-4-2程序窗口中找到File -> Open ->找到調(diào)試程序;
2每聪、直接將要被調(diào)試的程序拖拽到如圖2-4-2程序窗口中旦棉。
3、關(guān)閉如圖2-4-2窗口熊痴,把將要被調(diào)試的程序拖到如圖2-4-1DTDebug圖標(biāo)上他爸。
4、在如圖2-4-2程序窗口中找到File -> Attach ->找到將要被調(diào)試的程序(正在運(yùn)行的軟件)果善。
以IPMGS.exe為例诊笤,介紹DTDebug界面,如圖2-4-3巾陕,圖2-4-4所示讨跟。
圖2-4-4中標(biāo)注的4個(gè)窗口,分別為匯編窗口鄙煤、寄存器窗口晾匠、內(nèi)存窗口、堆棧窗口梯刚。
【本節(jié)中只是簡(jiǎn)單介紹凉馆,更深入的操作以后課程會(huì)介紹】
?2.4.2【匯編窗口】
???簡(jiǎn)單介紹匯編窗口,匯編窗口由內(nèi)存、特征碼澜共、匯編向叉、標(biāo)注區(qū)(從左向右)這四塊組成∴露【在本節(jié)這三塊不做介紹】
一個(gè)程序運(yùn)行以后母谎,處理器會(huì)一行行的執(zhí)行它的代碼,如圖2-4-4處理器會(huì)沿著匯編窗口從上往下一行行執(zhí)行代碼京革,直至結(jié)束奇唤。跟著操作時(shí)肯定會(huì)有如下疑問(wèn),首先沒(méi)有看到被調(diào)試的程序運(yùn)行匹摇,其次匯編窗口并沒(méi)有從上往下一行行執(zhí)行代碼咬扇。接下來(lái)解答一下,DTDebug軟件是可以中斷當(dāng)前運(yùn)行的程序的来惧,如圖2-4-4黃色區(qū)域中寫(xiě)著Paused
表示當(dāng)前程序是被中斷的冗栗,其次接著看圖2-4-4匯編窗口中有黑色區(qū)域表示當(dāng)前被調(diào)試的程序被中斷在這塊內(nèi)存區(qū)域。該塊區(qū)域是被調(diào)試程序的入口點(diǎn)供搀。【文中講到的中斷指:處理器運(yùn)行到該段程序時(shí)钠至,讓該程序停止運(yùn)行了】葛虐。 那怎么讓程序一行行往下執(zhí)行哪?看圖2-4-4中有一個(gè)三角符號(hào)
棉钧,按下程序?qū)?huì)一行行往下執(zhí)行屿脐,此時(shí)被調(diào)試的程序就會(huì)運(yùn)行起來(lái)。
接下來(lái)介紹寄存器窗口宪卿。如圖2-4-4寄存器窗口所示的诵。
2.4.3【寄存器窗口】
簡(jiǎn)單介紹寄存器窗口,寄存器窗口由EAX佑钾、ECX西疤、EDX、EBX休溶、ESP代赁、EBP、ESI兽掰、EDI這8個(gè)通用寄存器芭碍,還有EIP寄存器、EFLAGS寄存器及它們相對(duì)應(yīng)存儲(chǔ)的數(shù)值孽尽。
EIP窖壕、EFLAGS寄存器與8個(gè)通用寄存器的區(qū)別在于,以EAX寄存器為例,EAX寄存器可以任意讀寫(xiě)數(shù)據(jù)瞻讽,而EIP寄存器狐蜕,它的作用是存放當(dāng)前代碼段即將被執(zhí)行的下一條指令的地址,不可以隨意讀寫(xiě)卸夕,如圖2-4-4寄存器窗口所示层释,EIP當(dāng)前存儲(chǔ)的值為:004185B7,看匯編窗口黑色區(qū)域和EIP存儲(chǔ)的值是一樣的快集。那么EFLAGS是標(biāo)志寄存器贡羔,它是受特殊匯編指令的控制,特殊匯編指令決定它當(dāng)前數(shù)值位的變化个初,【本節(jié)不做詳細(xì)介紹乖寒,內(nèi)存窗口和堆棧窗口本節(jié)不做介紹】。
寄存器窗口簡(jiǎn)單介紹完了院溺,那怎么用通用寄存器哪楣嘁?在介紹使用之前先介紹一個(gè)指令。
2.4.4【MOV指令】
MOV指令是移動(dòng)數(shù)據(jù)珍逸。MOV指令可以把立即數(shù)移動(dòng)到寄存器逐虚,也可以把寄存器的數(shù)據(jù)移動(dòng)到寄存器。
例:
MOV EAX,1 ???(把1移動(dòng)到EAX寄存器里)
????MOV EAX,ECX (把ECX寄存器的數(shù)據(jù)移動(dòng)到EAX寄存器里)
用DTDebug軟件把例題操作一遍谆膳。首先打開(kāi)軟件如圖2-4-4所示叭爱,將鼠標(biāo)移動(dòng)到匯編窗口,雙擊黑色區(qū)域所對(duì)應(yīng)的那一行匯編代碼漱病,彈出輸入指令窗口如圖2-4-5所示买雾,把鼠標(biāo)移動(dòng)到輸入窗口中,將里面的指令編寫(xiě)成:MOV EAX,1如圖2-4-6所示杨帽,點(diǎn)擊Enter鍵漓穿,匯編指令將被顯示到匯編窗口,如圖2-4-7所示注盈。MOV EAX,ECX重復(fù)以上的操作晃危。完成后按F8執(zhí)行,觀察寄存器窗口当凡,如圖2-4-8山害、圖2-4-9所示。
彈出輸入指令窗口
輸入指令:MOV EAX,1
??????????????輸完指令點(diǎn)擊鍵盤(pán)Enter鍵?????????????????????????????????????????????????????????????????????????????????????????????????
F8單步運(yùn)行
?????????????????????F8單步運(yùn)行
簡(jiǎn)單介紹完了MOV指令沿量,通過(guò)對(duì)MOV指令的編寫(xiě)浪慌、運(yùn)行,寄存器相對(duì)應(yīng)存儲(chǔ)的數(shù)據(jù)發(fā)生了變化朴则,那這些數(shù)據(jù)是怎么存儲(chǔ)的哪权纤?接下來(lái)介紹數(shù)據(jù)在通用寄存器中的存儲(chǔ)钓简。
2.4.5【通用寄存器對(duì)數(shù)據(jù)的存儲(chǔ)】
先回顧一下8位、16位汹想、32位通用寄存器外邓。
如通用寄存器表所示。
根據(jù)圖2-4-9寄存器窗口所示古掏,EAX對(duì)應(yīng)的數(shù)據(jù)是:0x0012FFB0.只有8個(gè)數(shù)據(jù)损话。而EAX是32位的,它是怎么存儲(chǔ)的哪槽唾?
這里要回顧一下字節(jié)丧枪、字、雙字這個(gè)知識(shí)點(diǎn)庞萍。
字節(jié):記為Byte,一個(gè)字節(jié)由8個(gè)bit組成拧烦,可以存在8位寄存器中。
字:記為Word,一個(gè)字由兩個(gè)字節(jié)組成钝计,這兩個(gè)字節(jié)分別為這個(gè)字的高位字節(jié)和低位字節(jié)恋博,可以存在16位寄存器中。
雙字:記為DoubleWord,一個(gè)雙字由2個(gè)字組成私恬,這兩個(gè)字分別為這個(gè)雙字的高位字和低位字债沮,可以存在32位寄存器中。
?????一個(gè)雙字可以存在一個(gè)32位寄存器中践付,這個(gè)雙字由高位字和低位字組成秦士。低位字可以存放16位寄存器,而16位寄存器永高,由兩個(gè)字節(jié)組成,這個(gè)高位字節(jié)和低位字節(jié)自然就存在這個(gè)寄存器的高8位寄存器和低8位寄存器中提针。
以EAX寄存器為例命爬,如圖2-4-10所示。
圖2-4-10 EAX寄存器邏輯結(jié)構(gòu)圖
????知道了字節(jié)辐脖、字饲宛、雙字,在看寄存器窗口中的數(shù)據(jù)相信大家知道它是怎麼存儲(chǔ)了的嗜价。
接下來(lái)用匯編指令來(lái)實(shí)現(xiàn)對(duì)8位艇抠、16位、32位寄存器進(jìn)行存儲(chǔ)久锥。
以下例題自己在軟件中實(shí)驗(yàn)家淤,增強(qiáng)寄存器對(duì)數(shù)據(jù)存儲(chǔ)的認(rèn)識(shí),其次可以加強(qiáng)對(duì)MOV指令的練習(xí)瑟由,再者多熟悉該軟件絮重,我們以后的章節(jié)都會(huì)用到。
例:
?????MOV AL,1
?????MOV AH,2
?????MOV AX,0xFFFF
?????MOV EAX,0xFFFF0000
?????MOV CL,1
?????MOV CH,2
?????MOV CX,0xFFFF
?????MOV ECX,0xFFFF0000
u下一節(jié)介紹內(nèi)存。
練習(xí):
?????1青伤、MOV EAX,200
????????MOV EAX,CX ?可以這樣操作嗎督怜?對(duì)嗎?大家思考一下
????????MOV CL,300 ?這個(gè)指令是錯(cuò)誤的嗎狠角?思考一下為什么錯(cuò)号杠?怎樣寫(xiě)才正確
????????MOV ECX,EAX 說(shuō)出哪個(gè)是源操作數(shù)、哪個(gè)是目的操作數(shù)丰歌、哪個(gè)是操作碼
?????2姨蟋、能夠正確理解字節(jié)、字动遭、雙字芬探,且可以用匯編指令對(duì)8位寄存器的高位、低位熟練的操作厘惦,熟練對(duì)16位偷仿、32位寄存器正確存儲(chǔ)數(shù)據(jù)。?????