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

正文內(nèi)容

delphi的對(duì)象機(jī)制淺探(編輯修改稿)

2024-09-26 10:00 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 =================================================== ⊙ 測(cè)試目標(biāo):考查 ShortString 返回值類型的函數(shù)沒(méi)有賦值時(shí)編譯器的實(shí)現(xiàn) ======================================================================== procedure Test。 register。 begin 。 lea edx, [ebp$00000100] 。 編譯器會(huì)在堆棧中創(chuàng)建 256 byte 的臨時(shí)空間,以保證 edx 不會(huì)為非法值 mov eax, [$00412eac] call end。 ⊙ 函數(shù)代碼: class function : ShortString。 {$IFDEF PUREPASCAL} begin Result := PShortString(PPointer(Integer(Self) + vmtClassName)^)^。 end。 {$ELSE} asm { EAX VMT } { EDX Pointer to result string } PUSH ESI PUSH EDI MOV EDI,EDX 。 EDX 是返回值串的指針 MOV ESI,[EAX].vmtClassName XOR ECX,ECX MOV CL,[ESI] 。 設(shè)置 result string 的 length INC ECX REP MOVSB POP EDI POP ESI end。 {$ENDIF} 結(jié)論:這只是我想了解字符串返回值的傳遞方式。 =================== (完 ) =================== 來(lái)自: lance2020, 時(shí)間: 202013 9:46:00, ID: 2390276 寫(xiě)的非常好! 來(lái)自: dedema, 時(shí)間: 202013 9:57:00, ID: 2390302 這么厲害??!一個(gè)晚上就完成了! 來(lái)自: 積步 , 時(shí)間: 202013 10:10:00, ID: 2390324 mark 來(lái)自: zhumoo, 時(shí)間: 202013 10:26:00, ID: 2390353 高手就是高手 ,學(xué)習(xí) . 來(lái)自: kk2020, 時(shí)間: 202013 15:05:00, ID: 2390894 樓主一個(gè)晚上完成,只能說(shuō)佩服了! 來(lái)自: renyi, 時(shí)間: 202013 17:54:00, ID: 2391175 厲害,不知 Delphi 的對(duì)象機(jī)制和 Java 、 C 相比,哪個(gè)個(gè)的效率更高? 來(lái)自: einsteingod, 時(shí)間: 202013 19:07:00, ID: 2391225 寫(xiě)的非常好! 來(lái)自: xff916, 時(shí)間: 202013 19:49:00, ID: 2391246 牛呀,學(xué)習(xí) ,學(xué)習(xí),在學(xué)習(xí) 來(lái)自: 積步 , 時(shí)間: 202013 19:50:00, ID: 2391248 小弟還有一事不知。 通過(guò) asm訪問(wèn)類 的私有變量 . TA = class private FA: Integer。 public procedure SetA(Value: Integer)。 end。 var Form1: TForm1。 implementation {$R *.dfm} procedure (Sender: TObject)。 var A: TA。 tmpInt: Integer。 begin A := 。 tmpInt := 0。 (100)。 asm MOV ECX, 。 //為什麼 = 100 立即數(shù)就可以顯示為 100, 如果不改就顯示 為其它值。 MOV tmpInt, ECX。 end。 ShowMessage(IntToStr(tmpInt))。 。 end。 來(lái)自: savetime, 時(shí)間: 202014 1:30:00, ID: 2391511 to 積步 : DELPHI 對(duì)“ MOV ECX, ”生成的代碼實(shí)際上 是以 Record 的類型生成的,這樣 ECX 的值就是 變量 A 的地址 加上 的偏移值,結(jié)果是 ECX 變成堆棧上的一個(gè)值,所以不對(duì)。 的實(shí)際地址是 A 指向的地址 (也就是對(duì)象內(nèi)存位置,而不是 A 的地址 )加上 FA 相對(duì)于對(duì)象 頭部的偏移地址。我湊出以下的代碼,可以實(shí)現(xiàn)你要的結(jié)果: var A: TA。 tmpInt: Integer。 begin A := 。 tmpInt := 0。 (100)。 asm MOV EBX, A MOV ECX, TA(EBX).FA。 // 通知編譯器 EBX 指向的是 TA class MOV tmpInt, ECX。 end。 ShowMessage(IntToStr(tmpInt))。 。 end。 我沒(méi)寫(xiě)過(guò)匯編代碼,所以不知道 DELPHI 會(huì)不會(huì)自動(dòng)保護(hù)其他使用 EBX 的語(yǔ)句。如果你知道在混合 匯編的情況下如何使用寄存器請(qǐng)教我一下。 其實(shí)我真的不知道還有這種方法可以獲得私有成員,有趣! 來(lái)自: savetime, 時(shí)間: 202014 2:40:00, ID: 2391532 內(nèi)容更正: 我發(fā)現(xiàn)自己在上文注釋中的一個(gè)錯(cuò)誤,在以下匯編第三行的“ push ecx ”我把它注釋為 “保存 ecx (無(wú)用的語(yǔ)句 )”, 更正為: “分配局部變量 Obj 的堆棧空間”。 原來(lái) add esp, $4 花費(fèi) 3 個(gè)字節(jié)的指令 而 push ecx 只要 1 個(gè)字節(jié)的指令,執(zhí) 行更快 大家現(xiàn)在知道我不是高手了吧,我是一邊翻匯編手冊(cè),一邊寫(xiě)注釋的。我只能毫不謙虛地 說(shuō):我真的是初學(xué)者。高手看這些簡(jiǎn)單的匯編代碼哪里需要花一個(gè)晚上。 希望大家關(guān)注內(nèi)容,不要只是說(shuō)“好”,重要的是“有沒(méi)有錯(cuò)誤”,這樣才能提高。 出錯(cuò)的注釋段: ================================================= ⊙ 測(cè)試目標(biāo):查看 的編譯器實(shí)現(xiàn) ================================================= ⊙ 測(cè)試代碼及反匯編代碼: procedure Test。 register。 var Obj: TObject。 begin push ebp 。 前 2 句用于設(shè)置堆棧指針 mov ebp, esp push ecx 。 保存 ecx (無(wú)用的語(yǔ)句 ) (更正為 ) 分配局部變量 Obj 的堆棧空間 Obj := 。 mov dl, $01 。 設(shè)置 dl = 1,通知 這是一次新建對(duì)象的調(diào)用 mov eax, [$004010a0] 。 把指向 TObject class VMT 的指針存入 eax, 。 作為 隱含的 Self 參數(shù) call 。 調(diào)用 函數(shù) mov [ebp$04], eax 。 返回新建對(duì)象的指針至 Obj end。 pop ecx 。 恢復(fù)堆棧并返回 pop ebp ret 來(lái)自: savetime, 時(shí)間: 202014 2:40:00, ID: 2391533 to 積步 , 我測(cè)試了在混合匯編的情況下修改寄存器時(shí)的實(shí)現(xiàn),結(jié)果是: Delphi 會(huì)自動(dòng)把嵌入?yún)R編中修改了的寄存器備份在堆 棧中,所以可以隨意使用 Delphi 允許的寄存器。 來(lái)自: book523, 時(shí)間: 202014 10:20:00, ID: 2391614 結(jié)論:真是精妙!一個(gè)對(duì)象的正常的創(chuàng)建 (Obj := , 與后面不正常的調(diào)用相對(duì) )過(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)化異常處理。 如果出錯(cuò)則會(huì) (1)釋放由編譯器分配的內(nèi)存 (2)恢復(fù)堆棧至創(chuàng)建對(duì)象之前 (3)調(diào)用 。 看上去有點(diǎn)繁雜,可是如果讀懂了上面 和 則會(huì)感覺(jué)對(duì)象的創(chuàng)建非常清晰。 為什么要保存經(jīng)常調(diào)用 dl 的值? Dl 主要用來(lái)表示是 class 級(jí)別調(diào)用還是對(duì)象級(jí)別調(diào)用, class 級(jí)別調(diào)用時(shí), constructor 會(huì)自動(dòng)執(zhí)行 , NewInstance,InitInstance, AfterConstruction 等過(guò)程, 然后才是 Constructor 中的代碼, 而對(duì)象級(jí)別調(diào)用時(shí),只會(huì)執(zhí)行 Constructor 中的代碼。 來(lái)自: savetime, 時(shí)間: 202014 12:18:00, ID: 2391785 to book523, 你說(shuō)的是我在“⊙測(cè)試目標(biāo):以 object reference 和 class reference 調(diào)用構(gòu)造函數(shù)的編譯器實(shí)現(xiàn)”中的結(jié)果吧。我在文章中寫(xiě)的結(jié)論是:“ object reference 方式的 constructor 調(diào)用,編譯器嘗試實(shí)現(xiàn)為 inherited 調(diào)用” 其實(shí)如果你看了測(cè)試代碼的反匯編過(guò)程,就應(yīng)該知道我的這個(gè)結(jié)論是錯(cuò)誤的。Borland 在 Object Pascal Reference 中寫(xiě)的就是你說(shuō)的“對(duì)象級(jí)別調(diào)用時(shí),只會(huì)執(zhí)行 Constructor 中的代碼?!保墒鞘聦?shí)上不是這樣。 在形式如下的代碼中 AComp := Borland 先將 edx 所有 bit 設(shè)置為 1 ,也就是 dl 為 1,也就是仍然嘗試沿用 class 級(jí)別的調(diào)用??墒悄憧? Delphi 的生成的匯編代碼不知所云,所以根本就沒(méi)有所謂的“對(duì)象級(jí)別調(diào)用”。我認(rèn)為 Borland 應(yīng)該對(duì) AComp := 調(diào)用提示為語(yǔ)法錯(cuò)誤。我實(shí)在是想不到什么時(shí)候會(huì)需要這種形式的調(diào)用。 我測(cè)試這樣的調(diào)用方式是因?yàn)槲医?jīng)常在創(chuàng)建 Form 時(shí)忘了寫(xiě) T 這一標(biāo)識(shí)符: ChildForm := (nil)。 // 這里應(yīng)該是 (nil) 我想知道這樣的結(jié)果是什么。 來(lái)自: vc_delphi, 時(shí)間: 202014 18:27:00, ID: 2392395 高手就是高手 ,學(xué)習(xí) . 來(lái)自: 積步 , 時(shí)間: 202014 21:30:00, ID: 2392563 to savetime: 多謝指教。 以前也研究過(guò)匯編什麼東東的
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1