| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1002 人关注过本帖
标题:关于ebp和esp的使用[更新了代码,增加了样例输出],代码是实现了目标 ,不过 ...
取消只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:100 回复次数:5 
关于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
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
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
这和我3楼的提问有虾米关系

DO IT YOURSELF !
2012-12-10 09:13
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用yuccn在2012-12-10 09:47:20的发言:

debug版本和release版本是不一样的,debug版本可能被编译器加进来检测的代码。

你用
int _mul(int a,int b)
{
    return a*b;
}
编译,在反汇编调试下就可以知道了。
 mov eax,[ebp+8];其实就是队长中为a、 b开辟的内存地址而已。
 mov ebx,[ebp+12]; 这个为b


楼主有这方面的钻研爱好了,先学下汇编,效果更好
我用vc编译的都是debug版的exe
咋能编译成release版本的exe呢

DO IT YOURSELF !
2012-12-10 11:31
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
函数体内部叫啥呢    函数体内部的变量都是 ebp-x表示的
函数形参 貌似叫 “栈”  形参都是用ebp+x 表示的

DO IT YOURSELF !
2012-12-10 12:12
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
程序代码:
#include<stdio.h>                                     
int add(int,int)
{
    int _ret=0;
    _asm
    {
        mov eax,[ebp+8];
        mov ebx,[ebp+12];
        add eax,ebx;
        mov _ret,eax;
    }
    return _ret;
}
int main()
{
    int a=100;
    int b=200;
    printf("%d+%d=%d\n",a,b,add(a,b));
    return 0;
}

DO IT YOURSELF !
2013-03-07 14:25
快速回复:关于ebp和esp的使用[更新了代码,增加了样例输出],代码是实现了目标 ...
数据加载中...
 
   



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

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