日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言中main函数的研究,以及对代码断点调试的研究(王爽老师 汇编语言)

發(fā)布時(shí)間:2024/4/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中main函数的研究,以及对代码断点调试的研究(王爽老师 汇编语言) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?????我們知道作為一個(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)存地址里面去,以方便我們的觀察,這里,我的方法是將代碼斷里面的所有代碼拷貝到0200開始的位置,為了不影響我們觀測(cè)的結(jié)果,我首先將0200開始的一段內(nèi)存置為0

?

2、程序1Ah之前的指令清0指令,當(dāng)我們跳到1Ah處執(zhí)行P命令的時(shí)候,我們可以先查看一下0200h023e處是不是被置零了,下圖中我們可以發(fā)現(xiàn),從到0200處到確實(shí)被全部被置零了,而卻被清零的內(nèi)存空間也足夠我們將把我們的測(cè)試程序的二進(jìn)制代碼保存起來。

?

3、接下來我用debug加載程序(該程序功能是將程序本身的代碼全部拷貝到0200處)可以看到,代碼本身是有2AH個(gè)字節(jié)的。

?

4、然后我用g? 25跳到程序返回的代碼之前,即mov ax,4c00處,然后再用u命令查看被拷貝過去的代碼,可以看到在0225處加入了一條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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。