青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++分析研究  
C++
日歷
<2013年9月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345
統(tǒng)計
  • 隨筆 - 92
  • 文章 - 4
  • 評論 - 4
  • 引用 - 0

導(dǎo)航

常用鏈接

留言簿

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 

  相比較其他傳統(tǒng)的語言,C++的一個變革的特征是支持異常處理。相對于傳統(tǒng)語言的不清楚容易錯誤的錯誤處理機(jī)制,C++的異常處理是一個非常好的替代。在正常的代碼和錯誤處理代碼之間清楚的分割使得程序非常整潔和宜于維護(hù)。本文討論編譯器怎么實(shí)現(xiàn)異常處理。假設(shè)讀者熟悉異常處理的語法。本文包含一個異常處理的VC++的庫來替代VC++的異常處理,使用這個函數(shù):

 install_my_handler();

  在這以后,程序中發(fā)生的任何異常(包含拋出異常到stackunwinding,調(diào)用catch塊和繼續(xù)執(zhí)行)都使用我自己的異常處理庫。

  譯者注:當(dāng)異常出現(xiàn)時,正常的執(zhí)行流被中斷,異常處理機(jī)制開始在當(dāng)前范圍尋找匹配的處理函數(shù)。如果找不到,把當(dāng)前函數(shù)從棧中彈出,在調(diào)用者中繼續(xù)尋找。這個過程稱為stackunwinding

  像其他C++特征一樣,C++的標(biāo)準(zhǔn)并沒有指定異常處理的實(shí)現(xiàn)機(jī)制。這使得C++實(shí)現(xiàn)者可以使用任何實(shí)現(xiàn)機(jī)制。我將講述VC++怎么實(shí)現(xiàn)的。VC++把異常處理置于SHE(Structuredexceptionhangling)的上面。SHE是windows操作系統(tǒng)提供的結(jié)構(gòu)化的異常處理。

  SHE導(dǎo)論

  在本討論中,我將考慮那些顯式的異常。例如被0除,空指針訪問等。當(dāng)異常出現(xiàn),中斷會產(chǎn)生,控制被轉(zhuǎn)到OS。OS調(diào)用異常處理,檢查從異常發(fā)出的函數(shù)開始的函數(shù)調(diào)用順序,執(zhí)行stackunwinding和控制轉(zhuǎn)移。我們可以開發(fā)自己的異常處理函數(shù),在OS中注冊。OS就會在異常事件時調(diào)用它們。

  Windows定義了一個特別的結(jié)構(gòu)用來注冊:

  EXCEPTION_REGISTRATION:

  struct EXCEPTION_REGISTRATION

  EXCEPTION_REGISTRATION *prev;

  DWORD handler;

  ;

  要注冊自己的異常處理函數(shù),創(chuàng)建這個結(jié)構(gòu)并將它的地址保存在段(由FS寄存器指向)的0偏移處。如下面的偽匯編指令:

  mov FS:[0], exc_regp

  結(jié)構(gòu)中的prev字段表示EXCEPTION_REGISTRATION鏈表。當(dāng)我們注冊了這個EXCEPTION_REGISTRATION結(jié)構(gòu),我們使用這個prev字段保存以前注冊的結(jié)構(gòu)的地址。

  關(guān)于異?;卣{(diào)函數(shù),windows要求異常處理的信號,定義在excp.h文件中:

  EXCEPTION_DISPOSITION (*handler)(

  _EXCEPTION_RECORD *ExcRecord,

  void * EstablisherFrame,

  _CONTEXT *ContextRecord,

  void * DispatcherContext);

  現(xiàn)在你可以忽略所有的參數(shù)和返回類型。下面的程序在OS中注冊了一個異常處理句柄并將產(chǎn)生一個被0除的異常。這個異常被抓到并將打印一個消息:

  #include

  #include

  using std::cout;

  using std::endl;

  struct EXCEPTION_REGISTRATION

  EXCEPTION_REGISTRATION *prev;

  DWORD handler;

  ;

  EXCEPTION_DISPOSITION myHandler(

  _EXCEPTION_RECORD *ExcRecord,

  void * EstablisherFrame,

  _CONTEXT *ContextRecord,

  void * DispatcherContext)

  cout << "In the exception handler" << endl;

  cout << "Just a demo. exiting..." << endl;

  exit(0);

  return ExceptionContinueExecution; //will not reach here

  int g_div = 0;

  void bar()

  //initialize EXCEPTION_REGISTRATION structure

  EXCEPTION_REGISTRATION reg, *preg = ?

  reg.handler = (DWORD)myHandler;

  //get the current head of the exception handling chain

  DWORD prev;

  _asm

  mov EAX, FS:[0]

  mov prev, EAX

  reg.prev = (EXCEPTION_REGISTRATION*) prev;

  //register it!

  _asm

  mov EAX, preg

  mov FS:[0], EAX

  //generate the exception

  int j = 10 / g_div; //Exception. Divide by 0.

  int main()

  bar();

  return 0;

  /*output

  In the exception handler

  Just a demo. exiting...

  -*/

  注意:windows嚴(yán)格地定義了一個規(guī)則:EXCEPTION_REGISTRATION結(jié)構(gòu)應(yīng)該在棧內(nèi),并且要在以前的代碼的低的內(nèi)存地址。規(guī)則不滿足,windows將中止程序。

  函數(shù)和堆棧

  堆棧是一塊連續(xù)的內(nèi)存,用來保存函數(shù)的局部對象。更明確的說,每一個函數(shù)都有關(guān)聯(lián)的棧幀(譯注:stackframe,在調(diào)用函數(shù)時,進(jìn)入函數(shù)以后第一句應(yīng)該是pushebp,然后movebp,esp,所以ebp一般都指向當(dāng)前函數(shù)進(jìn)入時的棧頂,而且指向的內(nèi)容是上一層調(diào)用函數(shù)進(jìn)入時棧頂,如此向外,最后找到0,就是系統(tǒng)的入口,這樣一個函數(shù)使用的那些棧應(yīng)該就是一幀)來保存所有的函數(shù)局部對象和函數(shù)表達(dá)式產(chǎn)生的臨時對象(譯注:1.C++里對象的意義很廣泛,不只是class,結(jié)構(gòu),簡單類型也是對象2.臨時對象,學(xué)過編譯原理的話應(yīng)該很清楚,舉個例子,比如有一個函數(shù)是intmyfun();你在函數(shù)中這樣寫intret=myfun();這樣myfun()返回的結(jié)果就放到了ret里,如果你寫成myfun();而不理它的返回值,你雖然不理它,但是仍然會有它返回值存放的地方,這就是一個臨時的對象,在vc的調(diào)試環(huán)境了,看auto變量的頁面就可以看到臨時的變量)。請注意上面描述只是很典型的情況。而實(shí)際上,編譯器可能會儲存所有或部分的變量到寄存器里,以便獲得更快的執(zhí)行速度(譯注:編譯器優(yōu)化)。堆棧是一個處理器(CPU)級就支持的概念(譯注:之所以這么說,因?yàn)閰R編代碼里就有push和pop).處理器提供內(nèi)部的寄存器和特殊的指令來實(shí)現(xiàn)堆棧處理

  圖 2顯示了一個典型的棧,這是當(dāng)函數(shù)foo調(diào)用函數(shù)bar,然后bar調(diào)用函數(shù)widget以后的棧的內(nèi)容。請注意棧是向下增長的(譯注:平時我在紙上畫棧都是低地址在上,所以作者的這個圖看起來感覺有點(diǎn)怪,但是看懂應(yīng)該沒有問題),這意味著下一個將要入棧的元素所在的地址將比前一個元素的地址更小(低)。編譯器用ESP寄存器來鑒別當(dāng)前的棧幀,在上圖所示的情況下,widget時正在執(zhí)行鼓票的函數(shù),EBP寄存器指向了widget的棧幀(就是函數(shù)進(jìn)入時,push了ebp以后的棧頂位置)。函數(shù)訪問局部變量都是用局部變量所在的位置相對于幀頂?shù)钠屏?。編譯器在編譯的時候就把所有的局部變量從名字變成固定的相對于幀頂?shù)钠疲纾瑆idget函數(shù)訪問它的一個局部變量就用ebp-24來指明它的位置

  上圖也顯示了ESP寄存器,在圖示的情況下,它指向了堆棧的最后一項(xiàng),也就是處于widget幀的尾部,下一幀將從這個位置開始

  處理器支持兩種棧操作:push 和 pop:

  pop EAX

  意味著從esp所在的位置讀4個字節(jié)到eax中,然后把esp增加4(32位的處理器下)。同樣的,

  push EBP

  意味著把esp減4,然后把ebp的內(nèi)容寫到esp指向的地方。

  當(dāng)編譯器編譯一個函數(shù), 它在函數(shù)頭部添加一些創(chuàng)建和初始化函數(shù)棧幀的代碼,同樣,在函數(shù)結(jié)尾加上從堆棧里彈出棧幀的代碼。

  典型的,編譯器在函數(shù)頭部生成

  Push EBP ; save current frame pointer on stack

  Mov EBP, ESP ; Activate the new frame

  Sub ESP, 10 ; Subtract. Set ESP at the end of the frame

  第一句保存當(dāng)前的幀指針ebp到堆棧里,第二句通過設(shè)置ebp到當(dāng)前的esp來激活當(dāng)前的函數(shù)幀,.第三句設(shè)置esp寄存器到當(dāng)前幀的尾部,就是把esp減去本函數(shù)內(nèi)的局部對象的總長度。編譯器在編譯的時候就知道有多少的局部對象和每個對象的長度,所以能夠清楚地知道一個函數(shù)的幀的確切長度

  在函數(shù)結(jié)束時把當(dāng)前幀從堆棧中彈出

  Mov ESP, EBP

  Pop EBP ; activate caller"s frame

  Ret ; return to the caller

  恢復(fù)ESP和EBP,然后執(zhí)行RET

  當(dāng)處理器執(zhí)行RET指令時,實(shí)際上類似執(zhí)行了一條popeip,把棧里保存的EIP彈出,然后跳到EIP處開始執(zhí)行。相反,call指令執(zhí)行的時候先把當(dāng)前的EIP推入堆棧,然后jmp到相應(yīng)的地址,

  圖 3 顯示了運(yùn)行時堆棧的更多詳細(xì)信息。如圖所示,函數(shù)參數(shù)也是函數(shù)幀的一部分,調(diào)用函數(shù)者把參數(shù)推入堆棧,然后函數(shù)返回否執(zhí)行

  Add ESP, args_size

  或者,采用另一種RET指令,如下

  Ret 24

  相當(dāng)于返回后,執(zhí)行了 ADD ESP , 24

  注意沒有進(jìn)程里的每隔線程都有它自己的
www.stockdatas.cn  www.stockbests.cn  www.stocknewss.cn

posted on 2009-10-22 23:28 HAOSOLA 閱讀(167) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
Copyright © HAOSOLA Powered by: 博客園 模板提供:滬江博客
PK10開獎 PK10開獎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩精品在线播放| 欧美啪啪一区| 狠狠色丁香久久婷婷综合_中| 亚洲综合999| 一区二区高清视频| 国产精品扒开腿做爽爽爽视频 | 日韩一级片网址| 欧美日韩另类综合| 亚洲主播在线| 欧美在线国产| 亚洲精品视频在线| 亚洲天堂av在线免费观看| 国产精品私拍pans大尺度在线| 欧美一区精品| 老牛影视一区二区三区| 亚洲调教视频在线观看| 香蕉久久一区二区不卡无毒影院| 极品av少妇一区二区| 亚洲成色www久久网站| 欧美久久电影| 欧美一区二区视频在线观看2020| 欧美专区第一页| 亚洲精品在线一区二区| 亚洲性视频h| 在线观看亚洲视频| 99精品国产在热久久下载| 国产喷白浆一区二区三区| 欧美暴力喷水在线| 国产精品一区二区三区成人| 女人天堂亚洲aⅴ在线观看| 欧美乱在线观看| 久久香蕉国产线看观看av| 欧美精品在线观看| 久久久www| 欧美日韩直播| 男人天堂欧美日韩| 国产精品性做久久久久久| 欧美va亚洲va香蕉在线| 国产精品综合视频| 亚洲精品一区二区在线观看| 国产一级精品aaaaa看| 99天天综合性| 91久久夜色精品国产网站| 亚洲欧美日韩一区二区三区在线观看| 亚洲国产精品久久久久婷婷884| 一区二区欧美视频| 99精品国产在热久久| 久久综合成人精品亚洲另类欧美| 午夜国产精品视频免费体验区| 欧美成人高清视频| 免费观看久久久4p| 国产在线视频欧美一区二区三区| 一本到高清视频免费精品| 最新国产成人在线观看| 久久久久久色| 狼狼综合久久久久综合网| 国产欧美日韩亚洲精品| 国产精品99久久久久久白浆小说| 亚洲精品护士| 欧美国产日韩a欧美在线观看| 久久夜色撩人精品| 国产伦精品一区二区三区照片91 | 亚洲欧洲精品天堂一级| 在线成人h网| 欧美与欧洲交xxxx免费观看| 欧美一区二区三区在线观看视频| 欧美天堂亚洲电影院在线播放| 亚洲欧洲一级| 亚洲视频成人| 欧美性感一类影片在线播放| 夜夜嗨av一区二区三区| 中日韩高清电影网| 国产精品mm| 午夜在线不卡| 久久免费视频在线| 在线观看日韩av电影| 免费91麻豆精品国产自产在线观看| 久久综合色播五月| 91久久精品网| 欧美日韩精品免费看| 亚洲精选久久| 午夜视频在线观看一区| 国产嫩草影院久久久久| 欧美伊人久久| 欧美成人一区二区三区在线观看| 亚洲日韩欧美视频| 欧美日韩国产在线看| 亚洲一区二区三区在线观看视频| 欧美一区二区三区免费观看| 国产一区二区三区黄| 免费日韩av| 一区二区三区四区五区视频| 欧美一区二区私人影院日本| 精品成人一区| 欧美色图五月天| 久久精品视频免费播放| 亚洲黄色av一区| 先锋亚洲精品| 亚洲电影免费在线观看| 欧美日韩国产在线看| 午夜精品三级视频福利| 亚洲高清在线精品| 亚洲欧美综合精品久久成人 | 欧美日韩精品三区| 午夜激情综合网| 欧美韩日一区二区三区| 亚洲伊人网站| 91久久国产自产拍夜夜嗨| 国产精品日韩在线| 免费亚洲视频| 欧美在线观看你懂的| 日韩一级精品| 欧美成人国产va精品日本一级| 亚洲一区二区黄色| 亚洲黄色精品| 在线成人h网| 国产欧美日韩不卡| 欧美日韩在线视频观看| 乱中年女人伦av一区二区| 亚洲专区一区| av不卡在线看| 亚洲欧洲三级电影| 欧美超级免费视 在线| 午夜日韩在线| 亚洲专区欧美专区| 亚洲六月丁香色婷婷综合久久| 国产资源精品在线观看| 国产精品九九| 欧美少妇一区二区| 欧美成人视屏| 美女黄色成人网| 久久久久久久一区二区三区| 亚洲欧美日韩精品在线| 夜色激情一区二区| 日韩一级二级三级| 亚洲日本中文字幕| 亚洲国产成人在线| 亚洲国产精品久久久久秋霞影院| 久久综合中文字幕| 玖玖精品视频| 免费成人在线观看视频| 久久这里有精品视频| 久久超碰97人人做人人爱| 午夜精品久久久久| 亚洲免费网站| 午夜国产精品视频| 久久成人资源| 久久―日本道色综合久久| 久久国产天堂福利天堂| 久久本道综合色狠狠五月| 久久成人资源| 久热精品视频在线观看| 美女黄色成人网| 欧美激情va永久在线播放| 欧美激情黄色片| 亚洲人成人一区二区在线观看| 亚洲激情在线观看视频免费| 亚洲人体偷拍| 99亚洲视频| 欧美亚洲综合久久| 久久亚洲欧洲| 欧美精品一二三| 国产精品免费视频xxxx| 国产美女诱惑一区二区| 极品尤物一区二区三区| 亚洲电影自拍| 一区二区成人精品| 羞羞答答国产精品www一本| 久久久久国产精品一区三寸| 你懂的网址国产 欧美| 亚洲黄色成人| 亚洲欧美日韩中文视频| 久久久久九九视频| 欧美久久久久中文字幕| 国产精品理论片| 在线精品视频免费观看| 夜久久久久久| 欧美影院成人| 亚洲国产三级在线| 亚洲永久精品国产| 免费成人av在线| 国产精品久久久久毛片软件| 好看的亚洲午夜视频在线| 亚洲精品一区二区在线观看| 亚洲欧美日韩在线观看a三区| 久久一区二区视频| 一本色道久久88综合日韩精品| 欧美在线视频在线播放完整版免费观看 | 亚洲一区二区三区久久| 久久久水蜜桃| 国产精品网站一区| 日韩香蕉视频| 媚黑女一区二区| 亚洲天堂第二页| 欧美丰满高潮xxxx喷水动漫| 国产欧亚日韩视频| 亚洲午夜女主播在线直播| 欧美国产精品一区| 欧美一区影院| 欧美亚州一区二区三区|