回答這個問題前需要先介紹一款除錯工具DTdebug.EXE以便我們透過實驗來驗證。在電腦旁的同學可以自己親自動手實驗一下,實踐出真知,掌握本質對於學習計算機的同學來說還是很有意思的。
如果要真正明白,必須要掌握以下的知識點:
掌握DTDebug介面、並熟練使用
1、熟記彙編視窗的組成及暫存器視窗的組成
2、 MOV指令的熟練使用
3、掌握位元組、字、雙字的知識
4、使用匯編指令對8位、16位、32位暫存器資料的儲存
暫存器是處理器(CPU)中用來儲存資料的地方。接下來我們借用【DTDebug軟體】來分析。
DTDebug.exe是供程式設計師使用的程式除錯工具。【本節只簡單介紹DTDebug的使用,詳細說明書請到程式設計達人官網去下載相關文件】
雙擊DTDebug.exe軟體圖示如圖2-4-1所示,開啟介面如圖2-4-2所示。
圖2-4-2是軟體的原始介面,沒有任何記錄。那該怎麼把將要被除錯的程式開啟哪?
有四種方式:
1、在如圖2-4-2程式視窗中找到File -> Open ->找到除錯程式;
2、直接將要被除錯的程式拖拽到如圖2-4-2程式視窗中。
3、關閉如圖2-4-2視窗,把將要被除錯的程式拖到如圖2-4-1DTDebug圖示上。
4、在如圖2-4-2程式視窗中找到File -> Attach ->找到將要被除錯的程式(正在執行的軟體)。
以IPMGS.exe為例,介紹DTDebug介面,如圖2-4-3,圖2-4-4所示。
圖2-4-4中標註的4個視窗,分別為彙編視窗、暫存器視窗、記憶體視窗、堆疊視窗。
【彙編視窗】
簡單介紹彙編視窗,彙編視窗由記憶體、特徵碼、彙編、標註區(從左向右)這四塊組成。【在本節這三塊不做介紹】
一個程式執行以後,處理器會一行行的執行它的程式碼,如圖2-4-4處理器會沿著彙編視窗從上往下一行行執行程式碼,直至結束。跟著操作時肯定會有如下疑問,首先沒有看到被除錯的程式執行,其次彙編視窗並沒有從上往下一行行執行程式碼。接下來解答一下,DTDebug軟體是可以中斷當前執行的程式的,如圖2-4-4黃色區域中寫著Paused表示當前程式是被中斷的,其次接著看圖2-4-4彙編視窗中有黑色區域表示當前被除錯的程式被中斷在這塊記憶體區域。該塊區域是被除錯程式的入口點。【文中講到的中斷指:處理器執行到該段程式時,讓該程式停止運行了】。 那怎麼讓程式一行行往下執行哪?看圖2-4-4中有一個三角符號按下程式將會一行行往下執行,此時被除錯的程式就會執行起來。
接下來介紹暫存器視窗。如圖2-4-4暫存器視窗所示。
【暫存器視窗】
簡單介紹暫存器視窗,暫存器視窗由EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI這8個通用暫存器,還有EIP暫存器、EFLAGS暫存器及它們相對應儲存的數值。
EIP、EFLAGS暫存器與8個通用暫存器的區別在於,以EAX暫存器為例,EAX暫存器可以任意讀寫資料,而EIP暫存器,它的作用是存放當前程式碼段即將被執行的下一條指令的地址,不可以隨意讀寫,如圖2-4-4暫存器視窗所示,EIP當前儲存的值為:004185B7,看彙編視窗黑色區域和EIP儲存的值是一樣的。那麼EFLAGS是標誌暫存器,它是受特殊彙編指令的控制,特殊彙編指令決定它當前數值位的變化。
暫存器視窗簡單介紹完了,那怎麼用通用暫存器哪?在介紹使用之前先介紹一個指令。
【MOV指令】
MOV指令是移動資料。MOV指令可以把立即數移動到暫存器,也可以把暫存器的資料移動到暫存器。
例:
MOV EAX,1(把1移動到EAX暫存器裡)
MOV EAX,ECX (把ECX暫存器的資料移動到EAX暫存器裡)
用DTDebug軟體把例題操作一遍。首先開啟軟體如圖2-4-4所示,將滑鼠移動到彙編視窗,雙擊黑色區域所對應的那一行彙編程式碼,彈出輸入指令視窗如圖2-4-5所示,把滑鼠移動到輸入視窗中,將裡面的指令編寫成:MOV EAX,1如圖2-4-6所示,點選Enter鍵,彙編指令將被顯示到彙編視窗,如圖2-4-7所示。MOV EAX,ECX重複以上的操作。完成後按F8執行,觀察暫存器視窗,如圖2-4-8、圖2-4-9所示。
彈出輸入指令視窗
輸入指令:MOV EAX,1
F8單步執行
簡單介紹完了MOV指令,透過對MOV指令的編寫、執行,暫存器相對應儲存的資料發生了變化,那這些資料是怎麼儲存的哪?接下來介紹資料在通用暫存器中的儲存。
【通用暫存器對資料的儲存】
先回顧一下8位、16位、32位通用暫存器。
如通用暫存器表所示。
根據圖2-4-9暫存器視窗所示,EAX對應的資料是:0x0012FFB0.只有8個數據。而EAX是32位的,它是怎麼儲存的哪?
這裡要回顧一下位元組、字、雙字這個知識點。
位元組:記為Byte,一個位元組由8個bit組成,可以存在8位暫存器中。
字:記為Word,一個字由兩個位元組組成,這兩個位元組分別為這個字的高位位元組和低位位元組,可以存在16位暫存器中。
雙字:記為DoubleWord,一個雙字由2個字組成,這兩個字分別為這個雙字的高位字和低位字,可以存在32位暫存器中。
一個雙字可以存在一個32位暫存器中,這個雙字由高位字和低位字組成。低位字可以存放16位暫存器,而16位暫存器,由兩個位元組組成,這個高位位元組和低位位元組自然就存在這個暫存器的高8位暫存器和低8位暫存器中。
以EAX暫存器為例,如圖2-5-11所示。
圖2-4-10 EAX暫存器邏輯結構圖
知道了位元組、字、雙字,在看暫存器視窗中的資料相信大家知道它是怎麼儲存了的。
接下來用匯編指令來實現對8位、16位、32位暫存器進行儲存。
以下例題自己在軟體中實驗,增強暫存器對資料儲存的認識,其次可以加強對MOV指令的練習,再者多熟悉該軟體,我們以後的章節都會用到。
MOV AL,1
MOV AH,2
MOV AX,0xFFFF
MOV EAX,0xFFFF0000
MOV CL,1
MOV CH,2
MOV CX,0xFFFF
MOV ECX,0xFFFF0000
回答這個問題前需要先介紹一款除錯工具DTdebug.EXE以便我們透過實驗來驗證。在電腦旁的同學可以自己親自動手實驗一下,實踐出真知,掌握本質對於學習計算機的同學來說還是很有意思的。
如果要真正明白,必須要掌握以下的知識點:
掌握DTDebug介面、並熟練使用
1、熟記彙編視窗的組成及暫存器視窗的組成
2、 MOV指令的熟練使用
3、掌握位元組、字、雙字的知識
4、使用匯編指令對8位、16位、32位暫存器資料的儲存
暫存器是處理器(CPU)中用來儲存資料的地方。接下來我們借用【DTDebug軟體】來分析。
DTDebug.exe是供程式設計師使用的程式除錯工具。【本節只簡單介紹DTDebug的使用,詳細說明書請到程式設計達人官網去下載相關文件】
雙擊DTDebug.exe軟體圖示如圖2-4-1所示,開啟介面如圖2-4-2所示。
圖2-4-2是軟體的原始介面,沒有任何記錄。那該怎麼把將要被除錯的程式開啟哪?
有四種方式:
1、在如圖2-4-2程式視窗中找到File -> Open ->找到除錯程式;
2、直接將要被除錯的程式拖拽到如圖2-4-2程式視窗中。
3、關閉如圖2-4-2視窗,把將要被除錯的程式拖到如圖2-4-1DTDebug圖示上。
4、在如圖2-4-2程式視窗中找到File -> Attach ->找到將要被除錯的程式(正在執行的軟體)。
以IPMGS.exe為例,介紹DTDebug介面,如圖2-4-3,圖2-4-4所示。
圖2-4-4中標註的4個視窗,分別為彙編視窗、暫存器視窗、記憶體視窗、堆疊視窗。
【彙編視窗】
簡單介紹彙編視窗,彙編視窗由記憶體、特徵碼、彙編、標註區(從左向右)這四塊組成。【在本節這三塊不做介紹】
一個程式執行以後,處理器會一行行的執行它的程式碼,如圖2-4-4處理器會沿著彙編視窗從上往下一行行執行程式碼,直至結束。跟著操作時肯定會有如下疑問,首先沒有看到被除錯的程式執行,其次彙編視窗並沒有從上往下一行行執行程式碼。接下來解答一下,DTDebug軟體是可以中斷當前執行的程式的,如圖2-4-4黃色區域中寫著Paused表示當前程式是被中斷的,其次接著看圖2-4-4彙編視窗中有黑色區域表示當前被除錯的程式被中斷在這塊記憶體區域。該塊區域是被除錯程式的入口點。【文中講到的中斷指:處理器執行到該段程式時,讓該程式停止運行了】。 那怎麼讓程式一行行往下執行哪?看圖2-4-4中有一個三角符號按下程式將會一行行往下執行,此時被除錯的程式就會執行起來。
接下來介紹暫存器視窗。如圖2-4-4暫存器視窗所示。
【暫存器視窗】
簡單介紹暫存器視窗,暫存器視窗由EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI這8個通用暫存器,還有EIP暫存器、EFLAGS暫存器及它們相對應儲存的數值。
EIP、EFLAGS暫存器與8個通用暫存器的區別在於,以EAX暫存器為例,EAX暫存器可以任意讀寫資料,而EIP暫存器,它的作用是存放當前程式碼段即將被執行的下一條指令的地址,不可以隨意讀寫,如圖2-4-4暫存器視窗所示,EIP當前儲存的值為:004185B7,看彙編視窗黑色區域和EIP儲存的值是一樣的。那麼EFLAGS是標誌暫存器,它是受特殊彙編指令的控制,特殊彙編指令決定它當前數值位的變化。
暫存器視窗簡單介紹完了,那怎麼用通用暫存器哪?在介紹使用之前先介紹一個指令。
【MOV指令】
MOV指令是移動資料。MOV指令可以把立即數移動到暫存器,也可以把暫存器的資料移動到暫存器。
例:
MOV EAX,1(把1移動到EAX暫存器裡)
MOV EAX,ECX (把ECX暫存器的資料移動到EAX暫存器裡)
用DTDebug軟體把例題操作一遍。首先開啟軟體如圖2-4-4所示,將滑鼠移動到彙編視窗,雙擊黑色區域所對應的那一行彙編程式碼,彈出輸入指令視窗如圖2-4-5所示,把滑鼠移動到輸入視窗中,將裡面的指令編寫成:MOV EAX,1如圖2-4-6所示,點選Enter鍵,彙編指令將被顯示到彙編視窗,如圖2-4-7所示。MOV EAX,ECX重複以上的操作。完成後按F8執行,觀察暫存器視窗,如圖2-4-8、圖2-4-9所示。
彈出輸入指令視窗
輸入指令:MOV EAX,1
F8單步執行
F8單步執行
簡單介紹完了MOV指令,透過對MOV指令的編寫、執行,暫存器相對應儲存的資料發生了變化,那這些資料是怎麼儲存的哪?接下來介紹資料在通用暫存器中的儲存。
【通用暫存器對資料的儲存】
先回顧一下8位、16位、32位通用暫存器。
如通用暫存器表所示。
根據圖2-4-9暫存器視窗所示,EAX對應的資料是:0x0012FFB0.只有8個數據。而EAX是32位的,它是怎麼儲存的哪?
這裡要回顧一下位元組、字、雙字這個知識點。
位元組:記為Byte,一個位元組由8個bit組成,可以存在8位暫存器中。
字:記為Word,一個字由兩個位元組組成,這兩個位元組分別為這個字的高位位元組和低位位元組,可以存在16位暫存器中。
雙字:記為DoubleWord,一個雙字由2個字組成,這兩個字分別為這個雙字的高位字和低位字,可以存在32位暫存器中。
一個雙字可以存在一個32位暫存器中,這個雙字由高位字和低位字組成。低位字可以存放16位暫存器,而16位暫存器,由兩個位元組組成,這個高位位元組和低位位元組自然就存在這個暫存器的高8位暫存器和低8位暫存器中。
以EAX暫存器為例,如圖2-5-11所示。
圖2-4-10 EAX暫存器邏輯結構圖
知道了位元組、字、雙字,在看暫存器視窗中的資料相信大家知道它是怎麼儲存了的。
接下來用匯編指令來實現對8位、16位、32位暫存器進行儲存。
以下例題自己在軟體中實驗,增強暫存器對資料儲存的認識,其次可以加強對MOV指令的練習,再者多熟悉該軟體,我們以後的章節都會用到。
例:
MOV AL,1
MOV AH,2
MOV AX,0xFFFF
MOV EAX,0xFFFF0000
MOV CL,1
MOV CH,2
MOV CX,0xFFFF
MOV ECX,0xFFFF0000