- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言绝对地址跳转
C语言使用函数指针跳转到程序固定地址(0x8000)执行程序的方法使用函数指针,把一个纯数据强制转换为函数指针类型。int main(void){void (* my_function)(void);//int *my_address = 0x8000;my_function =?(void (*)())?(0x8000);my_function();}其实更简单,不适用中间变量,直接一步到位:(*(void(*)())0x8000)();转成汇编就占两条指令.在/tags/IAPIAP的/tags/bootloaderbootloader中经常使用到地址跳转,指定程序跳转到某一地址运行,例如强制跳转到0x2c去执行,则可使用(*((void (*)(void))0x2c)))();实际上这是运用的函数指针,可以这样分解:?1,函数指针的定义为 void (* fd) (void); 省略参数的函数原型为?void (*)(void).2, 0x2c,这里的0x2c为地址,可以认为是变量(个人理解),可以理解为将变量0x2c进行强制类型转换,转换成函数指针类型,即(?void(*)(void)?)0x2c.3,调用函数。?(* ????(func) ???) ?(); ???func 为函数指针(void(*)(void) )0x2c,?合起来就是 (* ( (void(*)(void) )0x2c) )();/base/embeddeddevelopment嵌入式笔试题:想让程序跳转到绝对地址0x100000处执行,该如何做?网上看到有如下答案:*((void(*)(void))0x100000)();经过在VC++6.0和/base/linuxLinux?gcc4.4.3下/base/softwaretest测试,均不能通过编译。VC++6.0报错:error C2100: illegal indirectionGCC报错:error: void value not ignored as it ought to be应该是怎么写呢?经过测试,有两种方法:答案1. ? ?(*(void(*)(void))0x100000)();答案2. ? ?((void(*)(void))0x100000)();仔细观察,第一种写法只是第一个*的位置不同,第二种写法少了一个*,但是都能正确编译通过,且正确执行。为什么会有这两种答案呢?查阅资料后发现,与历史原因有关……先来看看如下例子:例一:[cpp]?/jipingyuan/article/detailsiew plain?/jipingyuan/article/detailsopy?/jipingyuan/article/detailsrint/jipingyuan/article/details#include?stdio.h?void?func(void)??{???printf(hello.\n);??}??void?main(void)??{???printf(func=%d\n,?func);???printf(func=%d\n,?func);??}??运行程序后发现两次打印结果相同!!!按照运算符本来的意义,它要求其操作数是一个对象,但函数名不是对象(函数是一个对象),本来func是非法的,但很久以前有些编译器已经允许这样做,c/c++标准的制定者出于对象的概念已经有所发展的缘故,也承认了func的合法性。因此,对于func和func可以这样理解,func是函数的首地址,它的类型是void (),func表示一个指向函数void?func(void)这个对象的地址,它的类型是void (*)(),因此func和func所代表的地址值是一样的,但类型不一样。func是一个函数,func表达式的值是一个指针!既然取不取址都可以,那么*不*也都可以……所以,在调用一个函数的时候,也有两种方法,正如前面的两种答案。例二:[cpp]?/jipingyuan/article/detailsiew plain?/jipingyuan/article/detailsopy?/jipingyuan/article/detailsrint/jipingyuan/article/details#include?stdio.h??void?func(void)??{???printf(hello.\n);??}???void?main()??{???void?(*func_p)(void)?=?func;//定义一个函数指针,这个指针无返
文档评论(0)