回答這個問題前需要先介紹一款調(diào)試工具DTdebug.EXE以便我們通過實驗來驗證。在電腦旁的同學(xué)可以自己親自動手實驗一下,實踐出真知,掌握本質(zhì)對于學(xué)習(xí)計算機的同學(xué)來說還是很有意思的。
如果要真正明白,必須要掌握以下的知識點:
掌握DTDebug界面、并熟練使用
1、熟記匯編窗口的組成及寄存器窗口的組成
2、MOV指令的熟練使用
3、掌握字節(jié)、字、雙字的知識
4、使用匯編指令對8位、16位、32位寄存器數(shù)據(jù)的存儲
寄存器是處理器(CPU)中用來存儲數(shù)據(jù)的地方。接下來我們借用【DTDebug軟件】來分析。
DTDebug.exe是供程序員使用的程序調(diào)試工具。【本節(jié)只簡單介紹DTDebug的使用,詳細說明書請到編程達人官網(wǎng)去下載相關(guān)文檔】
雙擊DTDebug.exe軟件圖標(biāo)如圖2-4-1所示,打開界面如圖2-4-2所示。
圖2-4-2是軟件的原始界面,沒有任何記錄。那該怎么把將要被調(diào)試的程序打開哪?
有四種方式:
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)試的程序(正在運行的軟件)。
以IPMGS.exe為例,介紹DTDebug界面,如圖2-4-3,圖2-4-4所示。
圖2-4-4中標(biāo)注的4個窗口,分別為匯編窗口、寄存器窗口、內(nèi)存窗口、堆棧窗口。
【匯編窗口】
簡單介紹匯編窗口,匯編窗口由內(nèi)存、特征碼、匯編、標(biāo)注區(qū)(從左向右)這四塊組成。【在本節(jié)這三塊不做介紹】
一個程序運行以后,處理器會一行行的執(zhí)行它的代碼,如圖2-4-4處理器會沿著匯編窗口從上往下一行行執(zhí)行代碼,直至結(jié)束。跟著操作時肯定會有如下疑問,首先沒有看到被調(diào)試的程序運行,其次匯編窗口并沒有從上往下一行行執(zhí)行代碼。接下來解答一下,DTDebug軟件是可以中斷當(dāng)前運行的程序的,如圖2-4-4黃色區(qū)域中寫著Paused表示當(dāng)前程序是被中斷的,其次接著看圖2-4-4匯編窗口中有黑色區(qū)域表示當(dāng)前被調(diào)試的程序被中斷在這塊內(nèi)存區(qū)域。該塊區(qū)域是被調(diào)試程序的入口點。【文中講到的中斷指:處理器運行到該段程序時,讓該程序停止運行了】。那怎么讓程序一行行往下執(zhí)行哪?看圖2-4-4中有一個三角符號
按下程序?qū)恍行型聢?zhí)行,此時被調(diào)試的程序就會運行起來。
接下來介紹寄存器窗口。如圖2-4-4寄存器窗口所示。
【寄存器窗口】
簡單介紹寄存器窗口,寄存器窗口由EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI這8個通用寄存器,還有EIP寄存器、EFLAGS寄存器及它們相對應(yīng)存儲的數(shù)值。
EIP、EFLAGS寄存器與8個通用寄存器的區(qū)別在于,以EAX寄存器為例,EAX寄存器可以任意讀寫數(shù)據(jù),而EIP寄存器,它的作用是存放當(dāng)前代碼段即將被執(zhí)行的下一條指令的地址,不可以隨意讀寫,如圖2-4-4寄存器窗口所示,EIP當(dāng)前存儲的值為:004185B7,看匯編窗口黑色區(qū)域和EIP存儲的值是一樣的。那么EFLAGS是標(biāo)志寄存器,它是受特殊匯編指令的控制,特殊匯編指令決定它當(dāng)前數(shù)值位的變化。
寄存器窗口簡單介紹完了,那怎么用通用寄存器哪?在介紹使用之前先介紹一個指令。
【MOV指令】
MOV指令是移動數(shù)據(jù)。MOV指令可以把立即數(shù)移動到寄存器,也可以把寄存器的數(shù)據(jù)移動到寄存器。
例:
MOVEAX,1(把1移動到EAX寄存器里)
MOVEAX,ECX(把ECX寄存器的數(shù)據(jù)移動到EAX寄存器里)
用DTDebug軟件把例題操作一遍。首先打開軟件如圖2-4-4所示,將鼠標(biāo)移動到匯編窗口,雙擊黑色區(qū)域所對應(yīng)的那一行匯編代碼,彈出輸入指令窗口如圖2-4-5所示,把鼠標(biāo)移動到輸入窗口中,將里面的指令編寫成:MOVEAX,1如圖2-4-6所示,點擊Enter鍵,匯編指令將被顯示到匯編窗口,如圖2-4-7所示。MOVEAX,ECX重復(fù)以上的操作。完成后按F8執(zhí)行,觀察寄存器窗口,如圖2-4-8、圖2-4-9所示。
彈出輸入指令窗口
輸入指令:MOVEAX,1
輸完指令點擊鍵盤Enter鍵
F8單步運行
F8單步運行
簡單介紹完了MOV指令,通過對MOV指令的編寫、運行,寄存器相對應(yīng)存儲的數(shù)據(jù)發(fā)生了變化,那這些數(shù)據(jù)是怎么存儲的哪?接下來介紹數(shù)據(jù)在通用寄存器中的存儲。
【通用寄存器對數(shù)據(jù)的存儲】
先回顧一下8位、16位、32位通用寄存器。
如通用寄存器表所示。
根據(jù)圖2-4-9寄存器窗口所示,EAX對應(yīng)的數(shù)據(jù)是:0x0012FFB0.只有8個數(shù)據(jù)。而EAX是32位的,它是怎么存儲的哪?
這里要回顧一下字節(jié)、字、雙字這個知識點。
字節(jié):記為Byte,一個字節(jié)由8個bit組成,可以存在8位寄存器中。
字:記為Word,一個字由兩個字節(jié)組成,這兩個字節(jié)分別為這個字的高位字節(jié)和低位字節(jié),可以存在16位寄存器中。
雙字:記為DoubleWord,一個雙字由2個字組成,這兩個字分別為這個雙字的高位字和低位字,可以存在32位寄存器中。
一個雙字可以存在一個32位寄存器中,這個雙字由高位字和低位字組成。低位字可以存放16位寄存器,而16位寄存器,由兩個字節(jié)組成,這個高位字節(jié)和低位字節(jié)自然就存在這個寄存器的高8位寄存器和低8位寄存器中。
以EAX寄存器為例,如圖2-5-11所示。
圖2-4-10EAX寄存器邏輯結(jié)構(gòu)圖
知道了字節(jié)、字、雙字,在看寄存器窗口中的數(shù)據(jù)相信大家知道它是怎麼存儲了的。
接下來用匯編指令來實現(xiàn)對8位、16位、32位寄存器進行存儲。
以下例題自己在軟件中實驗,增強寄存器對數(shù)據(jù)存儲的認識,其次可以加強對MOV指令的練習(xí),再者多熟悉該軟件,我們以后的章節(jié)都會用到。
例:
MOVAL,1
MOVAH,2
MOVAX,0xFFFF
MOVEAX,0xFFFF0000
MOVCL,1
MOVCH,2
MOVCX,0xFFFF
MOVECX,0xFFFF0000