- 1、本文档共27页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C6000 C 运行时环境 田黎育 C6000 C run-time environment定义 The run time parameters in which your program must function. These parameters are defined by 1.the memory conventions 2.register conventions 3.stack organization, 4.function call conventions 5.system initialization. 存储器模型 C6000编译器把整个存储区当作单个线性存储块,并将它分为代码区和数据区 编译器假定目标存储器的全部32-bit地址空间是可用的。 定义存储器映象并将代码和数据分配到目标存储器的是连接器,而非编译器。 Cmd文件是linker使用的。 使用.map文件 Hello.cmd 段 已初始化段 编译器生成的可重定位的代码和数据块称为段(sections) 已初始化的段:包含数据和可执行代码。C/C++编译器生成的已初始化的段有: (1).cinit段:包括变量初始值和常量值。 (2).const段:包括字符串文字(string literals),浮点常量和在C/C++中被声明为const的数据(如果常量没有同时被声明为volatile)。 (3).switch段:包含大的switch语句的跳转表(jump table) (4).text段:包含所有的可执行代码。 未初始化段 未初始化的段:存储器(一般指RAM)中的保留空间。程序在运行时用它来创建和存储变量。C/C++编译器生成的未初始化的段有: (1).bss段:为全局变量和静态变量保留。如果为连接器设定-c选项,则在程序的开始,C引导程序会将.cinit段的数据(可在ROM中)复制到.bss段。编译器定义全局符号$bss,并指定它为.bss段的起始地址。 (2).far段:为声明为far的全局变量和静态变量保留。 (3).stack段:系统堆栈。这个存储区用于传递函数的参数和为局部变量分配存储器空间。 (4).sysmem段:为动态存储空间分配保留的存储区。提请动态存储空间分配要求的有malloc,calloc和realloc等函数。如果C/C++程序未使用这些函数,编译器便不生成该段。 段的补充 汇编器产生默认的.text,.bss和.data段,但C/C++编译器不使用.data段。允许用CODE_SECTION和DATA_SECTION pragma来让编译器生成另外的段。 除了.text,.vectors段,各个初始化段和非初始化段均不能分配到内部程序存储器。 系统堆栈 编译器将堆栈用于: (1)给局部变量分配存储空间 (2)传递函数参数 (3)保存临时结果 运行时堆栈增长方向是从高向低,编译器用B15寄存器来管理堆栈,即将它作为堆栈指针(SP),指向堆栈中下一个空闲的存储器位置。 初始化变量 C/C++编译器生成的代码可固化到ROM中,.cinit段的初始化表也是贮存在ROM中。在系统初始化的时候,C/C++引导程序将表中的数据(ROM中)拷贝给.bss段中对应的变量(RAM中)。 如果程序是从目标文件直接载入存储器,然后运行时,可以无需.cinit段。加载器(loader)直接地从目标文件中读出初始化表(而不是从ROM中),在加载时完成初始化,而不是运行时。这个过程可以通过为连接器指定–cr选项来实现。 存储器模式 (-mln) 小存储器模式和大存储器模式。它们的区别在于为.bss段分配存储空间的方式。 小存储器模式:.bss 32KByte,使用DP(B14)访问全局数据:LDW *+DP(0x7),B5 大存储器模式:不限制.bss段的大小,访问数据使用MVKL MVKH: MVKL _x, A0 MVKH _x, A0 LDW *A0, B0 寄存器使用规范 在C/C++环境下,一些具体的操作要使用哪些的寄存器来完成,是有严格的规范的。 寄存器使用规范规定了编译器使用寄存器的方法以及函数调用过程中数值保存的方法。 要在C/C++程序中嵌入汇编语言,必须理解并遵循寄存器使用规范。 寄存器使用规范 函数调用约定 函数(父函数)在调用另一个函数(子函数)的时候执行下列操作 (1)将传递到子函数的参数放入寄存器或堆栈。 函数调用(父函数) (2)如果需要,保存寄存器(a/b0~9)到堆栈。(调用子函数后要再用到其中的值) (3)调用者(父函数)调用函数(子函数)。 函数调用(子函数) (1)被调函数(子函数)为所有的局部的变量、临时存储区和它调用的函数的参数分配足够的堆栈空间。
文档评论(0)