求助啊,C语言中如何取得c语言main函数的位置段地址

满意回答 在C++中,main()一般要求用int,即应写为
int main (){
但有一些也可以写为void main() ,而有一些不能这么写
--------------------------------------------------------------------------------------------
任何时候都可以用int main(),所以建议不用void main()
用C++编译器编译C一般不会有什么问题,因为C++是兼容C的
要看输出,有一个办法:
在#include&stdio.h&后的下一行加#include&conio.h&
并在return 0;前一行加getch();
TA的最新馆藏[转]&[转]&> 求教如何在C语言中使用定时器?各位请帮帮忙啊,在C语言中使用定时器应该怎样做啊?
求教如何在C语言中使用定时器?各位请帮帮忙啊,在C语言中使用定时器应该怎样做啊?
hrblgh & &
发布时间: & &
浏览:30 & &
回复:2 & &
悬赏:0.0希赛币
求教如何在C语言中使用定时器?各位请帮帮忙啊,在C语言中使用定时器应该怎样做啊?
使用回调函数,代码如下:
void SetTimer(void interrupt (*handle)())
oldhandle=getvect(TIMER);
disable();
setvect(TIMER,handle);
void CloseTimer()
disable();
setvect(TIMER,oldhandle);
上面代码的编译环境:TC2.0
hrbwangye & &
17:53:27 & &
& & (0)(0)//利用中断实现每500毫秒接收一次数据
//调用DOS下的中断。
//DOS的时钟中断 int 21H
每秒产生18.2次中断
//该程序时间间隔为550毫秒
可以由count的值算出。
#define INTR 0X1C
//0x1c为时钟中断
#ifdef __cplusplus
#define __CPPARGS ...
#define __CPPARGS
void interrupt ( *oldhandler)(__CPPARGS);
int count=0;
int a=0,b=0;
void interrupt handler(__CPPARGS)
执行DOS中断时调用的程序
if(count==10)
gettime(&t);
printf( &(2)
%d\n &,b);
if(b &a)printf( &Delay %d
ms &,((100-a)+b)*10);
else printf( &Delay %d
ms &,(b-a)*10);}
int main(void)
oldhandler = getvect(INTR); //取得原来的中断向量
setvect(INTR, handler);
//设置现在的中断向量
gettime(&t);a=t.ti_
printf( &(1)
%d\n &,a);
while (count
//循环等待。执行DOS的时钟中断
setvect(INTR, oldhandler);
//执行完毕,恢复原来的中断向量
}hrbys002 & &
17:53:27 & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&中国领先的IT技术网站
51CTO旗下网站
【博文推荐】如何获得C语言函数起始地址和返回地址
在反外挂系统中,经常会检测函数的返回地址,确认函数的返回地址在规定的范围之内,从而保证,游戏程序中的函数,不被外挂所调用。这种检查方式就涉及到一个基本的技术问题,如何获得函数的返回地址?
作者:gmxydm来源:51CTO| 14:40
&本博文出自51CTO博客博主,有任何问题请进入博主页面互动讨论!
博文地址:http://4
在反外挂系统中,经常会检测函数的返回地址,确认函数的返回地址在规定的范围之内,从而保证,游戏程序中的函数,不被外挂所调用。这种检查方式就涉及到一个基本的技术问题,如何获得函数的返回地址?
例如下面的第一段代码:
#include&stdio.h&&int&main()&{&getchar();&return&0;&}&
非常简单的一段程序,那么我们如何获得该函数的起始地址和返回地址呢?起始地址获取非常容易,如下:
#include&stdio.h&&int&main()&{&printf(&%0x\n&,main);&getchar();&return&0;&}&
那么如何获得函数的返回地址呢?这个就相对来说比较困难。我们先看第一段代码反汇编后的结果:
#include&stdio.h&&intmain()&{&&push&ebp&&mov&ebp,esp&&sub&esp,0C0h&&push&ebx&009919EA&push&esi&009919EB&push&edi&009919EC&lea&edi,[ebp-0C0h]&&mov&ecx,30h&&mov&eax,0CCCCCCCCh&009919FC&rep&stos&dword&ptr&es:[edi]&getchar();&009919FE&mov&esi,esp&00991A00&call&dword&ptr&[__imp__getchar&(9982B0h)]&00991A06&cmp&esi,esp&00991A08&call&@ILT+295(__RTC_CheckEsp)&(99112Ch)&return&0;&00991A0D&xor&eax,eax&}&00991A0F&pop&edi&00991A10&pop&esi&00991A11&pop&ebx&00991A12&add&esp,0C0h&00991A18&cmp&ebp,esp&00991A1A&call&@ILT+295(__RTC_CheckEsp)&(99112Ch)&00991A1F&mov&esp,ebp&00991A21&pop&ebp&00991A22&ret
代码开始部分,先保存ebp的内容,然后将ESP的内容写入EBP:
&push&ebp&&&mov&ebp,esp&
汇编指令call会做两件事情,其一,将call指令后面的一条指令的地址压入栈中,无条件跳转到call指令的调用地指处,开始执行子程序。
和call指令对应的ret指令,则开始执行call指令后面的一条指令。
那么,ret指令如何知道call指令后面一条指令的地址呢?因为call指令已经将这条指令压入到了栈中,所以ret指令可以找到call指令后的一条指令的地址。
既然ret指令可以找到call的返回地址,也就是call的下一条指令的地址,那么我们也可以找到!!!
main函数在执行前以及执行过程中,栈的分布如下:
通过以上几张图,我们可以清楚的看到,main函数的返回地址在[EBP+4]处。所以,获得main函数的返回地址的代码如下:
#include&stdio.h&&int&main()&{&int&re_&__asm&{&mov&eax,dword&ptr&[ebp+4]&mov&re_addr,eax&}&printf(&%0X\n&,re_addr);&getchar();&return&0;&}&
其中__tmainCRTStartup()函数调用了main函数,调用的汇编代码如下:
mainret = main(argc, argv, envp);
00B81926& mov&&&&&&&&eax,dword ptr [envp (0B87140h)]&
00B8192B& push&&&&&&&eax&
00B8192C& mov&&&&&&&&ecx,dword ptr [argv (0B87144h)]&
00B81932& push&&&&&&&ecx&
00B81933& mov&&&&&&&&edx,dword ptr [argc (0B8713Ch)]&
00B81939& push&&&&&&&edx&
00B8193A&call&&&&&&& @ILT+300(_main)(0B81131h)&
00B8193F &add&&&&&&&&esp,0Ch&
00B81942& mov&&&&&&&&dword ptr [mainret (0B87154h)],eax
可以看出,call main指令后的一条指令的地址为:00B8193F,而我们获得的main的返回地址如下:
说明我们获得的结果正确。
对于其他函数的情况类似,下面笔者就把获得某个函数的返回值得功能,做成一个函数,提供给大家,如下:
#include&stdio.h&&&int&Get_return_addr()&{&int&re_&__asm&{&mov&eax,dword&ptr&[ebp]&mov&ebx,dword&ptr&[eax+4]&mov&re_addr,ebx&}&returnre_&&}&&int&main()&{&intre_addr=Get_return_addr();&printf(&%0X\n&,re_addr);&getchar();&return&0;&}&
Get_return_add函数中,为什么会多几条汇编指令呢?大家可以自行思考。【编辑推荐】【责任编辑: TEL:(010)】
大家都在看猜你喜欢
外电头条头条外电外电
24H热文一周话题本月最赞
讲师:1人学习过
讲师:26人学习过
讲师:0人学习过
精选博文论坛热帖下载排行
本书结合JSP和Servlet的最新规范,从基本的语法和规范入手,以经验为后盾,以实用为目标,以实例为导向,以实践为指导,深入浅出地讲解了JS...
订阅51CTO邮刊}

我要回帖

更多关于 c语言main函数的参数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信