| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1002 人关注过本帖
标题:关于ebp和esp的使用[更新了代码,增加了样例输出],代码是实现了目标 ,不过 ...
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:100 回复次数:19 
关于ebp和esp的使用[更新了代码,增加了样例输出],代码是实现了目标 ,不过还没弄明白咋回事,先贴出来,再慢慢研究
程序代码:
#include <stdio.h>
int _mul(int a,int b)
{
    int c;
    int d;
    c=10;
    d=16;
    _asm
    {
        mov eax,[ebp+8];
        mov ebx,[ebp+12];
        imul ebx;
        idiv DWORD PTR [ebp-4];
        idiv DWORD PTR [ebp-8];
    }
}

int main(void)
{
    int a;
    int b;
    int c;
    a=100;
    b=200;
    _asm
    {
        mov eax,[ebp-4];
        mov ebx,[ebp-8];
        sub eax,ebx;
        mov [ebp-12],eax;

    }
    printf("使用ebp计算的a(%d) - b(%d)=c(%d)\n",a,b,c);
    c=_mul(a,b);
    printf("使用ebp计算的a(%d) X b(%d)/10/16=c(%d)\n",a,b,c);
    return 0;
}



F:\c_source\t2\Debug>fc
使用ebp计算的a(100) - b(200)=c(-100)
使用ebp计算的a(100) X b(200)/10/16=c(125)

F:\c_source\t2\Debug>fc

主函数中的变量地址分别是 a= 12ff7c  b=12ff78 c=12ff74

使用ebp计算的a(100) - b(200)=c(-100)

子函数中的形参变量地址分别是 a= 12ff20  b=12ff24

子函数中的变量地址分别是 c= 12ff14  d=12ff10

使用ebp计算的a(100) X b(200)/10/16=c(125)



[ 本帖最后由 wp231957 于 2012-12-10 12:28 编辑 ]
搜索更多相关主题的帖子: 目标 
2012-12-10 09:07
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:13 
要不来解释下?

我要成为嘿嘿的黑客,替天行道
2012-12-10 09:09
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用zhu224039在2012-12-10 09:09:00的发言:

要不来解释下?
那你就解释解释
int _mul(int a,int b)
{
    _asm
    {
        mov eax,[ebp+8];
        mov ebx,[ebp+12];
        imul ebx;
    }
}

这个为什么是+8 +12

DO IT YOURSELF !
2012-12-10 09:09
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
main 函数的调用
函数调用的序幕工作时
push ebp
mov ebp,esp
sub esp,xxxx
这个前面的2个不说,后面的sub是为你的程序设置变量存放位置
完毕

我要成为嘿嘿的黑客,替天行道
2012-12-10 09:12
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
这和我3楼的提问有虾米关系

DO IT YOURSELF !
2012-12-10 09:13
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
因为C语言的函数参数传递 是用栈实现的啊  在调用前先分配函数的变量地址  然后再对其赋值  赋值的过程就是你上面的代码 +8   +12的方式
由于鄙人在反汇编方面对局部变量的存放 和 编译器在局部变量的处理上知识匮乏 还是pe文件的了解关于调试方面的知识未加详细理解 所以只能这样解答了
当时的栈的情况就是
被调用函数的变量    还回地址  调用函数的变量   系统调用main函数的还回地址  
 a         b           ret  ebp    a   b  c      ret
esp                         ebp
4         4           4      4     4   4   4       4
                                                
你 自己看
1                  
1

  a 1   ------>esp
    1
    1
    1
 
  b 1
    1
    1
    1

ret 1
    1
    1
    1

ebp 1   ----------->ebp
    1
    1
    1
 
  c 1
    1
    1
    1  
                                                            
 b  1
    1
    1
    1
         
  a 1
    1
    1
    1
                                       
 ret1
1 ebp              
按照我的想法在main()函数内的存放应该是abc  而不是cba的顺序,但是你的程序如果是正确的 就是cba的放法
你做一下减法看看   做个减法估计结果就不对了

[ 本帖最后由 zhu224039 于 2012-12-10 10:20 编辑 ]

我要成为嘿嘿的黑客,替天行道
2012-12-10 09:17
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 5楼 wp231957
怎木没关系
画了图 没办法放上去  只好用这么个方式了

我要成为嘿嘿的黑客,替天行道
2012-12-10 09:21
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
该结贴了,我的W兄  100分啊  哈哈

我要成为嘿嘿的黑客,替天行道
2012-12-10 09:24
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:13 
给我点呗 楼主我爱你
2012-12-10 09:28
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3451
专家分:19340
注 册:2012-3-31
收藏
得分:13 
路过

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2012-12-10 09:29
快速回复:关于ebp和esp的使用[更新了代码,增加了样例输出],代码是实现了目标 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013339 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved