基于ARM的嵌入式系统应用程序设计.ppt_第1页
基于ARM的嵌入式系统应用程序设计.ppt_第2页
基于ARM的嵌入式系统应用程序设计.ppt_第3页
基于ARM的嵌入式系统应用程序设计.ppt_第4页
基于ARM的嵌入式系统应用程序设计.ppt_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于ARM的嵌入式系统应用程序设计,伪操作、宏指令与伪指令ARM汇编语言程序设计嵌入式C语言程序设计C与汇编语言混合编程基于EmbestIDEforARM环境的软件开发实例,伪操作、宏指令与伪指令,第一节伪操作、宏指令与伪指令,两种常见的ARM编译环境GNU编译环境下的伪操作ARM汇编语言的伪指令,两种常见的ARM编译环境,一、两种常见的ARM编译环境,1.ADS/SDTIDE开发环境ARM公司开发,使用了CodeWarrior公司的编译器;2.集成了GNU开发工具的IDE开发环境它由GNU汇编器as交叉编译器gcc链接器ld等组成。,二、GNU编译环境下的伪操作,常量编译控制伪操作字符编译控制伪操作汇编程序代码控制伪操作宏及条件编译控制伪操作其他伪操作,1.常量编译控制伪操作,.byte21,48,89,0 x13,0 xFF,.hword21,25,89,0 x1133,0 x77FF,.ascii“Howareyou”,.asciz“Iamaatudent”,.float0F3.14,0F359.2E11,.double0F2E1,.word21,0 x110033,.fill8,4,0 xFFFFFFFF,.zero400,.space10,0BFF,2.字符编译控制伪操作,.equnum,20.equPLLCON,0 x01D80000,.externImage_RO_Limit,.global_start.globalFunc,3.汇编程序代码控制伪操作,.section.bss,4.宏及条件编译控制伪操作,例:宏操作。.macroHANDLERLabelSUBSP,SP,#4STMFDSP!,R0LDRR0,=LabelLDRR0,R0STRR0,SP,#4LDMFDSP!,R0,PC.endm,宏名HANDLER有一个参数Label,宏定义体结束,例:宏操作。.macroHANDLER_irqLabelSTMDBSP!,R0-R11,IP,LRLDRR0,=LabelLDRR0,R0MOVLR,PCBXR0LDMIASP!,R0-R11,IP,LRSUBSPC,R14,#4.endm,宏名HANDLER_irq有一个参数Label,宏定义体结束,保存R0R11IP(R12),LR,把Label的地址加载到R0,加载Label的内容到R0,调用用户中断处理程序,恢复R0R11IP(R12),LR,中断返回,例:宏退出。.macroHANDLERLabelSUBSP,SP,#4STMFDSP!,R0LDRR0,=Label.exitmLDRR0,R0STRR0,SP,#4LDMFDSP!,R0.endm,宏名HANDLER,有一个参数Label,宏定义体结束,提前退出宏,例:条件编译伪操作。.ifdefPLLONSTARTLDRR0,=PLLCONLDRR1,=(M_DIV12)+(P_DIV4)+S_DIV)STRR1,R0.endif,5.其他伪操作,.title“MyAsmOutput”,.sbttl“Part1:Coolstuff”,.reqCOUNT,7/*定义寄存器7为COUNT*/,第一节伪操作、宏指令与伪指令,两种常见的ARM编译环境GNU编译环境下的伪操作ARM汇编语言的伪指令,ARM汇编语言的伪指令,三、ARM汇编语言的伪指令,ARM中伪指令不是真正的ARM或Thumb指令,它们在编译器对源程序进行汇编处理时被替换成相应的ARM或Thumb指令序列。,1.小范围的地址读取伪指令ADRADRcondregister,exprcond:可选的执行条件register:目标寄存器expr:基于PC或寄存器的地址表达式使用说明:通常被编译器替换成一条ADD或SUB指令来实现该ADR的功能。,被编译替换成SUBR1,PC,#0 xc因PC值为当前指令地址加8。,例:startMOVR0,#10ADRR1,start,2.中范围的地址读取伪指令ADRLADRLcondregister,expr使用说明:通常被编译器替换成2条合适的数据处理指令来实现该ADRL的功能。,例:startMOVR0,#10ADRLR4,start+60000,本ADRL替换成:ADDR4,PC,#84ADDR4,R4,#59904,因PC值为当前指令地址加8。,R4PC-0 xc+60000,3.大范围的地址读取伪指令LDRLDRcondregister,=exprlabel-exprexpr:32位常量label-expr:基于PC的地址表达式或外部表达式使用说明:(1)读取的数据超过了MOV及MVN指令可操作的范围时,用LDR读数据到寄存器。(2)将一个基于PC的地址值或外部的地址值读到寄存器。,LDR用于装载大常数,或从数据池读取常数。例:LDRR1,=0 xFF汇编后将得到:LDRR1,#0 xFF例:LDRR1,=0 x55555555汇编后将得到:LDRR1,PC,#Imm12DCD0 x55555555,10,第四章基于ARM的嵌入式系统应用程序设计,伪操作、宏指令与伪指令ARM汇编语言程序设计嵌入式C语言程序设计C与汇编语言混合编程基于EmbestIDEforARM环境的软件开发实例,ARM汇编语言程序设计,第二节ARM汇编语言程序设计,ARM汇编中的文件格式ARM汇编语言语句格式ARM汇编语言程序格式ARM汇编语言编程的重点ARM汇编语言程序实例,ARM汇编中的文件格式,一、ARM汇编中的文件格式,常用的源文件可简单分为以下几种:(1)*.S汇编程序文件(2)*.CC程序文件(3)*.H头文件,把程序中常用到的常量命名、宏定义、数据结构定义等等单独放在一个文件中,一般称为头文件。,二、ARM汇编语言语句格式,ARM汇编语言语句格式如下所示:symbolinstruction|directive|pseudo-instruction;commentsymbol符号instruction指令directive伪操作pseudo-instruction伪指令comment语句的注释,三、ARM汇编语言程序格式,ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。段又可以分为代码段和数据段。一个ARM源程序至少需要一个代码段。,例:ARM汇编语言源程序的基本结构.global_start.text_start:MOVR0,#10MOVR1,#3ADDR0,r0,r1.end,定义全局标号,标志代码段,默认入口点,结束标志,四、ARM汇编语言编程的重点,1.ARM数据处理操作(1)简单的寄存器操作ADDR0,R1,R2;R0=R1+R2(2)立即数操作ADDR3,R3,#1;R3=R3+1ANDR8,R7,#0 xFF;R8r2|r1r3)r0=r1-r2;,CMPr1,r2CMPLTr1,r3SUBGTr0,r1,r2,if(r1r2,CMPr1,r2CMPGTr1,r3SUBGTr0,r1,r2,4.复杂的分支结构,if(r1r2)r0=r1-r2;if(r0r3)r0=1;elser0=0;elser0=r2-r1;if(r0r3)r0=1;elser0=0;,ARM只有一个CPSR,而本例有两个判断的嵌套:如果按照高级语言的流程在第二个条件判断if(r0r3)后,CPSR的值就不适合用在else部分了。,解决方法:(1)使用跳转语句。(2)使用跳转表。(3)直接对CPSR进行操作。(4)使用逻辑表达式,记录逻辑结构的状态。,if(r1r2)r0=r1-r2;if(r0r3)r0=1;elser0=0;elser0=r2-r1;if(r0r3)r0=1;elser0=0;,(1)使用跳转语句使用带条件的“B”指令,BEGIFCMPr1,r2BLEELSESUBr0,r1,r2CMPGTr0,r3MOVGTr0,#1MOVLEr0,#0BENDIFELSESUBr0,r2,r1CMPGTr0,r3MOVGTr0,#1MOVLEr0,#0ENDIF,跳转指令会影响流水线的执行,if(r1r2)r0=r1-r2;if(r0r3)r0=1;elser0=0;elser0=r2-r1;if(r0r3)r0=1;elser0=0;,(2)采用方法(3)对CPSR操作,CMPr1,r2MSRLEr5,CPSRSUBGTr0,r1,r2CMPGTr0,r3MOVGTr0,#1MOVLEr0,#0ELSEMSRCPSR_f,r5SUBLEr0,r2,r1CMPr0,r3MOVGTr0,#1MOVLEr0,#0,如果每个if分支都有大量计算任务,则应用跳转方法。,if(r1r2)r0=r1-r2;if(r0r3)r0=1;elser0=0;elser0=r2-r1;if(r0r3)r0=1;elser0=0;,(3)采用方法(4)使用临时变量保存寄存器的值,CMPr1,r2MOVLEr5,#1SUBGTr0,r1,r2CMPGTr0,r3MOVGTr0,#1MOVLEr0,#0ELSECMPr5,#1SUBEQr0,r2,r1CMPEQr0,r3MOVGTr0,#1MOVLEr0,#0,将r10;i-)Digit_Led_Symbol(i);Delay(4000);,循环显示F0,(2)while循环语句格式:while(条件表达式)语句;(3)dowhile循环语句格式:do语句;while(条件表达式);,第三节嵌入式C语言程序设计,嵌入式程序设计中常用的C语言语句嵌入式C语言程序设计实例,嵌入式C语言程序设计实例,二、嵌入式C语言程序设计实例,以S3VCE40开发板上各个功能模块的整个测试程序为例,介绍运用C语言进行基于ARM的嵌入式程序设计。S3VCE40开发板加电,数码管全亮,LED1、LED2轮流闪烁,串口终端显示信息。,PC按键可选择测试。,1.程序源代码介绍整个测试程序主文件main.c的代码构成图如下图所示,由BootLoader启动程序进入C语言主函数main()入口。,2.嵌入式C语言程序编写的简单构架(1)需要用#include指令将本文件所用到的头文件包含到该程序中;44blib.h:对程序开发中的函数进行说明,并用宏定义对一些常用的表达式或常量进行了预定义;44b.h:用宏的方式定义了程序中所需的44B0X片上涉及各模块中寄存器的宏定义地址;,/*File:44BLIB.H*Desc:Samsung44B0XCPUfunctiondeclareandcommondefine*/#ifndef_44BLIB_H_#define_44BLIB_H_#ifdef_cplusplusexternC#endif,/常量#defineDebugOutUart_Printf#definemin(x1,x2)(x1x2)?x1:x2)#defineONESEC0(62500)/16usresolution,max1.04sec#defineONESEC1(31250)/32usresolution,max2.09sec#defineONESEC2(15625)/64usresolution,max4.19sec#defineONESEC3(7812)/128usresolution,max8.38sec#defineONESEC4(MCLK/128/(0 xff+1)/60Mhz,128*4usresolution,max32.53sec,#defineNULL0#defineEnterPWDN(clkcon)(void(*)(int)0 xe0)(clkcon)#defineDOWNLOAD_ADDRESS_RAM_STARTADDRESS/*8ledcontrolregisteraddress*/#defineLED8ADDR(*(volatileunsignedchar*)(0 x2140000)#defineLCD0 xFF#defineUART0 xFE,/*对开发中用到的一些库函数作函数原型定义*/voidDelay(inttime);/WatchdogTimerisused.voidDelayMs(intms_time);void*malloc(unsignednbyte);voidfree(void*pt);voidPort_Init(void);voidCache_Flush(void);voidChangeMemCon(unsigned*pMemCfg);voidUart_Select(intch);voidUart_TxEmpty(intch);voidUart_Init(intmclk,intbaud);charUart_Getch(void);charUart_GetKey(void);,intUart_GetIntNum(void);voidUart_SendByte(intdata);voidUart_Printf(char*fmt,.);voidUart_SendString(char*pt);voidTimer_Start(intdivider);/WatchdogTTimer_Stop(void);/WatchdogTimerisused.voidLed_Display(intLedStatus);voidBeep(intBeepStatus);voidChangePllValue(intm,intp,ints);#ifdef_cplusplus#endif#endif/*_44BLIB_H_*/,44b.h:用宏的方式定义了程序中所需的44B0X片上涉及各模块中寄存器的宏定义地址;,#ifndef_44B0X_H_#define_44B0X_H_#ifdef_cplusplusexternC#endif#includeoption.h,/*定义了44b0的系统配置寄存器地址*/#definerSYSCFG(*(volatileunsigned*)0 x1c00000)/*定义了44b0中2个不可作Cache存储区的起始与结束地址的寄存器的地址*/#definerNCACHBE0(*(volatileunsigned*)0 x1c00004)#definerNCACHBE1(*(volatileunsigned*)0 x1c00008)/*定义了44b0中存储总线控制器的优先级的寄存器地址*/#definerSBUSCON(*(volatileunsigned*)0 x1c40000)/*定义了44b0中与存储器相关的寄存器地址*/*定义了44b0中与UART相关的寄存器地址*/*定义了44b0中与同步I/O口相关的寄存器地址*/*定义了44b0中与音频播放器IIS相关的寄存器地址*/,(2)需要将本文件中定义的函数进行函数声明;(3)定义本文件中用到的各种类型的外部变量及数组;(4)编写各个函数代码,其中包括一个主函数main(),由main()提供主线,通过调用各子函数来实现各种功能。,第四章基于ARM的嵌入式系统应用程序设计,伪操作、宏指令与伪指令ARM汇编语言程序设计嵌入式C语言程序设计C与汇编语言混合编程基于EmbestIDEforARM环境的软件开发实例,C与汇编语言混合编程,第四节C与汇编语言混合编程,ATPCS介绍内嵌汇编C和ARM汇编语言程序间相互调用,ATPCS介绍,1.C与汇编语言能很容易的混合(1)可实现C中无法实现的处理器功能(2)使用性的或不支持的指令(3)产生更高效的代码2.直接链接变量和程序(1)确定符合程序调用规范ATPCS(2)输入/输出相关的符号3.编译器也可保留内嵌汇编(1)大多数arm指令级都可实现(2)寄存器操作数可支持任意的C的表达式(3)内嵌汇编代码可由编译器的优化器来传递,一、ATPCS介绍,ATPCS(ARM-ThumbProduceCallStandard)是ARM程序和Thumb程序中子程序调用的基本规则。这些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。,1.寄存器的使用规则(1)子程序间通过寄存器R0R3来传递参数这时,寄存器R0R3可以记作A1A4。(2)在子程序中,使用寄存器R4R11来保存局部变量这时,寄存器R4R11可以记作V1V8。在Thumb程序中,通常只能使用寄存器R4R7来保存局部变量。,(3)寄存器R12用作子程序间的scratch寄存器用于保存SP,在函数返回时使用该寄存器出栈,记作ip。(4)寄存器R13用作数据栈指针记作sp(5)寄存器R14称为链接寄存器记作lr(6)寄存器R15是程序计数器记作pc,2.数据栈的使用规则ATPCS规定数据栈为FD(满递减)类型,并且对数据栈的操作是8字节对齐的。,3.参数的传递规则(1)参数个数固定的子程序参数传递规则第一个整数参数,通过寄存器R0R3来传递。其他参数通过数据栈传递。(2)参数个数可变的子程序参数传递规则当参数不超过4个时,可以使用寄存器R0R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数。,(3)子程序结果返回规则结果为一个32位的整数时,可通过寄存器R0返回;结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。,第四节C与汇编语言混合编程,ATPCS介绍内嵌汇编C和ARM汇编语言程序间相互调用,内嵌汇编,在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指令集。内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。,二、内嵌汇编,1.内嵌汇编指令的语法格式_asm(“指令;指令”);ARMC汇编器使用关键字“_asm。如果有多条汇编指令需要嵌入,可以用“”将它们归为一条语句。如:_asm指令;指令指令注意:_asm是两个下划线。,2.内嵌汇编指令的特点(1)操作数可以是寄存器、常量或C表达式。它们可以是char、short或者int类型,而且是作为无符号数进行操作。(2)内嵌的汇编指令中使用物理寄存器有一些限制。(3)常量前的符号“#”可以省略。,(4)只有指令B可以使用C程序中的标号,指令BL不能使用C程序中的标号。(5)不支持汇编语言中用于内存分配的伪操作。(6)指令中如果包含常量操作数,该指令可能会被汇编器展开成几条指令。,3.内嵌汇编注意事项(1)必须小心使用物理寄存器如R0R3,LR和PC。,_asmMOVR0,xADDy,R0,x/y,当计算x/y时,R0会被修改。用C语言的一个变量代替R0。,_asmMOVvar,xADDy,var,x/y,(2)不要使用寄存器寻址变量,intbad_f(intx)_asmADDR0,R0,#1returnx;,似乎R0对应参数x,汇编器认为寄存器冲突,intbad_f(intx)_asmADDx,x,#1returnx;,(3)使用内嵌汇编时,编译器自己会保存和恢复它可能用到的寄存器,用户无须保存和恢复寄存器。,intf(intx)_asmSTMFDSP,R0ADDR0,x,#1EORx,R0,xLDMFDSP!,R0returnx;,对R0的恢复是不需要的,对R0的保存是非法的,因为发生了写之前的读。,(4)LDM和STM指令的寄存器列表只允许物理寄存器(5)汇编语言用“,”作为操作数分隔符如果有带“,”的C语言表达式作为操作数,必须用()将其归为一个汇编操作数。_asmADDx,y,(f(),z)f(),z为一个带有“,”的C语言表达式。,第四节C与汇编语言混合编程,ATPCS介绍内嵌汇编C和ARM汇编语言程序间相互调用,C和ARM汇编语言程序间相互调用,1.汇编程序访问全局C变量汇编程序可以通过地址间接访问在C语言程序中声明的全局变量。通过使用.extern(IMPORT)关键词引入全局变量,并利用LDR和STR指令根据全局变量的地址可以访问它们。对于不同类型的变量,需要采用不同选项的LDR和STR指令,如下所示:unsignedcharLDRB/STRBunsignedshortLDRH/STRHunsignedintLDR/STRcharLDRSB/STRSBshortLDRSH/STRSH,三、C和ARM汇编语言程序间相互调用,汇编语言程序读取C语言程序中定义的全局变量globvar,并将其加2写回。AREAglobals,CODE,READONLYEXPORTasmsubroutine;声明该变量可被其它文件引用IMPORTglobvar;声明该变量是在其它文件中定义的asmsubroutineLDRR1,=globvar;从文字池读globvar地址送R1LDRR0,R1;将其值读入到寄存器R0中ADDR0,R0,#2STRR0,R1;将R0值赋予变量globvarMOVPC,LREND,2.在C语言程序中调用汇编程序汇编程序中需使用.global(EXPORT)伪操作来声明,使得本程序可以被其它程序调用。在C程序调用该汇编程序之前需要在C语言程序中使用extern关键词来声明该汇编程序。,C源程序:#includeexternvoidstrcopy(char*d,constchar*s)intmain()constchar*srcstr=“Firststringsource”;char*dststr=“Secondstringdestination”;strcopy(dststr,srcstr)return(0);,用extern声明一个外部函数,调用汇编函数strcopy(),汇编源程序:AREASCopy,CODE,READONLYEXPORTstrcopy;用EXPORT伪操作声明该变量可以被其他文件引用Strcopy;R0指向目标字符串,R1指向源字符串LDRBR2,R1,#1;字节加载,并更新地址STRBR2,R0,#1;字节保存,并更新地址CMPR2,#0;检测R2是否等于0BNEstrcopy;若条件不成立则继续执行MOVPC,LR;从子程序返回END,3.在汇编程序中调用C语言程序在C程序中不需要使用任何关键字来声明将被汇编语言调用的C程序,但是在汇编程序调用该C程序之前需要在汇编语言程序中使用.extern(IMPORT)伪操作来声明该C程序。在汇编程序中通过BL指令来调用子程序。,C函数原型:intg(inta,intb,intc,intd,inte)returna+b+c+d+e;汇编程序调用C程序g()计算5个整数i,2*i,3*i,4*i,5*i的和。,EXPORTfAREAf,CODE,READONLYIMPORTg;声明该变量函数g(),i在R0中STRLR,SP,#-4!;预先保存LRADDR1,R0,R0;计算2*i(第2个参数)ADDR2,R1,R0;计算3*i(第3个参数)ADDR3,R1,R2;计算5*i(第5个参数)STRR3,SP,#-4!;将第5个参数压人堆栈ADDR3,R1,R1;计算4*i(第4个参数)BLg;调用C程序g()ADDSP,SP,#4;调整数据栈指针,准备返回LDRPC,SP,#4;从子程序返回END,12,第四章基于ARM的嵌入式系统应用程序设计,伪操作、宏指令与伪指令ARM汇编语言程序设计嵌入式C语言程序设计C与汇编语言混合编程基于EmbestIDEforARM环境的软件开发实例,基于EmbestIDEforARM环境的软件开发实例,第五节基于EmbestIDEforARM环境的软件开发实例,嵌入式开发环境嵌入式软件开发流程源文件简介工程的建立和配置工程的编译链接在RAM中调试软件,嵌入式开发环境,一、嵌入式开发环境,1.开发环境的组成,2.开发环境的连接,3.EmbestIDE界面,4.EmbestIDE特征,(1)支持所有ARM7,ARM9系列处理器;(2)支持开发语言:C和汇编;(3)支持Windows98、XP、NT及2000等操作系统;(4)源码编辑器:支持标准的文本编辑功能,支持语法分色显示。(5)图形化的工程管理与设置,图形化设置编译连接选项。,(6)调试功能:可进行程序下载、断点设置、单步执行、异常处理等,可查看修改存储区、寄存器、外围寄存器、变量,可查看函数栈,显示反汇编指令及源文件交叉显示。(7)丰富的例程:提供Atmel、Samsung、CirrusLogic、OKI等多家公司ARM处理器的调试程序示例和使用说明。(8)配合EmbestPowerICE仿真器,速度达120KBytes/秒。,二、嵌入式软件开发流程,在具体的编程环境下完成工程创建、源文件的编写、编译、链接、调试、固化等一系列工作。这就涉及到程序编译、链接、调试的具体配置以及开发板上硬件的初始化、程序下载等问题。通过一个具体的在EmbestIDEforARM开发环境下的实际开发例程,熟悉嵌入式软件开发的整个过程。,例程是一个基于S3C44B0X的完整的程序,可以在RAM中进行调试,固化在ROM中可以正常运行。正常运行时发光二级管LED1和LED2依次点亮和熄灭。包括:启动汇编文件44binit.sC语言主源文件main.c八段数码管处理函数源文件led.c,三、源文件简介,1.启动汇编文件启动汇编文件44binit.s,用来初始化电路以及用来为高级语言写的软件做好运行前准备的一小段汇编语言,是任何处理器上电复位时的程序运行入口点。功能(1)电路初始化(2)为高级语言编写的软件运行做准备特征(1)汇编语言(2)程序复位运行入口点,2.启动流程,四、工程的建立和配置,1.工程建立和配置步骤,2.建立工程,选择File菜单项中的建立新工程选项,输入工程名和要保存工程的路径名,用户可以在工作区内自由添加各种文件,3.工程配置工程创建完成后,需要对工程进行配置,EmbestIDE才能正确的编译、链接和调试等。选择ProjectSettings菜单项,弹出工程配置对话框,如下图所示,工程配置包括处理器的选择、仿真器配置、调试配置、目录配置、编译配置、汇编配置、链接配置,是整个软件开发过程中非常关键的一步。,(1)处理器配置,配置ARM7ARM9,配置芯片厂家,配置具体芯片型号,(2)仿真器配置,PC和仿真器通讯设置,配置Jtagarm7Jtagarm9PowerICEARM7PowerICEARM9SimArm,五、工程的编译链接,1.文件类型,工程文件(*.ews、*.pjf),工作区文件*.ews工程文件*.pjf工程创建与配置自动生成,禁止用户修改,链接脚本文件(*.ld),遵照脚本文件格式,用户复制示例或手工输入编写根据用户软件设计和电路存储区安排,函数库文件(*.lib、*.a),EmbestIDE附带的标准嵌入式C函数库用户自己编写的函数库,2.链接脚本文件及示例,所有链接都是通过链接脚本来控制的,链接脚本文件使用链接命令语言编写。链接脚本的主要作用是描述所编写的文件的各部分应如何摆放在输出文件中,并控制存储区如何定位这些输出文件,也可以实现其它功能。最简单的链接脚本文件只有一行命令,即SECTIONS,告诉存储区应如何摆放输出文件。,SECTIONS命令功能强大。假设程序中包括代码、已经初始化的数据和尚未初始化的数据,需要相应地摆放在”.text”、”.data”和”.bss”部分。,SECTIONS.=0 x10000;.text:*(.text);.=0 x8000000;.data:*(.data);.bss:*(.bss);,符号”.”指向当前的地址计数器。.text定义一个输出区,大括号里*是通配符,*(.text)表示在输入文件中所有的”.text”输入部分。,链接器会将.data输出部分设置为0 x8000000。链接器会紧跟着把.bss部分放在.data部分后面。,SECTIONS.=0 x0C000000;Image_RO_Base=.;.text:*(.text);Image_RO_Limit=.;Image_RW_Base=.;.data:*(.dat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论