剖析賦值語句的機器碼 - 調(diào)試程序
調(diào)試程序:
int?gi;
int?main()
{
gi?= 0xffffffff;
return?0;
}
在第4行打斷點

調(diào)試 ---> 窗口 ---> 反匯編,或者是alt + 8快捷鍵;

此時此刻可以看到反匯編代碼,點擊右鍵,把紅色方框的全部選擇,就可以看到C語言中無法看到的信息了。

接著我們來分析一下關(guān)鍵的代碼和符號,如圖所示的1 2 3。

此時此刻應(yīng)該有3個問題:
1、C7 05代表什么意思?
2、內(nèi)存地址00EFA138h到底代表什么意思?它真的是變量gi的地址值嗎?
3、Mov指令的地址是什么?是不是這個00EF1728呢?
好的我們先回答第一個問題 C7 05 其實就是mov指令的機器碼。這個大家應(yīng)該都知道。
接著我們先來研究第三個問題,0x00EF1728到底是不是mov指令的地址,我們按照如下步驟。
調(diào)試 ---> 內(nèi)存 ---> 內(nèi)存1

把0x00EF1728拷貝到該窗口,從下面的窗口我們就看到了確確實實看到了C7 05,
所以驗證了我們的想法。

接著我們再回過頭來看第2個問題,內(nèi)存地址00EFA138h到底代表什么意思?
首先按照下面步驟:1 調(diào)試 ---》 2 監(jiān)視---》 3 監(jiān)視1

然后把gi變量和&gi拷貝到窗口,大家可以看到,0X00EFA138h確確實實是變量gi的地址值。

我們按F11逐語句繼續(xù)運行,可以看到gi的值變成了0Xffffffff,驗證了我們的猜想。

我們還可以從另外的角度來佐證我們的猜想;
重新運行程序,觸發(fā)斷點;
我們還是把內(nèi)存監(jiān)控的窗口調(diào)出來,在程序沒有運行到gi = 0xffffffff之前;
我們就修改內(nèi)存里面的值,具體修改方法如下,右鍵-->編輯值。

大家可以看到值變?yōu)榱思t色這塊的00000001,這是我手動修改的。

接著按下F11,發(fā)現(xiàn)了,我改了內(nèi)存里面的值,就算運行了gi = 0xffffffff;
我們監(jiān)控的gi的值卻變?yōu)榱?,而不是0xffffffff;
所以再一次驗證了我們的猜想。

這個地址確實是 gi的地址。
總結(jié):
1 、C/C++的調(diào)試環(huán)境,確實比較好玩,尤其是調(diào)試環(huán)境的反匯編、監(jiān)視窗口、內(nèi)存窗口、單步、斷點、mov 指令、全局變量賦值的反匯編、對指令建立了形象的認知,并直接構(gòu)建了指令,直接改變了內(nèi)存的值。
2、 調(diào)試學(xué)習(xí)過程就是我們探索式學(xué)習(xí)很好的例子,分為由淺及深的三階段∶深入剖析 → 部分修改 → 全新構(gòu)建。我們要善于將自己的探索過程分解為:假設(shè) ---》 實證 ---》 推進,這樣子的過程。通過這樣子的鍛煉,我們的分析能力會更上一層樓。