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