ARM转化C语言进制转换函数?

开发Arm程序的时候,大多数时候使用C/C++语言就可以了,但汇编语言在某些情况下能够实现一些 无法实现的功能,这时候就要调用一些汇编语言的程序.我们需要大概了解一下在C语言中如何嵌入汇编语言.

2.举例:使能/禁止IRQ中断

4.内嵌汇编的指令用法:

.操作书: 内嵌的中作为操作数的寄存器和常量可以是C表达式.这些表达式可以是char,short或int等类型,而且这些表达式都是作为无符号数进行操作的.若要有符号数,用户需要自己处理与符号有关的操作.编译器将会计算这些表达式的值,并为其分配寄存器.

.物理寄存器:内嵌汇编中使用物理寄存器是有限制的:

_ 不能直接向PC(程序计数器)寄存器中赋值,程序跳转只能通过B或BL指令来实现.

_ 使用物理寄存器的指令中,不要使用过于复杂的C表达式

_ 尽可能少的使用物理寄存器

.常量: 在内嵌汇编指令中,常量前面的"#"可以省略

.标号: C程序中的标号可以被内嵌的汇编指令使用.但是只有指令B可以使用C程序中的标号,而指令BL则不能使用.

.内存单元的分配:所有内存分配均由C编译器完成,分配的内存单元通过变量供内嵌汇编器使用.内嵌汇编器不支持内嵌汇编程序中用于内存分配的伪指令.

5.内嵌汇编注意事项:

.必须小心使用物理寄存器,如R0~R3,IP,LR,CPSR中的标志位,避免发生冲突.

改成下面代码会比较妥当:

.不要使用寄存器代替变量.

.使用内嵌汇编无需保存和恢复寄存器.事实上,除了CPSR,SPSR寄存器,对物理寄存器先读后写都会引起汇编报错.

.汇编语言中","号作为操作数分隔符.如果有C表达式作为操作数,若表达式中包含有",",则必须使用()将其规约为一个汇编操作数,例如:

6.不同数据类型对应的汇编指令:

7.访问C程序的变量:

ATPCS规则体现了一种模块化设计的思想,其基本内容是C模块(函数)和汇编模块(函数)相互调用的一套规则(C51中也有类似的一套规则)。我感觉比在线汇编功能强大(不用有很多忌讳),条理更清楚(很简单的几条规则)。

1、子程序之间通过寄存器r0~r3来传递参数,当参数个数多于4个时,使用堆栈来传递参数。此时r0~r3可记作A1~A4。

2、在子程序中,使用寄存器r4~r11保存局部变量。因此当进行子程序调用时要注意对这些寄存器的保存和恢复。此时r4~r11可记作V1~V8。

3、寄存器r12用于保存堆栈指针SP,当子程序返回时使用该寄存器出栈,记作IP。

4、寄存器r13用作堆栈指针,记作SP。寄存器r14称为链接寄存器,记作LR。该寄存器用于保存子程序的返回地址。

5、寄存器r15称为程序计数器,记作PC。

ATPCS规定堆栈采用满递减类型(FD,Full Descending),即堆栈通过减小存储器地址而向下增长,堆栈指针指向内含有效数据项的最低地址。

1、整数参数的前4个使用r0~r3传递,其他参数使用堆栈传递;浮点参数使用编号最小且能够满足需要的一组连续的寄存器传递参数。

2、子程序的返回结果为一个32位整数时,通过r0返回;返回结果为一个64位整数时,通过r0和r1返回;依此类推。结果为浮点数时,通过浮点运算部件的寄存器F0、D0或者S0返回。

比较有条理,很清楚,我举两个例子:

1.汇编主程序调用C子程序

汇编程序的书写要遵循ATPCS规则,以保证程序调用时参数正确传递。在汇编程序中调用C程序的方法为:

1)在汇编程序中使用IMPORT伪指令或者extern事先声明将要调用的C语言函数;

2)通过BL指令来调用C函数。

例如在一个C源文件中定义了如下求和函数:

调用add()函数的汇编程序结构如下:

当进行函数调用时,使用r0和r1实现参数传递,返回结果由r0带回。函数调用结束后,r0的值变成3。

2.C主程序调用汇编子程序

C程序调用汇编程序时,汇编程序的书写也要遵循ATPCS规则,以保证程序调用时参数正确传递。在C程序中调用汇编子程序的方法为:

1)在汇编程序中使用EXPORT伪指令声明被调用的子程序,表示该子程序将在其他文件中被调用;

2)在C程序中使用extern关键字声明要调用的汇编子程序为外部函数。

例如在一个汇编源文件中定义了如下求和函数:

在一个C程序的main()函数中对add汇编子程序进行了调用:

当main()函数调用add汇编子程序时,变量a、b的值会给了r0和r1,返回结果由r0带回,并赋值给变量c。函数调用结束后,变量c的值变成3。

3、C程序中内嵌汇编语句

在C语言中内嵌汇编语句可以实现一些高级语言不能实现或者不容易实现的功能。对于时间紧迫的功能也可以通过在C语言中内嵌汇编语句来实现。内嵌的汇编器支持大部分ARM指令和Thumb指令,但是不支持诸如直接修改PC实现跳转的底层功能,也不能直接引用C语言中的变量。

内嵌汇编:在C和C++语言中嵌入汇编语言可以实现一些高级语言中没有的功能。

共四个部分:汇编语句模板,输出部分,输入部分,破坏描述部分,各部分使用“:”格开,汇编语句模板必不可少,其他三部分可选,如果使用了后面的部分,而前面部分为空,也需要用“:”格开,相应部分内容为空。例如:

ARM嵌入式系统c语言编程

(惠普中国软件开发中心上海201206 )

操作系统不支持的嵌入式系统软件,包括系统引导、驱动程序、动态内存管理、Io、通信和APP应用软件。 本文详细介绍了如何在嵌入式平台上用c语言编写系统软件和APP应用软件。 虽然针对ARM平台进行了介绍,但基本经验和算法也适用于其他嵌入式平台的软件设计。

关键词嵌入式系统软件c语言ARM

没有意义(如果返回,则表示系统出现严重错误)。 另外,为

操作系统不支持的嵌入式软件包括系统引导、外围驱动程序、存储管理、系统Io、通信、APP应用程序等

汇编语言(约10% )和c语言(约90% )组合。 本文结合作者实践,详细介绍ARM嵌入式平台的c编程方法。 考虑到通信软件的范围很广,本文不讨论。

为了避免混淆,必须为main函数指定另一个名称,如main。 否则,编译器将在main函数中生成大量初始化代码,从而导致c程序主入口和系统引导模块的接口错误。

系统引导模块完成各种初始化任务后,通过跳转指令进入c的主入口Main,控制权从那里传递给了c APP应用程序。

存储管理是一个复杂的挑战。 从广义上讲,磁盘文件系统、存储器、片上高速缓存等都属于这一范畴。 在嵌入式系统中,内存的动态分配和释放以及闪存管理都很有意义。 本文介绍了在嵌入式系统中实现的动态内存管理。

c语言中的动态内存分配和释放主要有malloc和free两个标签

2系统启动和main函数

c语言通常从main函数开始。 main函数的原型是:

这里,argc是参数的个数,argv是指向各参数的指针的排列。

main函数由操作系统内核启动,操作系统内核完成该函数所需

变量初始化行为,并在调用结束后检查main函数的返回值。 0时,程序正常运行。 否则,程序的动作是错误的。 在嵌入式系统中,由于不存在操作系统内核,因此main函数的初始化任务只能由系统引导(BOOT )模块执行。

系统的引导(BOOT )部分完成系统的初始化工作,用汇编语言实现。 其工作包括硬件初始化、堆栈寄存器设置、全局变量初始化或清除0、加载以RAM运行的模块、堆参数初始化等。 这些工作完成后,将控制权传递给c的main函数。 显然,对于嵌入式系统的main来说,argc和argv两个参数和返回值是

实现了准库函数。 malloc从系统的可用内存中分配适当的内存块,

free函数完成内存块的回收利用。 这两个函数一般在操作系统中是必需的

的支持。 在ARM承载平台上,不能直接调用。 为此,编写了malloc和mfree两个函数,实现了动态存储管理功能。

典型的APP应用程序内存映像分为代码区域、数据区域和堆栈区域,这三个区域从低到高按顺序分布。 代码区域从最低地址开始,堆栈区域

受理日期:。 结实图书、硕士、主研领域:数字通信、嵌入式及网络编程。

我要回帖

更多关于 C语言进制转换函数 的文章

 

随机推荐