Delphi中MethodAddress汇编代码的解析
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 //判断是否有虚拟方发表
@@outer: { upper 16 bits of ECX are 0 ! }
MOV EAX,[EAX]
@@haveVMT:
MOV ESI,[EAX].vmtMethodTable //获得虚拟方发表的地址
TEST ESI,ESI //是否存在
JE @@parent //如果不存在
MOV DI,[ESI] { EDI := method count }方法的数量
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 } //获得方法的长度 //长度两个字节 指针4个字节 ///
ADD ESI,ECX { point ESI to next method } //指向下一个函数
DEC EDI
JNZ @@inner
@@parent: //获得父的方发表
MOV EAX,[EAX].vmtParent { fetch parent vmt }
TEST EAX,EAX //是否为0
JNE @@outer //不为零
JMP @@exit { return NIL } //已经到根
@@notEqual:
MOV BL,[EDX] { restore BL to length of name } //存储名字的长度
JMP @@cont //转移
@@cmpChar: { upper 16 bits of ECX are 0 ! }
MOV CH,0 { upper 24 bits of ECX are 0 ! } ///清空高位字节
@@cmpCharLoop:
MOV BL,[ESI+ECX+6] { case insensitive string cmp } //获得第一个字符
XOR BL,[EDX+ECX+0] { last char is compared first } //比较
AND BL,$DF //清空其他标志位
JNE @@notEqual
DEC ECX { ECX serves as counter } //比较下一个
JNZ @@cmpCharLoop //如果不为零 进行下一个字符的比较
{ found it }
MOV EAX,[ESI+2] //找到 并且得到指针 12 方法长度 3456 方法指针 7890 方法名称 7 方法名城的长度
@@exit:
POP EDI
POP ESI
POP EBX
end;
http://blog.csdn.net/diligentcatrich/article/details/8111297
Delphi中MethodAddress汇编代码的解析的更多相关文章
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- 实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光 学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程 ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- 实验四——使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 实验过程: 查看系统调用列表 get pid 函数 #include <stdio.h> #include & ...
- Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数A ...
- -fomit-frame-pointer 编译选项在gcc 4.8.2版本中的汇编代码研究
#include void fun(void) { printf("fun"); } int main(int argc, char *argv[]){ fun(); return ...
- 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...
- 在delphi中执行javascript代码
有时做项目难免用到代码交叉调用,delphi中执行js就是一种,两种方法可用: 一.使用webbrower,比较麻烦 二.使用ScriptControl,简单方便: 1.首先 uses ComObj; ...
- Delphi中methodaddress的汇编代码解析
class function TObject.MethodAddress(const Name: ShortString): Pointer;asm { -> EAX ...
随机推荐
- getParameter
近期学习JAVA的WEB开发,遇到Request中相关的getParameter方法问题.在网上找了一下.自己整理,以备以后查用. getParameter得到的都是String类型的.或者是用于读取 ...
- ARM
ARM全新架构:cortex架构 cortex-A:高端:cortex-R:实时嵌入式系统:cortex-m:廉价: 哈佛结构:数据总线和地址总线分开: 冯若依曼:地址总线,数据总线不分开: cort ...
- C++,常成员函数
#include <iostream> using namespace std; class Test { public: int x; int y; void const_m1() co ...
- BZOJ 1833: [ZJOI2010]count 数字计数( dp )
dp(i, j, k)表示共i位, 最高位是j, 数字k出现次数. 预处理出来. 差分答案, 对于0~x的答案, 从低位到高位进行讨论 -------------------------------- ...
- [转]Mysql自动备份并保存近15天记录脚本
本脚本主要现实在CentOS中实现对MySQL数据库的备份和保留最近十五天的备份文件.避免太多无用陈旧的备份占用空间. #!/bin/bash id='root' #用户名 pwd='123123' ...
- 树莓派安装mysql
首先我想启用root用户,所以我先启用root用户: sudo passwd root 这里会提示输入两次密码,然后: sudo passwd --unlock root 这样就可以启动root登录, ...
- JMS 企业开发流程实现
关于JMS的一些介绍参见[http://blog.csdn.net/aking21alinjuju/article/details/6051421] [补充] 消息的组成 1. 头(head) 每条J ...
- ZOJ 2794 Just Pour the Water 【矩阵快速幂】
给你n个杯子,每次有特定的到水规则,倒m次请问最后每个被子里还有多少水 我们很容易发现每次变化的规则相同,那么可以set 一个矩阵存放 然后多次倒水就相当于矩阵相乘,在m 范围达到(1<= M ...
- ZOJ 1893 A Multiplication Game 【简单博弈】
感觉ZJU上有不少博弈的题目. 这道题目还是比较好理解的,题目大概意思是:两人轮流乘一个2-9的数,从1开始乘,求谁的乘积先大于N. 还是寻找必败点必胜点,不过在这个题目里转换成了寻找必败区间必胜区间 ...
- jQuery如何设置自增自减值
一直不是很记得jquery中怎么设置自增值,比如当点击按钮时 div在当前宽度基础上增加宽度100px,可以这样写: $('button.test').click(function(){ $('div ...