




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 第四章第四章 嵌入式程序设计基础嵌入式程序设计基础 2 第第4 4章章 嵌入式程序设计基础嵌入式程序设计基础 l基于基于ARM的编译器一般都支持汇编语言的程序设计、的编译器一般都支持汇编语言的程序设计、 C/C+语言的程序设计及两者的混合编程。语言的程序设计及两者的混合编程。 l本章介绍本章介绍ARM的嵌入式程序的基础知识的嵌入式程序的基础知识 l伪指令伪指令 l汇编语言的语句格式汇编语言的语句格式 l汇编语言程序汇编语言程序 l汇编语言与汇编语言与C/C+语言的混合编程语言的混合编程 3 本章提要本章提要 伪指令伪指令 汇编语言的语句格式汇编语言的语句格式 汇编程序应用汇编程序应用 汇编
2、语言与汇编语言与C/C+C/C+语言的混合编程语言的混合编程 4 4.1 4.1 伪指令伪指令 l在在ARM汇编语言程序里,有一些特殊指令助记符,这些助汇编语言程序里,有一些特殊指令助记符,这些助 记符与指令系统的助记符不同,记符与指令系统的助记符不同,没有相对应的操作码没有相对应的操作码,通,通 常称这些特殊指令助记符为常称这些特殊指令助记符为伪指令伪指令,他们所完成的操作称,他们所完成的操作称 为伪操作。为伪操作。 l伪指令在源程序中的伪指令在源程序中的作用作用是是既要把正常的程序用指令表达既要把正常的程序用指令表达 给计算机以外,又要把程序设计者的意图表达给编译器。给计算机以外,又要把程
3、序设计者的意图表达给编译器。 例如:例如:要告诉编译器程序段的开始和结束,需要定义数要告诉编译器程序段的开始和结束,需要定义数 据等。据等。 5 l在在ARM的汇编程序中,我们把伪指令分为三部分介绍的汇编程序中,我们把伪指令分为三部分介绍: l通用伪指令通用伪指令 l与与ARM指令相关的伪指令指令相关的伪指令 l与与Thumb指令相关的伪指令指令相关的伪指令 4.1 4.1 伪指令伪指令 6 4.1.1 4.1.1 通用伪指令通用伪指令 通用伪指令包括通用伪指令包括: l符号定义伪指令符号定义伪指令 l数据定义伪指令数据定义伪指令 l汇编控制伪指令汇编控制伪指令 l及其他一些常用伪指令等。及其
4、他一些常用伪指令等。 7 其中:其中: lGBLA用于声明一个全局的数字变量,并初始化为用于声明一个全局的数字变量,并初始化为0; lGBLL伪指令用于声明一个全局的逻辑变量,并初始化为伪指令用于声明一个全局的逻辑变量,并初始化为F(假);(假); lGBLS伪指令用于声明一个全局的字符串变量,并初始化为空;对于全局变伪指令用于声明一个全局的字符串变量,并初始化为空;对于全局变 量来说,变量名在源程序中必须是唯一的。量来说,变量名在源程序中必须是唯一的。 1.符号定义伪指令符号定义伪指令 符号定义伪指令用于声明符号定义伪指令用于声明ARM汇编程序中的变量、对变量汇编程序中的变量、对变量 赋值以
5、及定义寄存器的名称等操作。赋值以及定义寄存器的名称等操作。 常见的符号定义伪指令有如下几种:常见的符号定义伪指令有如下几种: (1)GBLA、GBLL和和GBLS 4.1.1 4.1.1 通用伪指令通用伪指令 语法格式:语法格式: GBLA(GBLL或或GBLS)全局变量名全局变量名 GBLA、GBLL和和GBLS伪指令是伪指令是声明全局变量声明全局变量的伪指令,用于定义的伪指令,用于定义 一个一个ARM程序中的全局变量,并将其初始化。程序中的全局变量,并将其初始化。 8 指令示例:指令示例: GBLA DATE1 ;声明一个全局数字变量;声明一个全局数字变量DATE1 GBLLDATE1 ;
6、声明一个全局逻辑变量;声明一个全局逻辑变量DATE2 GBLSDATA3 ;声明一个全局的字符串变量;声明一个全局的字符串变量DATE3 DATE3 SETS“Testing” ;将该变量赋值为;将该变量赋值为“Testing” 4.1.1 4.1.1 通用伪指令通用伪指令 9 (2)LCLA、LCLL和和LCLS 语法格式:语法格式: LCLA(LCLL或或LCLS)局部变量名局部变量名 LCLA、LCLL和和LCLS伪指令是伪指令是声明局部变量声明局部变量伪指令,伪指令, 用于定义一个用于定义一个ARM程序中的局部变量,并将其初始化。程序中的局部变量,并将其初始化。 其中:其中: lLCL
7、A用于声明一个局部的数字变量,并初始化为用于声明一个局部的数字变量,并初始化为0; lLCLL用于声明一个局部的逻辑变量,并初始化为用于声明一个局部的逻辑变量,并初始化为F(假);(假); lLCLS用于声明一个局部的字符串变量,并初始化为空。对于局部变量用于声明一个局部的字符串变量,并初始化为空。对于局部变量 来说,变量名在使用的范围内必须是唯一的,范围限制在定义这个变来说,变量名在使用的范围内必须是唯一的,范围限制在定义这个变 量的宏指令程序段内。量的宏指令程序段内。 4.1.1 4.1.1 通用伪指令通用伪指令 10 指令示例:指令示例: LCLADATE4 ;声明一个局部数字变量;声明
8、一个局部数字变量DATE4 LCLLDATE5 ;声明一个局部的逻辑变量;声明一个局部的逻辑变量DATE5 DATA4 SETL 0 x10 ;为变量;为变量DATE4赋值为赋值为0 x10 LCLSDATA6 ;声明一个局部的字符串变量;声明一个局部的字符串变量DATA6 4.1.1 4.1.1 通用伪指令通用伪指令 11 (3)SETA、SETL和和SETS 语法格式:语法格式: 变量名变量名 SETA(SETL或或SETS)表达式)表达式 SETA、SETL、SETS是是变量赋值变量赋值伪指令,用于给一个伪指令,用于给一个 已经定义的全局变量或局部变量赋值。已经定义的全局变量或局部变量赋
9、值。 其中:其中: lSETA用于给一个用于给一个数学数学变量赋值;变量赋值; lSETL用于给一个用于给一个逻辑逻辑变量赋值;变量赋值; lSETS用于给一个用于给一个字符串字符串变量赋值;变量赋值; 4.1.1 4.1.1 通用伪指令通用伪指令 12 指令示例:指令示例: GBLA EXAMP1 ;先声明一个全局数字变量;先声明一个全局数字变量EXAMP1 EXAMP1 SETA 0 xaa ;将变量;将变量EXAMP1赋值为赋值为0 xaa LCLL EXAMP2 ;声明一个局部的逻辑变量;声明一个局部的逻辑变量EXAMP2 EXAMP1 SETLTRUE ;将变量;将变量EXAMP1赋
10、值为赋值为TRUE GBLA EXAMP3 ;先声明一个全局字符串变量;先声明一个全局字符串变量EXAMP3 EXAMP3 SETS“string” ;将变量;将变量EXAMP3赋值为赋值为string 4.1.1 4.1.1 通用伪指令通用伪指令 13 (4)RLIST 语法格式:语法格式: 名称名称 RLIST 寄存器列表寄存器列表 RLIST伪指令是伪指令是定义通用寄存列表定义通用寄存列表伪指令,通用寄存器列伪指令,通用寄存器列 表定义主要应用在表定义主要应用在堆栈操作或多寄存器传送中堆栈操作或多寄存器传送中,即使用该伪,即使用该伪 指令定义的名称可在指令定义的名称可在ARM指令指令LD
11、M/STM中使用。中使用。 在在LDM/STM指令中,列表中的寄存器访问次序为根据寄指令中,列表中的寄存器访问次序为根据寄 存器的编号存器的编号由低到高由低到高,而与列表中的寄存器排列次序无关。,而与列表中的寄存器排列次序无关。 4.1.1 4.1.1 通用伪指令通用伪指令 14 指令示例:指令示例: RegListRLISTR0-R5,R8 ;定义寄存器列表为;定义寄存器列表为RegList 在程序中使用:在程序中使用: STMFD SP!, RegList ;存储列表到堆栈;存储列表到堆栈 LDMIA R5, RegList ;加载列表;加载列表 4.1.1 4.1.1 通用伪指令通用伪指
12、令 15 2. 数据定义伪指令数据定义伪指令 数据定义伪指令一般用于数据定义伪指令一般用于为特定的数据分配存储单元为特定的数据分配存储单元, 同时可完成已分配存储单元的初始化。常见的数据定义伪同时可完成已分配存储单元的初始化。常见的数据定义伪 指令有如下几种:指令有如下几种: (1)DCB 语法格式:语法格式: 标号标号 DCB表达式表达式 DCB伪指令是伪指令是字节分配内存单元字节分配内存单元伪指令,用来分配一片伪指令,用来分配一片 连续的字节存储单元并用伪指令中指定的数值或字符初始连续的字节存储单元并用伪指令中指定的数值或字符初始 化。其中,数值范围为化。其中,数值范围为0255,DCB也
13、可用也可用“=”代替。代替。 4.1.1 4.1.1 通用伪指令通用伪指令 16 指令示例:指令示例: String DCB “This is a test!” ;分配一片连续的字节存储单元并初始化。;分配一片连续的字节存储单元并初始化。 DATA2 DCB 15, 25, 62, 00 ;为数字常量;为数字常量15,25,62,00分片内存单元分片内存单元 4.1.1 4.1.1 通用伪指令通用伪指令 17 (2)DCW(或(或DCWU) 语法格式:语法格式: 标号标号 DCW(或(或DCWU)表达式)表达式 DCW(或(或DCWU)伪指令是)伪指令是为半字分配内存单元为半字分配内存单元,其
14、中,其中, 表达式可以为程序标号或数字表达式。表达式可以为程序标号或数字表达式。 伪指令伪指令DCW用于为半字分配一段半字对准的内存单元,用于为半字分配一段半字对准的内存单元, 并用指定的数据初始化;伪指令并用指定的数据初始化;伪指令DCWU用于为半字分配一用于为半字分配一 段可以非半字对准的内存单元,并用指定的数据初始化。段可以非半字对准的内存单元,并用指定的数据初始化。 4.1.1 4.1.1 通用伪指令通用伪指令 18 指令示例:指令示例: DATA1 DCW 1, 2, 3 ;分配一片连续的半字存储单元并初始化为;分配一片连续的半字存储单元并初始化为1,2,3。 DATA2 DCWU
15、45, 0 x2a*0 x2a ;分配一片非半字对准存储单元并初始化。;分配一片非半字对准存储单元并初始化。 4.1.1 4.1.1 通用伪指令通用伪指令 19 (3)DCD(或(或DCDU) 语法格式:语法格式: 标号标号 DCD(或(或DCDU) 表达式表达式 DCD(或(或DCDU)伪指令是)伪指令是为字分配内存单元为字分配内存单元伪指令,伪指令, 其中,表达式可以为程序标号或数字表达式。其中,表达式可以为程序标号或数字表达式。DCD也可用也可用 “ instruction 汇编语言程序段以及注释汇编语言程序段以及注释 instruction 其中,如果一行中有多个汇编指令,指令之间使用
16、分号其中,如果一行中有多个汇编指令,指令之间使用分号“;”隔隔 开;如果一条指令占多行,使用续行符号开;如果一条指令占多行,使用续行符号”表示接续;在汇编指表示接续;在汇编指 令段中可以使用令段中可以使用C语言的注释语句。语言的注释语句。 在在ARM C/C+程序中还可以使用关键词程序中还可以使用关键词asm来内嵌一段汇编程序,来内嵌一段汇编程序, 其格式如下:其格式如下: Asm (“instruction ; instruction”); 其中,其中,asm后面括号中必须是一条汇编语句,且其不能包含注释后面括号中必须是一条汇编语句,且其不能包含注释 语句。语句。 115 4.4.2 C/C
17、+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 这里主要讨论这里主要讨论C/C+和汇编的混合编程,包括相互之间的和汇编的混合编程,包括相互之间的 函数调用。下面分五种情况来进行讨论。函数调用。下面分五种情况来进行讨论。 1在在C语言中内嵌汇编语言中内嵌汇编 在在C中内嵌的汇编指令包含大部分的中内嵌的汇编指令包含大部分的ARM和和Thumb指令,指令, 不过其使用与汇编文件中的指令有些不同,存在一些限制,不过其使用与汇编文件中的指令有些不同,存在一些限制, 主要有下面几个方面:主要有下面几个方面: (1)不能直接向)不能直接向PC寄存器赋值,程序跳转要使用寄存器赋值,程序
18、跳转要使用B或者或者BL 指令。指令。 (2)在使用物理寄存器时,不要使用过于复杂的)在使用物理寄存器时,不要使用过于复杂的C表达式,表达式, 避免物理寄存器冲突。避免物理寄存器冲突。 (3)R12和和R13可能被编译器用来存放中间编译结果,计算可能被编译器用来存放中间编译结果,计算 表达式值时可能将表达式值时可能将R0R3、R12及及R14用于子程序调用,因用于子程序调用,因 此要避免直接使用这些物理寄存器。此要避免直接使用这些物理寄存器。 116 (4)一般不要直接指定物理寄存器,而让编译器进行分配。)一般不要直接指定物理寄存器,而让编译器进行分配。 下面通过一个例子来说明如何在下面通过一
19、个例子来说明如何在C中内嵌汇编语言:中内嵌汇编语言: #include void my_strcpy(const char *src, char *dest) /声明一个函数声明一个函数 char ch; /声明一个字符型变量声明一个字符型变量 _asm /调用关键词调用关键词_asm LOOP ;循环入口;循环入口 LDRB CH,SRC,#1 ;Thumb指令,指令,chsrc+1.将无符将无符 ;号;号src地址的数地址的数+1送入送入ch STRB CH,dest,#1 ;Thumb指令,指令, dest+1 ch, ;将无符号;将无符号CH数据送入数据送入dest+1存储存储 CMP
20、 CH, #0 ;比较;比较CH是否为零,否则循环。是否为零,否则循环。 ;总共循环;总共循环256次次 BNE LOOP ;B 指令跳转,指令跳转,NE为为Z位清零不相等位清零不相等 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 117 int main();C语言主程序语言主程序 char *a = forget it and move on!; /声明字符型指针变量声明字符型指针变量 char b64; /字符型数组字符型数组 my_strcpy(a, b); /调用子函数,进行复制调用子函数,进行复制 printf(original: %s,
21、 a); /屏幕输出,屏幕输出,a的数值的数值 printf(copyed: %s, b); /屏幕输出,屏幕输出,b的数值的数值 return 0; 在这里在这里C和汇编之间的值传递是用和汇编之间的值传递是用C的指针来实现的,因为指针的指针来实现的,因为指针 对应的是地址,所以汇编中也可以访问。对应的是地址,所以汇编中也可以访问。 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 118 2在汇编中使用在汇编中使用C程序全局变量程序全局变量 内嵌汇编不用单独编辑汇编语言文件,比较简洁,但是内嵌汇编不用单独编辑汇编语言文件,比较简洁,但是 有诸多限制,当
22、汇编的代码较多时一般放在单独的汇编文有诸多限制,当汇编的代码较多时一般放在单独的汇编文 件中。这时就需要在汇编和件中。这时就需要在汇编和C之间进行一些数据的传递,之间进行一些数据的传递, 最简便的办法就是使用全局变量。具体的汇编程序中访问最简便的办法就是使用全局变量。具体的汇编程序中访问 方法如下:方法如下: (1)使用)使用IMPORT伪操作声明该全局变量。伪操作声明该全局变量。 (2)使用)使用LDR指令读取该全局变量的内存地址,通常该全指令读取该全局变量的内存地址,通常该全 局变量的内存地址值存放在程序的数据缓冲池中(局变量的内存地址值存放在程序的数据缓冲池中(Literal pool)
23、。)。 (3)根据该数据的类型,使用相应的)根据该数据的类型,使用相应的LDR/STR指令读取指令读取/修修 改该全局变量的值。改该全局变量的值。 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 119 下面通过一个例子来说明如何在汇编程序中访问下面通过一个例子来说明如何在汇编程序中访问C程序全局变量。程序全局变量。 AREA asmfile,CODE,READONLY ;建立一个汇编程序段;建立一个汇编程序段 EXPORT asmDouble ;声明可以被调用的汇编函数;声明可以被调用的汇编函数asmDouble IMPORT gVar_1 ;调用;
24、调用C语言中声明的全局变量语言中声明的全局变量 asmDouble ;汇编子函数入口;汇编子函数入口 LDR R0,=gVar_1 ;将等于;将等于gVar_1地址的数据送入地址的数据送入R0寄存器寄存器 LDR R1,R0 ;将;将R0中的值为地址的数据送给中的值为地址的数据送给R1。 MOV R2, #10 ;将立即数;将立即数2送给送给R2 ADD R3, R1, R2 ;R3=R1+R2,实现了,实现了gVar_1= gVar_1+10 STR R3,R0 ;将;将R3中的数据送给中的数据送给R0 MOV PC, LR ;子程序返回;子程序返回 END 4.4.2 C/C+4.4.2
25、C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 120 3C程序中调用汇编的函数程序中调用汇编的函数 在在C程序中调用汇编文件中的函数,主要工作有两个:程序中调用汇编文件中的函数,主要工作有两个: 一是一是在在C中声明函数原型,并加中声明函数原型,并加extern关键字;关键字;二是二是在汇在汇 编中用编中用EXPORT导出函数名,并用该函数名作为汇编代导出函数名,并用该函数名作为汇编代 码段的标识,最后用码段的标识,最后用MOV PC,LR返回。然后,就可以返回。然后,就可以 在在C程序中使用该函数了。程序中使用该函数了。 下面是一个下面是一个C程序调用汇编程序的例子,其中汇编程序
26、程序调用汇编程序的例子,其中汇编程序 strcpy实现字符串复制功能,实现字符串复制功能,C程序调用程序调用strcpy完成字符完成字符 串复制的工作。串复制的工作。 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 121 /* C程序程序*/ #include extern void asm_strcpy(const char *src, char *dest); /声明可以被调用的函数声明可以被调用的函数 int main() /C语言主函数语言主函数 const char *s = seasons in the sun; /声明字符型指针变量声明
27、字符型指针变量 char d32; /声明字符型数组声明字符型数组 asm_strcpy(s,d); /调用汇编子函数调用汇编子函数 printf(source: %s,s); /屏幕显示,屏幕显示,S的值的值 printf( destination: %s,d); /屏幕显示,屏幕显示,d的值。的值。 return 0; 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 122 ; 汇编语言程序段汇编语言程序段 AREA asmfile,CODE,READONLY ;声明汇编语言程序段;声明汇编语言程序段 EXPORT asm_strcpy ;声明可被
28、调用函数名称;声明可被调用函数名称 asm_strcpy ;函数入口地址;函数入口地址 LOOP ;循环标志条;循环标志条 LDRB R4, R0, #1 ;R0的地址加的地址加1后送给后送给R4 CMP R4, #0 ;比较;比较R4是否为零是否为零 BEQ OVER ;为零跳转到结束;为零跳转到结束 STRB R4, R1, #1;R4的值送入的值送入R1加加1地址地址 B LOOP ;跳转到循环位置;跳转到循环位置 OVER ;跳出标志位;跳出标志位 MOV PC, LR ;子函数返回;子函数返回 END 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编
29、程应用 123 4在汇编程序中调用在汇编程序中调用C的函数的函数 在汇编中调用在汇编中调用C的函数,需要在汇编中使用伪指令的函数,需要在汇编中使用伪指令 IMPORT 声明将要调用的声明将要调用的C函数。函数。 下面是一个汇编程序调用下面是一个汇编程序调用C程序的例子。其中在汇编程序的例子。其中在汇编 程序中设置好各参数的值,本例有程序中设置好各参数的值,本例有5个参数,分别使用个参数,分别使用 寄存器寄存器R0存放第存放第1个参数,个参数,R1存放第存放第2个参数,个参数,R2存放存放 第第3个参数。个参数。 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编
30、程应用 124 EXPORT asmfile ;可被调用的汇编段可被调用的汇编段 AREA asmfile,CODE,READONLY ;声明汇编程序段声明汇编程序段 IMPORT cFun ;声明调用声明调用C语言的语言的cFun函数函数 ENTRY ;主程序起始入口主程序起始入口 MOV R0, #11 ;将将11放入放入R0 MOV R1, #22 ;将将22放入放入R1 MOV R2, #33 ;将将33放入放入R2 BL cFun;调用调用C语言子函数语言子函数 END /*C 语言函数,语言函数, 被汇编语言调用被汇编语言调用 */ int cFun(int a, int b, i
31、nt c) /声明一个函数声明一个函数 return a + b + c; /返回返回a+b+c的值的值 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 125 5C+嵌入式系统中应用嵌入式系统中应用 C+和和C是可以互相调用的,并且可以灵活的进行汇编语言、是可以互相调用的,并且可以灵活的进行汇编语言、 C语言、语言、C+语言的混合调用。语言的混合调用。 前面讲述了前面讲述了C语言与汇编语言的互相调用,在这里我们将讨论语言与汇编语言的互相调用,在这里我们将讨论 C+和和C语言的互相调用。当语言的互相调用。当C+与与C互相调用是必须使用伪指令互相调用是必
32、须使用伪指令 “extern “C”.”,例如,例如,extern “C”include “cHeadfile.h”。 extern C包含双重含义,包含双重含义,其一其一:被它修饰的目标是:被它修饰的目标是“extern” 的;的;其二其二:被它修饰的目标是:被它修饰的目标是“C”的。的。 (1)被)被extern “C”限定的函数或变量是限定的函数或变量是extern类型的类型的 extern是是C/C+语言中表明函数和全局变量作用范围(可见性)语言中表明函数和全局变量作用范围(可见性) 的关键字,该关键字告诉编译器,其声明的函数和变量可以在本的关键字,该关键字告诉编译器,其声明的函数和变
33、量可以在本 模块或其他模块中使用。模块或其他模块中使用。 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 126 例如:例如:extern int a;此语句仅仅是在声明一个变量,并不是;此语句仅仅是在声明一个变量,并不是 定义变量定义变量a,并未为,并未为a分配内存空间。变量分配内存空间。变量a在所有模块中作为在所有模块中作为 一种全局变量只能被定义一次,否则会出现连接错误。一种全局变量只能被定义一次,否则会出现连接错误。 通常,在模块的头文件中对模块提供给其他模块引用的函通常,在模块的头文件中对模块提供给其他模块引用的函 数和全局变量以关键字数和全
34、局变量以关键字extern声明。例如,如果模块声明。例如,如果模块B欲引用欲引用 该模块该模块A中定义的全局变量和函数时只需包含模块中定义的全局变量和函数时只需包含模块A的头文件的头文件 即可。这样,模块即可。这样,模块B中调用模块中调用模块A中的函数时,在编译阶段,中的函数时,在编译阶段, 模块模块B虽然找不到该函数,但是并不会报错,它会在连接阶段虽然找不到该函数,但是并不会报错,它会在连接阶段 中从模块中从模块A编译生成的目标代码中找到此函数。编译生成的目标代码中找到此函数。 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 127 与与extern
35、对应的关键字是对应的关键字是static,被它修饰的全局变量,被它修饰的全局变量 和函数只能在本模块中使用。因此,一个函数或变量只和函数只能在本模块中使用。因此,一个函数或变量只 可能被本模块使用时,其不可能被可能被本模块使用时,其不可能被extern “C”修饰。修饰。 (2)被)被extern C修饰的变量和函数是按照修饰的变量和函数是按照C语言方式语言方式 编译和连接的。编译和连接的。 作为一种面向对象的语言,作为一种面向对象的语言,C+支持函数重载,而过支持函数重载,而过 程式语言程式语言C则不支持。函数被则不支持。函数被C+编译后在符号库中的名编译后在符号库中的名 字与字与C语言的不
36、同。例如,假设某个函数的原型为:语言的不同。例如,假设某个函数的原型为:void foo(int x, int y); 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 128 该函数被该函数被C编译器编译后在符号库中的名字为编译器编译后在符号库中的名字为_foo,而,而 C+编译器则会产生像编译器则会产生像_foo_int_int之类的名字(不同的之类的名字(不同的 编译器可能产生的名字不同,但是都采用了相同的机编译器可能产生的名字不同,但是都采用了相同的机 制)。制)。_foo_int_int这样的名字包含了函数名、函数参数这样的名字包含了函数名、函
37、数参数 数量及类型信息,数量及类型信息,C+就是靠这种机制来实现函数重载就是靠这种机制来实现函数重载 的。例如,在的。例如,在C+中,函数中,函数void foo(int x, int y)与与void foo(int x, float y)编译产生的符号是不相同的,后者为编译产生的符号是不相同的,后者为 _foo_int_float。 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 129 (3)extern C的惯用法的惯用法 在在C+中引用中引用C语言中的函数和变量,在包含语言中的函数和变量,在包含C语言头语言头 文件(假设为文件(假设为cExample.h)时,需进行下列处理:)时,需进行下列处理: extern C #include cExample.h 4.4.2 C/C+4.4.2 C/C+与汇编语言的混合编程应用与汇编语言的混合编程应用 130 而在而在C语言的头文件中,对其外部函数只能指定为语言的头文件中,对其外部函数只能指定为 extern类型,类型,C语言中不支持语言中不支持extern C声明,在声明,在.c文件文件 中包含了中包含了extern C时会出现编译语法错误。时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中标 补充合同样本
- 关于bot合同样本
- 产品购销运输合同标准文本
- 买卖淘宝商铺合同标准文本
- 供货合同由谁签订合同标准文本
- 做网签合同标准文本
- 个人开店合伙合同标准文本
- ktv设备采购合同标准文本
- 不孕不育合同标准文本
- 保全房屋租赁合同标准文本
- 科技公司费用报销制度及流程比较
- 牧原应聘笔试试题及答案
- 2024年绍兴诸暨市水务集团有限公司招聘考试真题
- 2025年新版供电营业规则考试题库
- 2025年长白山职业技术学院单招职业技能测试题库带答案
- 【初中语文】第11课《山地回忆》课件+2024-2025学年统编版语文七年级下册
- 华为创业成功案例分析
- 2025年事业编畜牧笔试试题及答案
- 2024年内蒙古呼和浩特市中考物理试题【含答案、解析】
- 排水工程监理细则
- 新教科版一年级科学下册第一单元第6课《哪个流动得快》课件
评论
0/150
提交评论