求大神把这个c语言转汇编程序序改成c语言程序的

肯求高手帮忙把一个50行汇编代码的ARM 函数改成C语言(成了请到东莞HAPPY:P,哈哈)
[问题点数:100分,结帖人wmajia]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:662
2012年12月 硬件/嵌入开发大版内专家分月排行榜第三
本版专家分:0
结帖率 100%
本版专家分:0
结帖率 100%
本版专家分:662
2012年12月 硬件/嵌入开发大版内专家分月排行榜第三
本版专家分:0
结帖率 100%
本版专家分:0
结帖率 100%
本版专家分:662
2012年12月 硬件/嵌入开发大版内专家分月排行榜第三
本版专家分:0
结帖率 100%
本版专家分:662
2012年12月 硬件/嵌入开发大版内专家分月排行榜第三
匿名用户不能发表回复!|
CSDN今日推荐求大神看看估计下这两句C语言代码改成汇编优化空间大不大!【51单片机吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:59,611贴子:
求大神看看估计下这两句C语言代码改成汇编优化空间大不大!收藏
VPU= (P2 && 4)+(P3 && 4);SPT[VPU]++;说明 :VPU是个2字节整型变量,SPT[?]是有4096个4字节整型的数组。作用是当求出VPU(来自端口P2和P3)的值之后,将SPT中对应VPU的值加1.
开发宝专注于单片机开发服务,行业精英工程师随您挑选!快来免费发布项目需求吧!单片机开发外包服务要选靠谱的电子研发众包平台-开发宝,10万+的电子研发人才.
主要是执行速度上还需要提高,这两句在我的设计中执行频率极高,使用C并使用了片外SRAM,VPU已经声明为了data变量,而SPT[?]则声明为了xdata。
我相信,爱可以排除万难。只是,万难之后,又有万难,这是我更相信的。
忘记那个人,不如忘记自己。告诉自己,不是怕他忘记,而是怕他有一天重新把你想起。岁月带走的是记忆,但回忆会越来越清晰。真的有一天,他回过头来告诉你,他一直在惦记你,千万不要相信,因为,他已经不是原来的他,而你,也不再是过去的你。
登录百度帐号实践!C语言是怎么变成汇编的
“郭孟琦 + 原创作品转载请注明CSDN博客 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC- ”
在大学计算机组成原理一课中学习各种汇编语言跟C语言的关系,同时在单片机接口技术中也学习了C51的汇编语言,在一些MCU调试中也看到了反汇编的内容。但是从来没亲自实践一下C语言是怎么变成汇编的过程以及他们之间的对应关系。作为作业今天就在这里写下我的发现吧。
按照要求这是一段很简单的c语言程序
进行编译生成汇编文件
生成的main.s文件 已经把多余的命令删除了(gvim好像确实没vim好用。。。)
一开始是这样的 空栈
ebp!esp!
程序从main标签处运行,开始push,mov后(我用ebp!和esp!来表示实际的ebp esp所指向的位置吧,表示起来好麻烦 ebp(main)是指向0那个位置的ebp 就是表格最上边那个位置)
ebp!esp!ebp(main)
到了subl esp减4 向下移动一个字节 并且把立即数233存到了esp指向的位置(间接寻址?)
ebp!ebp(main)
当执行call f时 eip会被push
ebp!ebp(main)
esp!eip(main)
接下来看f标签
在push 和movl后 ebp(f)是指向第二行那个ebp
ebp(main)
eip(main)
esp!ebp!ebp(f)
同样esp在减4后向下移动1个地址
ebp(main)
eip(main)
ebp!ebp(f)
接下来因为栈空间向下生长,变址寻址向上加8也就是向上2个位置(就是233)存入eax
接下来要把eax的内容存入esp指向的位置就成了
ebp(main)
eip(main)
ebp!ebp(f)
又一次的Call
ebp(main)
eip(main)
ebp!ebp(f)
esp!eip(f)
进入g标签,前两句类似(其实就是存储原来ebp的位置将ebp指向新的位置),变址寻址向上加8也就是向上2个位置(就是233)存入eax
ebp(main)
eip(main)
ebp!esp!ebp(g)
然后666加上eax里的内容也就是c语言中的 “x +666”啦 到这里函数的嵌套总算是完事了开始一层层恢复,首先是popl ebp,ebp指向f 中的ebp位置了 同时 esp也会加4向上移动
ebp(main)
eip(main)
ebp!ebp(f)
esp!eip(f)
然后ret相当于 pop eip程序回到 刚才 eip(f)的那个位置啦
ebp(main)
eip(main)
ebp!ebp(f)
leave实际上是 mov %ebp %esp
也就是将上一级的栈恢复回来(有个问题为什么在g里没有leave? 我认为popl %ebp就ok了 因为当时后序操作并未改变esp,esp和ebp指向同一位置 就没必要mov %ebp %esp 了可能就被优化掉了。)
要注意mov后pop操作又再一次改变了esp指向的位置
ebp!ebp(main)
esp!eip(main)
我们继续走ret
ebp!ebp(main)
eip(main)
别忘了结果一直在存着eax,现在再加1 就是c语言里 的f(233)+1
最后leave恢复之前的 ebp和esp
ebp!esp!
ebp(main)
eip(main)
跟刚开始是不是一样了!
那么到现在为止,计算机是如何工作的?
我认为计算机的工作方式就是执行一系列指令,在其中当我们只用高级语言中的“函数调用”等需要跳转时计算机总会先保存现在的状态然后再处理完成后再依次恢复之前的状态,同时需要“带回去”的数据另存在其他地方比如:eax。此外我终于明白为什么C语言只能有一个返回值了。。。。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!我这个汇编语言程序应该怎么改_百度知道
我这个汇编语言程序应该怎么改
我有更好的答案
你这不是汇编程序呀,是C程序。把这个工程关掉,把那个程序的文件名改成567.C,然后重建一个工程,再加载改名的C程序,再编译就好啦!其实,比较简便的操作是,删掉这个工程中的567.ASM,重新加载567.C就行。
采纳率:92%
来自团队:
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。一种汇编语言到C语言的转换方法_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
一种汇编语言到C语言的转换方法
&&一种汇编语言到C语言的转换方法
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 汇编程序 的文章

更多推荐

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

点击添加站长微信