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

C++分析研究  
C++
日歷
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
統計
  • 隨筆 - 92
  • 文章 - 4
  • 評論 - 4
  • 引用 - 0

導航

常用鏈接

留言簿

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 

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

 install_my_handler();

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

  譯者注:當異常出現時,正常的執行流被中斷,異常處理機制開始在當前范圍尋找匹配的處理函數。如果找不到,把當前函數從棧中彈出,在調用者中繼續尋找。這個過程稱為stackunwinding

  像其他C++特征一樣,C++的標準并沒有指定異常處理的實現機制。這使得C++實現者可以使用任何實現機制。我將講述VC++怎么實現的。VC++把異常處理置于SHE(Structuredexceptionhangling)的上面。SHE是windows操作系統提供的結構化的異常處理。

  SHE導論

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

  Windows定義了一個特別的結構用來注冊:

  EXCEPTION_REGISTRATION:

  struct EXCEPTION_REGISTRATION

  EXCEPTION_REGISTRATION *prev;

  DWORD handler;

  ;

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

  mov FS:[0], exc_regp

  結構中的prev字段表示EXCEPTION_REGISTRATION鏈表。當我們注冊了這個EXCEPTION_REGISTRATION結構,我們使用這個prev字段保存以前注冊的結構的地址。

  關于異?;卣{函數,windows要求異常處理的信號,定義在excp.h文件中:

  EXCEPTION_DISPOSITION (*handler)(

  _EXCEPTION_RECORD *ExcRecord,

  void * EstablisherFrame,

  _CONTEXT *ContextRecord,

  void * DispatcherContext);

  現在你可以忽略所有的參數和返回類型。下面的程序在OS中注冊了一個異常處理句柄并將產生一個被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嚴格地定義了一個規則:EXCEPTION_REGISTRATION結構應該在棧內,并且要在以前的代碼的低的內存地址。規則不滿足,windows將中止程序。

  函數和堆棧

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

  圖 2顯示了一個典型的棧,這是當函數foo調用函數bar,然后bar調用函數widget以后的棧的內容。請注意棧是向下增長的(譯注:平時我在紙上畫棧都是低地址在上,所以作者的這個圖看起來感覺有點怪,但是看懂應該沒有問題),這意味著下一個將要入棧的元素所在的地址將比前一個元素的地址更小(低)。編譯器用ESP寄存器來鑒別當前的棧幀,在上圖所示的情況下,widget時正在執行鼓票的函數,EBP寄存器指向了widget的棧幀(就是函數進入時,push了ebp以后的棧頂位置)。函數訪問局部變量都是用局部變量所在的位置相對于幀頂的偏移量。編譯器在編譯的時候就把所有的局部變量從名字變成固定的相對于幀頂的偏移,例如,widget函數訪問它的一個局部變量就用ebp-24來指明它的位置

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

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

  pop EAX

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

  push EBP

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

  當編譯器編譯一個函數, 它在函數頭部添加一些創建和初始化函數棧幀的代碼,同樣,在函數結尾加上從堆棧里彈出棧幀的代碼。

  典型的,編譯器在函數頭部生成

  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

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

  在函數結束時把當前幀從堆棧中彈出

  Mov ESP, EBP

  Pop EBP ; activate caller"s frame

  Ret ; return to the caller

  恢復ESP和EBP,然后執行RET

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

  圖 3 顯示了運行時堆棧的更多詳細信息。如圖所示,函數參數也是函數幀的一部分,調用函數者把參數推入堆棧,然后函數返回否執行

  Add ESP, args_size

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

  Ret 24

  相當于返回后,執行了 ADD ESP , 24

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

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            欧美有码在线视频| 极品尤物av久久免费看 | 黄色av一区| 黄色免费成人| 亚洲福利一区| 亚洲视频 欧洲视频| 性视频1819p久久| 麻豆91精品| 亚洲精品欧美日韩专区| 在线视频欧美一区| 亚洲欧美综合另类中字| 久久伊人精品天天| 欧美日韩成人一区| 国产一区深夜福利| 夜夜嗨av一区二区三区中文字幕 | 国产精品99久久久久久人| 亚洲欧美电影院| 免费成人性网站| 国产精品久久久久久av下载红粉| 国产亚洲激情| 日韩一级不卡| 麻豆精品在线视频| 亚洲午夜精品久久| 欧美激情一区| 狠久久av成人天堂| 亚洲欧美另类中文字幕| 欧美成人精品| 欧美一区二视频| 国产精品扒开腿做爽爽爽软件 | 国产欧美日韩视频一区二区| 亚洲国产综合91精品麻豆| 欧美一区二区国产| 99re视频这里只有精品| 久久大香伊蕉在人线观看热2| 欧美成人午夜激情视频| 亚洲欧美清纯在线制服| 欧美人与性动交α欧美精品济南到| 国产尤物精品| 欧美亚洲尤物久久| 99视频热这里只有精品免费| 久久久久久亚洲精品不卡4k岛国| 欧美视频日韩| 99国产精品久久久久老师 | 午夜电影亚洲| 日韩亚洲欧美一区二区三区| 久久在线精品| 国产一区二区三区在线观看免费视频 | 亚洲国产免费| 欧美暴力喷水在线| 1024成人网色www| 免费日韩成人| 久久躁日日躁aaaaxxxx| 韩国av一区二区三区| 久久国产欧美日韩精品| 亚洲欧美日韩国产综合精品二区 | 国产女人精品视频| 午夜精品剧场| 午夜精品久久久久久久久久久久久 | 国产精品v欧美精品∨日韩| 亚洲欧洲日韩在线| 亚洲成色www8888| 久久综合色播五月| 在线视频国内自拍亚洲视频| 久久免费精品视频| 久热成人在线视频| 亚洲欧洲日产国码二区| 91久久国产综合久久| 欧美日韩国产不卡在线看| 在线一区二区日韩| 亚洲永久在线| 国内精品久久久久影院 日本资源| 久久免费视频在线观看| 美日韩精品免费观看视频| 亚洲精品乱码久久久久久久久| 亚洲国产日韩美| 欧美日韩亚洲一区二区三区| 亚洲制服av| 欧美一区二区三区四区夜夜大片| 国产一区av在线| 欧美国产日韩在线| 欧美乱在线观看| 午夜亚洲一区| 老司机精品视频一区二区三区| 99国产精品私拍| 欧美一级片一区| 欧美激情网友自拍| 亚洲欧美日韩综合aⅴ视频| 久久精品一区中文字幕| 日韩午夜三级在线| 欧美亚洲在线观看| 91久久国产综合久久蜜月精品| 99爱精品视频| 国产在线不卡精品| 亚洲第一视频| 国产亚洲aⅴaaaaaa毛片| 亚洲国产精品久久久久秋霞蜜臀| 国产精品亚洲第一区在线暖暖韩国| 久久久久九九视频| 欧美性猛片xxxx免费看久爱 | 欧美成人免费全部| 欧美视频三区在线播放| 免费观看在线综合色| 欧美三日本三级少妇三2023| 鲁大师影院一区二区三区| 欧美日韩在线播| 欧美韩日亚洲| 国产原创一区二区| 亚洲午夜精品一区二区| 亚洲美女视频网| 久久精品一本久久99精品| 亚洲午夜未删减在线观看| 久久―日本道色综合久久| 亚洲欧美在线高清| 欧美激情精品久久久六区热门 | 欧美四级电影网站| 亚洲国产精品999| 一区二区视频免费完整版观看| 亚洲最新色图| 一区二区高清视频| 欧美风情在线观看| 欧美电影免费观看高清完整版| 国产在线拍揄自揄视频不卡99| 夜夜嗨一区二区三区| 一区二区三区四区在线| 欧美二区在线播放| 亚洲高清免费视频| 最新国产成人在线观看| 久久婷婷久久| 欧美激情亚洲精品| 最新中文字幕亚洲| 久久亚洲春色中文字幕久久久| 久久久亚洲精品一区二区三区| 国产麻豆视频精品| 性做久久久久久久久| 久久精品国产久精国产思思| 国产一区二区看久久| 久久爱另类一区二区小说| 久久午夜av| 亚洲国产精品久久久久婷婷老年| 蜜臀99久久精品久久久久久软件 | 亚洲精品欧美激情| 亚洲在线日韩| 国产亚洲成人一区| 欧美sm重口味系列视频在线观看| 国产日韩欧美三级| 久久国产精品99国产精| 麻豆精品视频在线观看视频| 怡红院精品视频在线观看极品| 久久在精品线影院精品国产| 亚洲国产精品va在线看黑人| 99精品久久久| 国产精品久久久久久久久免费桃花| 正在播放日韩| 久久久青草青青国产亚洲免观| 尤物在线观看一区| 欧美成人自拍| 亚洲一区二区视频| 久久在线播放| 99re这里只有精品6| 国产精品羞羞答答xxdd| 久久国产精品免费一区| 亚洲国产欧美一区二区三区久久 | 欧美一区二区三区在线免费观看| 久久不射2019中文字幕| 亚洲国产精品小视频| 欧美日韩成人在线播放| 欧美一区二区高清在线观看| 亚洲国产91精品在线观看| 亚洲一区免费在线观看| 国产欧美一区二区白浆黑人| 美女精品视频一区| 亚洲欧美日韩网| 亚洲福利国产精品| 欧美在线日韩| 一区二区三区**美女毛片| 国产欧美一区二区精品婷婷 | 久久久久久久91| 夜夜嗨av一区二区三区免费区| 国产精品男人爽免费视频1| 美日韩丰满少妇在线观看| 亚洲——在线| 最新日韩av| 久久精品av麻豆的观看方式| 日韩亚洲欧美中文三级| 欧美视频在线不卡| 久久亚洲私人国产精品va| 亚洲一品av免费观看| 亚洲国产精品成人综合| 另类天堂av| 久久电影一区| 亚洲影视综合| 亚洲免费av电影| 亚洲黄网站黄| 黄色成人免费观看| 国产农村妇女毛片精品久久麻豆 | 国产亚洲欧美一级| 国产精品久久久久久久免费软件| 久久中文字幕一区| 午夜精品久久久| 99天天综合性|