- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[转]从单片机指针说到黑客程序.doc
[转]从单片机指针说到黑客程序|第1
内容显示中 [转]从单片机指针说到黑客程序
2004年7月的一天,在电子BBS讨论区上溜达,看到一个有趣的帖子,整个帖子内容如下:
纯C51复位功能函数:一个大三学生,让人又爱又怕
现单列复位部分如下:
main()
{
unsigned char code rst[]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32}; // 复位代码
(*((void (*)())(rst)))(); // 执行上一行代码,将rst数组当函数调用
}
本来我告诉他嵌入如下代码:
clr a
push acc
push acc
reti
结果他却玩了前面哪一段,而数组rst[]中的内容恰恰是上面的汇编机器码,他的做法是将rst数组的数据当作代码保存,然后采用绝对地址方式指向该数组,将该数组中的代码当作函数来运行。居然通过了!
我觉得有问题,我说即使如此,那绝对地址调用也应该写成(*((void (*)())(rst)))() 才对呀,结果他反驳说,那样的话,rst的地址就会当成参数传递给这个绝对地址函数,而实际LJMP调用的地址并非rst的地址,而是一个不确定的地址。于是我按照自己的说法尝试了一下,看看汇编结果,还真的是将rst的地址传递给了R1 R2,而绝对函数最终LJMP到了一个莫名其妙的地址上去了,死翘!
看来C真是一匹不容易驾驭的野马,这个大三学生理解力在我之上,我30多岁的人了,干了这么多年还没他的境界呢,唉,人家才学了几天啊,翻了几天书就这么厉害了,服了!
l 首先分析帖子的C语言代码
第一句定义一个数组rst[],数组内数据就是完成复位功能的汇编机器码,具体对应关系为:clr a == 0xe4、push acc == 0xc0,0xe0、reti ==0x32
第二句是一个函数指针的用法,函数指针用法稍微有点复杂,可参看本人著的书,:),以下为快速入门讲解。
定义一个返回值是空函数指针的定义形式如下:
void (*p) ( )
当把函数指针赋值后,就能通过函数指针调用函数,调用形式如下,
(*p) ( );
或等价的简化形式:
p ( );
假设rst就是函数指针,则如下调用形式就可以令单片机复位再起。
(*rst ) ( );
但可惜,rst不是函数指针,而是数组名,虽然两者都是地址,但不可直接调用数组名。
如同把char型变量a赋值给int型变量b,(int) 表示强制类型转换:
b = (int) a
函数指针的强制类型转换公式如下(C语言的哲学是定义形式和使用一致):
( (void (*)() ) rst
这样经过转换后的rst就可以当作函数指针使用了,简单的调用形式如下:
#define K ( (void (*)( ) ) rst
(*K) ( )
或:
( * ( void (*)( ) )rst ) ( );
这样的语句就完成复位再启功能了。类型转换符()的优先级跟指针运算符*的优先级相同,二者的结合方向是自右至左,所以上述语句就能完成复位功能了。保险起见有些程序员常常喜欢再加个括号:
#define K ( ( (void (*)( ) ) rst )
(*K) ( )
或
( *( ( void (*)( ) )rst ) ) ( );
由于没有输入参数,上述复位代码更严谨的写法是:
#define K ( ( (void (*)(void ) ) rst )
(*K) ( )
或
( *( ( void (*)(void ) )rst ) ) ( );
l 关于帖子的解释
千万不要犯“rst”形式的错误,对于一维数组而言,数组名rst就代表地址。以下二者等价,更常用的是等式左边的形式:
rst == rst[0]
整个函数指针无所谓参数传递,只是把rst当作程序执行地址调用而已,那个学生的解释也有问题。
还有一点必须提及,不是说能通过编译,甚至生成正确代码,就表示某语句一定是对的。对很复杂的语句,要考虑到编译器不严格甚至出错的可能性。
l 哈佛结构和
您可能关注的文档
- 2015年“道路运输平安年”活动方案.doc
- 2015年中心小学“多彩校园之体育节”活动方案.doc
- 2015年内蒙古自治区从业资格《会计基础》全真考试卷(附答案)考试技巧与口诀.doc
- 2015年县中小学生艺术节活动方案.doc
- 2015年台湾省护士资格考点:护理程序(必备资料).doc
- 2015年台湾省注册会计师专业阶段财管科目学习三步走必过技巧.doc
- 2015年吉林省护士资格考点:剖腹产护理考试资料.doc
- 2015年吉林省护士资格考点:基础护理肝硬变(必备资料).doc
- 2015年四川省护士资格考点:中医护理的特色内容之畅情志、调心理(必备资料).doc
- 2015年四川省护士资格考点:家庭护理小儿细菌性痢疾考试资料.doc
- 2025年天津医科大学朱宪彝纪念医院人事代理制招聘方案(5人)模拟试卷及完整答案详解一套.docx
- 2025年宜宾三江新区事业单位招聘考试(26名)模拟试卷含答案详解(新).docx
- 2025年天津市北辰医院招聘高级专业技术人员(1人)考前自测高频考点模拟试题及一套完整答案详解.docx
- 2025年度中国井冈山干部学院面向全国引进优秀人才(5人)考前自测高频考点模拟试题含答案详解(典型题.docx
- 2025年广东省佛山市南海区事业单位招聘急需紧缺专业博士(10考前自测高频考点模拟试题及一套完整答案.docx
- 2025年广西百色那坡县妇幼保健院招聘编外工作人员招聘(1人)笔试备考试题完整参考答案详解.docx
- 2025年广西百色西林县八达镇人民政府招聘村级财务会计委托代理服考前自测高频考点模拟试题附答案详解(.docx
- 2025年天津市公安局和平分局关于面向社会招聘警务辅助人员(考前自测高频考点模拟试题附答案详解(考试.docx
- 2025年太仆寺旗事业单位引进急需紧缺人才的(4人)模拟试卷含答案详解(最新).docx
- 2025年广西河池罗城特聘农机技术指导员的(1人)模拟试卷及一套答案详解.docx
文档评论(0)