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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Delphi中methodaddress的代码解析

發(fā)布時(shí)間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi中methodaddress的代码解析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
class function TObject.MethodAddress(const Name: ShortString): Pointer;
asm
??????? { ->??? EAX???? Pointer to class??????? }
??????? {?????? EDX???? Pointer to name }
??????? PUSH??? EBX
??????? PUSH??? ESI
??????? PUSH??? EDI
??????? XOR???? ECX,ECX?????????? //清零
??????? XOR???? EDI,EDI?????????? //清零
??????? MOV???? BL,[EDX]????????? //獲得字符串的長度
??????? JMP???? @@haveVMT???????? // 判斷是否有虛擬方發(fā)表
@@outer:??????????????????????????????? { upper 16 bits of ECX are 0 !? }
??????? MOV???? EAX,[EAX]
@@haveVMT:
??????? MOV???? ESI,[EAX].vmtMethodTable? //獲得虛擬方發(fā)表的地址
??????? TEST??? ESI,ESI?????????????????? //是否存在
??????? JE????? @@parent????????????????? //如果不存在
??????? MOV???? DI,[ESI]??????????????? { EDI := method count?????????? }方法的數(shù)量
??????? ADD???? ESI,2???????????????????? // 開始?
@@inner:??????????????????????????????? { upper 16 bits of ECX are 0 !? }
??????? MOV???? CL,[ESI+6]????????????? { compare length of strings???? }? //獲得名城的長度
??????? CMP???? CL,BL????????????????????????????????????????????????????? //比較長度
??????? JE????? @@cmpChar????????????????????????????????????????????????? //如果相等就開始比較字符
@@cont:???????????????????????????????? { upper 16 bits of ECX are 0 !? }
??????? MOV???? CX,[ESI]??????????????? { fetch length of method desc?? }? //獲得方法的長度? //長度兩個(gè)字節(jié) 指針4個(gè)字節(jié)? ///
??????? ADD???? ESI,ECX???????????????? { point ESI to next method????? }? //指向下一個(gè) 函數(shù)
??????? DEC???? EDI
??????? JNZ???? @@inner
@@parent:????????????????????????????? //獲得父的方發(fā)表
??????? MOV???? EAX,[EAX].vmtParent???? { fetch parent vmt????????????? }
??????? TEST??? EAX,EAX??????????????? //是否為0
??????? JNE???? @@outer??????????????? //不為零
??????? JMP???? @@exit????????????????? { return NIL??????????????????? }? //已經(jīng)到根

@@notEqual:
??????? MOV???? BL,[EDX]??????????????? { restore BL to length of name? } //存儲(chǔ)名字的長度
??????? JMP???? @@cont??????????????????????????????????????????????????? //轉(zhuǎn)移

@@cmpChar:????????????????????????????? { upper 16 bits of ECX are 0 !? }
??????? MOV???? CH,0??????????????????? { upper 24 bits of ECX are 0 !? }? ///清空高位字節(jié)
@@cmpCharLoop:
??????? MOV???? BL,[ESI+ECX+6]????????? { case insensitive string cmp?? }? //獲得第一個(gè)字符
??????? XOR???? BL,[EDX+ECX+0]????????? { last char is compared first?? }? //比較
??????? AND???? BL,$DF???????????????????????????????????????????????????? //清空其他標(biāo)志位?
??????? JNE???? @@notEqual
??????? DEC???? ECX????????????????????? { ECX serves as counter???????? } //比較下一個(gè)
??????? JNZ???? @@cmpCharLoop????????????????????????????????????????????? //如果不為零 進(jìn)行下一個(gè)字符的比較

??????? { found it }
??????? MOV???? EAX,[ESI+2]????????????? //找到 并且得到指針 12 方法長度 3456 方法指針 7890 方法名稱 7 方法名城的長度

@@exit:
??????? POP???? EDI
??????? POP???? ESI
??????? POP???? EBX
end;

總結(jié)

以上是生活随笔為你收集整理的Delphi中methodaddress的代码解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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