| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1002 人关注过本帖
标题:关于ebp和esp的使用[更新了代码,增加了样例输出],代码是实现了目标 ,不过 ...
只看楼主 加入收藏
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:13 
debug版本和release版本是不一样的,debug版本可能被编译器加进来检测的代码。

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


楼主有这方面的钻研爱好了,先学下汇编,效果更好

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-10 09:47
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 11楼 yuccn
这个esp+8 为b  esp+12为a  +4为c
如果他的程序是对的话,我觉得应该是这样的

在函数体的参数放置 是  c b  a的顺序 如果他的程序是对的话
这个局部变量的放置 还真心的没怎么注意

我要成为嘿嘿的黑客,替天行道
2012-12-10 09:55
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
额外覆盖
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:城市猎人
威 望:6
帖 子:1726
专家分:5757
注 册:2012-9-22
收藏
得分:13 
路过,求分点汤

我现在所学的一切都是为了游戏!!!为了游戏,加油!加油!努力!
2012-12-10 12:14
信箱有效
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1102
专家分:4268
注 册:2012-6-19
收藏
得分:13 

int _mul(int a,int b)
{
    _asm
    {
        mov eax,[ebp+8];
        mov ebx,[ebp+12];
        imul ebx;
    }
}

push b
push a
call mul ;push 返回地址
push ebp
mov ebp,esp
。。。。。。
ebp 为保存的ebp
ebp+4 为返回地址
ebp+8为a
ebp+12为b


花几天了解了解16位汇编,然后花3个月全力认真学学win32汇编
再然后 很多问题就不是问题了
2012-12-10 13:42
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:13 
几位大帅哥 说的不错。学习了。
罗云彬的书里有详细的解释吧 可以去找找。

梅尚程荀
马谭杨奚







                                                       
2012-12-10 13:52
suijishu
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:66
专家分:144
注 册:2012-12-1
收藏
得分:13 
膜拜大牛!!!膜拜大作!!!施舍点分吧,最近分太少了
2012-12-10 14:35
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
还不结贴。我都解答了那么久

我要成为嘿嘿的黑客,替天行道
2012-12-10 16:41
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.015590 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved