首页
社区
课程
招聘
怎么判断一个CALL的大小呢??
发表于: 2010-3-13 11:41 5103

怎么判断一个CALL的大小呢??

2010-3-13 11:41
5103
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 71
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
call的大小??啥子意思?
2010-3-13 11:42
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
不解
您是指call的那个函数的大小
还是指call指令的大小?
2010-3-13 11:42
0
雪    币: 219
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主没表达清楚意思啊
2010-3-13 23:55
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
帮你找点call的执行过程!:

a.段内直接转移,具体格式:CALL 过程名。此时CS不入栈,IP的内栈入栈,入栈后再将加上目的地址与CALL指令的下一条指令的偏移地址之差值就可以转移到目的地址,详细过程:SP-2=>SP;将堆栈指针SP减2(SP)<=IP;将IP进栈IP+偏移地址之差;转到目的地址b.段内间接转移,具体格式:CALL OPRD,那么在这里OPRD可以寄存器或内存单元,它的具体实现过程:SP-2=>SP;将堆栈指针SP减2(SP)<=IP;将IP进栈IP<=(OPRD);转到目的地址同a一样,CS不入栈c.段间直接转移,具体格式:CALL 过程名 [FAR],此时CS,IP均要入栈,详细的实现过程:SP-2=>SP;将堆栈指针减2(SP)<=CS;将CS入栈SP-2=>SP;将堆栈指针再减2(SP)<=IP;将IP入栈;装入新的CS,IPIP<=过程入口的偏移地址CS<=过程入口的段地址d.段间间接转移,具体格式:CALL OPRD [FAR],此时CS,IP均要入栈,OPRD是32位,你知道在8086中没有32位寄存器。因此,这里的OPRD一定是存储单元,高16位是CS的值,低16位是IP值,详细的实现过程:SP-2=>SP;将堆栈指针减2(SP)<=CS;将CS入栈SP-2=>SP;将堆栈指针再减2(SP)<=IP;将IP入栈;装入新的CS,IPIP<=(OPRD+2,OPRD+3)CS<=(OPRD,OPRD1)
2010-3-14 01:00
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
2010-3-14 01:41
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你问一个函数的大小?
2010-3-14 18:20
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主你得到答案了吗,我也想知道
2010-3-15 18:09
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
9
6楼的答案不行吗?
2010-3-15 18:33
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
长度反汇编引擎
2010-3-17 17:22
0
雪    币: 142
活跃值: (22)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
完全没听懂你要问什么,要不可以回答你了
2010-3-18 08:41
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
那一行回答太普通了,大家都还以为仅仅是一行字而已~~~后面把网址加上应该会好很多
2010-3-18 10:22
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不是太懂楼主问的什么
2010-3-18 13:22
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
S大大给的那篇文章应该没问题,但是……太复杂了……一般来说函数不会跳到很远的地方再跳回来吧,这时Jcc只是在函数内部跳,如果统计函数大小的话完全可以无视掉它们,直接从函数的起始地址开始一个字节一个字节的统计,遇到0xC3就结束,应该能完全绝大多数任务了。简单写了一下:#include int add(int a,int b){      return (a+b);}int main(int argc,char *argv[]){        int len = 1;                                 //记录长度     unsigned char *ps = (unsigned char *)&add;    //byte ptr [xxx]       while(*ps != 0xC3)       {               num++;               ps++;        }         printf("result = %d bytes.\n",num);        return 0;}统计结果是11,反汇编一下没问题。
2010-3-18 15:03
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
格式调不好,lz自己整理一下格式吧,郁闷死了,为什么论坛会自己在前面跟后面添加《p》《/p》呢?把格式完全弄乱了。
2010-3-18 15:08
0
游客
登录 | 注册 方可回帖
返回
//