找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1482|回复: 0
打印 上一主题 下一主题
收起左侧

Keil汇编进阶指南(1) - 编译与链接

[复制链接]
跳转到指定楼层
楼主
作为大家接触C51点灯用的语言(也可能不是),但看见身边大多数人仍然沿用旧版的汇编写法,故作此指南
首先,该文章所有的内容参照keil的相关文档,强烈建议使用keil μvision4及以上版本,另外keil的官方文档是以编译器版本9.61编撰的,部分内容可能未在旧版更新(比如MPL)
指路:developer.arm.com/documentation/101655/0961

编译与链接

在开始进一步汇编的编程之前,我们有必要重新温习一下整个Keil C51编译器的运作,在官方文档中提供了这样一个图



可以看见,程序并不是直接从C编译而来,首先C要编译成object文件,需要注意的是在这个时候文件并没有进行链接,也就是所有的函数跳转都是标记而不是地址,然后经过BL51进行链接,BL51会将所有的函数块还有内存变量之类的乱七八糟的东西进行妥善安置并确定好最终的地址,然后替换掉标签(这个过程可以看到会生成MAP文件,里面记载着所有的函数段之类的位置),这个时候所有的标记就都被抹掉了,生成的OMF文件也就是最终文件,我们烧写所用的HEX文件是经过OH51转了一手,μvision的调试器使用的是omf文件
我在这里插一句,在Cx51也就是C编译器那里实际上有一些更复杂的运作,一般来讲,C语言首先会被编译成汇编,然后再形成object文件,但是对于keil来说稍稍有些复杂,在此按下不表,在以下的指南中,我们都会认为C语言会被编译成汇编然后再形成obj,这个过程同时造就了一些有趣的bug,比如同时定义两个名字完全相同但是大小写不一样的变量,例如sec和SEC,keil会提示你multiple defination,也就是所谓的名字重复,主要原因就是keil的C编译器分大小写,汇编编译器不分,C不报错,因为它分大小写,但汇编编译器拿过来,他不管大小写,一看俩一样的名字,报ERROR吧
在明确了这一过程之后,我们开始进行下一步

评分

参与人数 2黑币 +80 收起 理由
wpppmlah + 30 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表