C语言中main函数的研究,以及对代码断点调试的研究(王爽老师 汇编语言)
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
?????我們知道作為一個語言本身是不會有諸如從main函數開始運行這樣的條件(深層次的說 底層匯編代碼不會指定從mian函數開始的這樣的條件,程序開始的位置是初始 CS:IP指定的位置)
?
1、通過書本上給我們提供的信息,我們知道在tc2.0中,給我們提供了寄存器名來給寄存器存儲數據,
??????編寫成如下:
??????????? 我們知道在C語言中main函數是必定要被執行的,故,main函數的代碼一定是在代碼段的,但是不是程序就一定從main函數開始執行呢?(規定了我們就要遵守?)
??????????? 通過在debug下加載上面代碼生成的exe程序,我們發現程序開始處的指令并不是給我們代碼中給寄存器賦值的指令。
??
2、那么我們的main函數的代碼到底在哪里??
?????? 在我們前期所學的匯編語言中,我們的函數都是通過標號來標明的,我們可以通過標號找到函數的偏移地址,
?????????????????????????? printf(“%x\n”,main);
???????? 通過printf這個函數,我們得到main函數的入口地址是1FAH,那么程序是什么時候開始去執行我們的main函數呢?通過一步一步的觀察,我看到匯編碼是在偏移地址11AH處執行一個CALL指令,加載MAIN函數,
現在在程序里面添加一個函數F
在MAIN函數里面,又執行了一條CALL 020B指令去執行F函數
???????????????????????????
繼續探究
??????????????????通過前面的探索,可以看到main函數的偏移地址是在1FAH處,那么是不是對于所有的程序來說,mian函數的入口地址都是1FAH呢?在上圖中,可以看到f函數定義在是在mian函數之后的,這是因為我在C語言的源文件里面就是這么寫的,
??????????????????下面我就將f函數聲明和定義都寫在main函數之前(如上圖),可以看到,這個時候main函數的偏移地址已經變成了203h,而f函數的入口地址卻變成了1FAh,那么這是不是說明1FA
是我們所編寫程序里面第一個函數的偏移地址呢?
?????????下面我繼續在f函數之上又添加了一個b函數
?
???????????? 通過查看1FAH處的指令,我們發現1fa卻是又成了函數b的偏移地址,這里又證實了我們上面的猜想。
?
關于斷點調試的研究
?????? 1、現在猜想是假設在debug里面使用g命令是在所跳的程序之后加入了一條int指令,那么我可以在G命令之后被cpu執行的指令拷貝到另一段內存地址里面去,以方便我們的觀察,這里,我的方法是將代碼斷里面的所有代碼拷貝到0:200開始的位置,為了不影響我們觀測的結果,我首先將0:200開始的一段內存置為0,
?
2、程序1Ah之前的指令清0指令,當我們跳到1Ah處執行P命令的時候,我們可以先查看一下0:200h到0:23e處是不是被置零了,下圖中我們可以發現,從到0:200處到確實被全部被置零了,而卻被清零的內存空間也足夠我們將把我們的測試程序的二進制代碼保存起來。
?
3、接下來我用debug加載程序(該程序功能是將程序本身的代碼全部拷貝到0:200處)可以看到,代碼本身是有2AH個字節的。
?
4、然后我用g? 25跳到程序返回的代碼之前,即mov ax,4c00處,然后再用u命令查看被拷貝過去的代碼,可以看到在0:225處加入了一條INT 3指令機器碼是0XCCH,對應的源程序的位置就是cs:0025處,也就是我們要跳到執行代碼的地方,
?
5、所以總得來說,說明g命令就是在要跳到執行處插入了一個0CCH(就是INT 3指令);使得程序在插入的位置發生了一個中斷。
總結
以上是生活随笔為你收集整理的C语言中main函数的研究,以及对代码断点调试的研究(王爽老师 汇编语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8086汇编 贪吃蛇 源代码
- 下一篇: 8086汇编贪吃蛇(随机食物+速度递增)