freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

delphi的對(duì)象機(jī)制淺探-全文預(yù)覽

  

【正文】 object 3. 編譯器保證任何層次的 constructor 調(diào)用后 eax = pointer to current object 4. dl = 1 時(shí) 編譯器保證 Create 調(diào)用 ,并與 constructor 相同的方式使用 eax dl = 1 時(shí) 編譯器保證 Create 調(diào)用 ,并且調(diào)用前后 eax = pointer to current object dl = 0 時(shí) 編譯器保證 Create 不會(huì)調(diào)用 dl = 0 時(shí) 編譯器保證 Create 不會(huì)調(diào)用 5. 中設(shè)置結(jié)構(gòu)化異常處理,在 Create 即將結(jié)束時(shí)關(guān)閉結(jié)構(gòu)化異常處理。 dl = 0 則跳過(guò) _AfterConstruction 到 2 處 call AfterConstruction 。 call Beep 。 _ClassCreate 和 AfterConstructor (編譯器實(shí)現(xiàn) ) mov eax, [ebp$04] 。 可能會(huì)改變 edx 的值 mov [ebp$04], eax 。 如果 dl = 0 則跳到 ClassCreate 之后 1 處執(zhí)行 jz +$08 add esp, $10 。 constructor 的反匯編代碼: 。 class reference 時(shí)編譯器設(shè)置 dl = 1 mov eax, [$004600ec] 。 register。 begin inherited。 設(shè)置非 PC 架構(gòu)的結(jié)構(gòu)化異常處理 desc: JMP _HandleAnyException { destroy the object } MOV EAX,[ESP+8+9*4] MOV EAX,[EAX]. TEST EAX,EAX JE skip MOV ECX,[EAX] MOV DL,$81 PUSH EAX CALL DWORD PTR [ECX] + VMTOFFSET POP EAX CALL _ClassDestroy skip: { reraise the exception } CALL _RaiseAgain {$ENDIF} end。 如果 dl = 0 則不調(diào)用 JL noAlloc CALL DWORD PTR [EAX] + VMTOFFSET 。 ⊙ 函數(shù)的代碼: function _ClassCreate(AClass: TClass。 ⊙ 函數(shù)的代碼: function _AfterConstruction(Instance: TObject): TObject。 恢復(fù)堆棧,注意只恢復(fù)了 12 字節(jié)的堆棧,還有 4 字節(jié)由上句 pop 了 ret 注意:以上匯編代碼中重復(fù)出現(xiàn)了 test dl,dl,說(shuō)明 Borland 并沒(méi)有特別對(duì)待 , 確實(shí)是個(gè)空函數(shù)。 (注意不是 ) pop dword ptr fs:[$00000000] 。 調(diào)用 1: test dl, dl 。 檢查 dl 是否 = 0 jz +$08 。 pop ecx 。 把指向 TObject class VMT 的指針存入 eax, 。 前 2 句用于設(shè)置堆棧指針 mov ebp, esp push ecx 。 以下是測(cè)試內(nèi)容: ================================================= ⊙ 測(cè)試目標(biāo):查看 的編譯器實(shí)現(xiàn) ================================================= ⊙ 測(cè)試代碼及反匯編代碼: procedure Test。 如果出錯(cuò)則會(huì) (1)釋放由編譯器分配的內(nèi)存 (2)恢復(fù)堆棧至創(chuàng)建對(duì)象之前 (3)調(diào)用 。 的匯編代碼是由 constructor directive 指示編譯器形成的,編譯器對(duì)每個(gè) class 都一視同仁。我一直是用 Delphi 的組件拖放編程,真正的功底只是這幾天閱讀 Object Pascal Reference 和 VCL 得來(lái)的,匯編更是臨時(shí)抱佛腳,所以錯(cuò)誤難免。最后只好臨時(shí)啃了一下匯編,把 Delphi 對(duì)象操作的幾個(gè)關(guān)鍵的方法勘察了一遍。在大富翁請(qǐng)教了幾位仁兄后,我還是對(duì) Delphi 對(duì)象的創(chuàng)建和方法調(diào)用原理不太清楚。其實(shí)更重要的是,大家可以幫忙檢查我的分析有沒(méi)有錯(cuò)誤。 主 要的結(jié)論是: (*) 確實(shí)是個(gè)空函數(shù), Borland 并沒(méi)有隱藏 的代碼。 (*) 一個(gè)對(duì)象的正常的創(chuàng)建 (Obj := )過(guò)程是這樣的: 1. 編譯器保證第一個(gè) constructor 調(diào)用之前 dl = 1 編譯器保證 inherited Create 調(diào)用之前 dl = 0 2. dl = 1 時(shí) 編譯器保證 Create 時(shí) eax = pointer to class VMT dl = 0 時(shí) 編譯器保證 Create 時(shí) eax = pointer to current object 3. 編譯器保證任何層次的 constructor 調(diào)用后 eax = pointer to current object 4. dl = 1 時(shí) 編譯器保證 Create 調(diào)用 ,并與 constructor 相同的方式使用 eax dl = 1 時(shí) 編譯器保證 Create 調(diào)用 ,并且調(diào)用前后 eax = pointer to current object dl = 0 時(shí) 編譯器保證 Create 不會(huì)調(diào)用 dl = 0 時(shí) 編譯器保證 Create 不會(huì)調(diào)用 5. 中設(shè)置結(jié)構(gòu)化異常處理,在 Create 即將結(jié)束時(shí)關(guān)閉結(jié)構(gòu)化異常處理。 要讀懂下文的測(cè)試過(guò)程,可能需要相關(guān)基礎(chǔ),推薦閱讀 Object Pascal Reference 以下章節(jié): Parameter passing Function results Calling conventions (register 缺省調(diào)用約定, constructor 和 destructor 函 數(shù)必須采用 register 約定 ) Inline assambly code 《 Delphi 的原子世界》非常值得一讀。 begin push ebp 。 設(shè)置 dl = 1,通知 這是一次新建對(duì)象的調(diào)用 mov eax, [$004010a0] 。 返回新建對(duì)象的指針至 Obj end。 函數(shù)返回時(shí) eax = pointer to instance test dl, dl 。 用于 設(shè)置結(jié)構(gòu)化異常處理 call ClassCreate 。 dl 0 則調(diào)用 。 用于在出錯(cuò)時(shí)自動(dòng)恢復(fù)堆棧 /釋放內(nèi)存分配 /并調(diào)用 add esp, $0c 。查看 就知道 Borland 還有其他的異常處理實(shí)現(xiàn)機(jī)制,產(chǎn)生的 代碼也不相同。 end。 保存寄存器 PUSH ECX PUSH EBX TEST DL,DL 。 恢復(fù)寄存器 POP ECX POP EDX RET {$IFNDEF PC_MAPPED_EXCEPTIONS} 。 constructor 。 procedure Test。 mov dl, $01 。 保存 新建對(duì)象的指針 end。 這 3 句用于保存堆棧指針和創(chuàng)建堆棧 mov ebp, esp add esp, $08 test dl, dl 。 將 dl 值保存到堆棧中的 1 字節(jié)中,因?yàn)楹竺娴? inherited 。 將 edx 清零 (dl = 0),以通知 不用再調(diào)用 。 調(diào)用 Beep。 (間接 )檢查 dl 是否 = 0 jz +$0f 。 返回 pointer to instance end。 ================================================================================== ⊙ 測(cè)試目標(biāo):以 object reference 和 class reference 調(diào)用構(gòu)造函數(shù)的編譯器實(shí)現(xiàn) ================================================================================== ⊙ static constructor 測(cè)試代碼及反匯編代碼 (省略了 begin 和 end 后面的堆棧分配代碼 ): procedure Test。 mov dl, $01 。 采用 object reference 時(shí)編譯器自動(dòng)設(shè)置 edx 的所有 bit 都為 1 mov eax, [ebp$04] 。 var Comp: TComponent。 設(shè)置 dl = 1 mov eax, [$00412eac] 。 xor ecx, ecx 。 (如果 Comp 已經(jīng)實(shí)例化了,則 ebx 的值是對(duì)的 ) call dword ptr [ebx+$2c] 。 結(jié)論: object reference 方式的 constructor 調(diào)用,編譯器嘗試實(shí)現(xiàn)為 inherited 調(diào)用,結(jié)果當(dāng)然是錯(cuò)誤。 Str: String[255]。 lea edx, [ebp$00000104] mov eax, [ebp$04] 。 edx = address of Str 。 ======================================================================== ⊙ 測(cè)試目標(biāo):考查 ShortString 返回值類(lèi)型的函數(shù)沒(méi)有賦值時(shí)編譯器的實(shí)現(xiàn) ======================================================================== procedure Test。 編譯器會(huì)在堆棧中創(chuàng)建 256 byte 的臨時(shí)空間,以保證 edx 不會(huì)為非法值 mov eax, [$00412eac] call end。 {$ELSE} asm { EAX VMT
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1