Keil 汇编asm/A51多个文件

来源:互联网 发布:一元抽奖的软件是什么 编辑:程序博客网 时间:2024/06/05 09:38

最近在使用keil写51单片机(用汇编),代码比较多,想分成多个asm文件进行编译,这样能实现模块化。如果是c语言,就很简单,直接分成多个.c文件就行了。但是在纯汇编工程里面,还是有一些需要注意的地方。


首先,代码空间(CODE SPACE)中,代码可以分为很多代码节(CODE SEGMENT)。代码节与代码节之间不能重叠。使用CSEG伪指令可以指定代码节的位置。与ORG伪指令不同,CSEG是指定某个代码节的位置,而ORG是指定代码在某个代码节中的位置。CSEG的用法详见Keil的帮助文档CSEG Assembler Statement


而对于每个.asm(.A51)文件,代码节默认是从0000H开始的。因此如果有多个asm文件,即使第一个文件加了ORG 0000H,第二个文件加了ORG 1000H,链接的时候还是会报错:


WARNING L5: CODE SPACE MEMORY OVERLAP


因为代码虽然没有重叠,代码节却重叠了。所以,如果有多个.asm(.A51)文件需要编译,需要在包含第一条汇编指令的.asm(.A51)文件开头添加:


CSEG AT 0000H



以保证这个文件的第一个指令是写在0000H处的(虽然不加CSEG AT 0000H也行,毕竟代码节默认是在0000H处的);其他的.asm(.A51)文件开头添加两行:


CUSTOM_NAME  SEGMENT  CODERSEG  CUSTOM_NAME


这样,链接器就会自动把所有的代码节拼起来,而不会报“CODE SPACE MEMORY OVERLAP”之类的错了。SEGMENT用法详见Keil的帮助文档SEGMENT Assembler Statement,RSEG用法详见Keil的帮助文档RSEG Assembler Statement


另外,如果某个.asm(.A51)文件中的一个函数(或者DATA、BIT定义的常数等等)需要导出,以供其他文件调用,那这个代码文件中需要添加PUBLIC伪指令:


PUBLIC NAME1,NAME2,...


如果某个.asm(.A51)文件用了其他文件中的函数(或者DATA、BIT定义的常数等等),需要使用EXTRN伪指令:


EXTRN CODE (NAME1)EXTRN DATA (NAME2)EXTRN BIT (NAME3)...

EXTRN的用法详见Keil的帮助文档EXTRN Assembler Statement