首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

MICROBLAZE处理器C与汇编语言混合编程技巧

MICROBLAZE处理器C与汇编语言混合编程技巧

C语言编码具有易于快速实现、编译效率比较高、,可读性好的特点,在嵌入式编程中使用的比较多;而汇编语言在执行速度与效率方面更具有优势,在一些关键性的应用,往往需要嵌入汇编代码进行加速。为了使C语言与汇编语言之间能取长补短,充分发挥各自优势,在嵌入式编程中掌握C与汇编语言混合编程技巧是十分必要的。本文基于Xilinx公司的MICROBLAZE处理器,讨论在EDK环境下进行C与汇编语言混合编程的方法,希望对博友们有些帮助,网上关于这方面的资料比较少,也欢迎大家有什么使用心得、技巧或资料来分享交流一下。

一、寄存器使用规则
MICROBLAZE具有有32个通用目的寄存器,这些寄存器分为三类:
1.专用的寄存器,包括R0-R2,R13-R18。
2.易失性寄存器,包括R3-R12。
3.非易失性寄存器,包括R19-R31。
专用的寄存器是指有特定用途的寄存器,编程者在一般情况下不要在其它用途上使用该寄存器。具体用途如下:
R0:读出值总是零,任何写该寄存器的操作都无效。
R1用作堆栈指针。
R2用作小数据区的访问指针(只读)。
R13用作小数据区的访问指针(读写)。
R14存储中断返回地址。
R15存储子程序调用时的返回地址。
R16存储陷阱(Trap)返回地址。
R17存储例外(exception)返回地址。
R18存储为汇编器保留的返回地址。
易失性寄存器是指在子程序调用过程中寄存器内容是会改变的,其中R3、R4用来传递函数的返回值,R5-R10用来传递参数到子程序或用作临时寄存器,R11、R12为临时寄存器。易失性寄存器内容的入栈和出栈操作由调用子程序的程序完成。
非易失性寄存器是指在子程序调用过程中寄存器内容是不会改变的,如果子程序要用到这些寄存器,由子程序完成对它们进行入出栈的保护动作。

二、C 程序调用汇编语言函数
首先要在汇编程序中把我们要调用函数的开始处定义一个标号,即从最左边起写标号名称后加一冒号结束,然后在汇编程序开始处声明它为一全局标号,用以下语法形式:
.globl AssemblerFunc
在C程序的头文件中声明下汇编子函数后,在C程序中就可以直接调用的汇编函数了。
在C程序的头文件中声明汇编子函数时已经指定了子函数输入情况和返回类型,根据寄存器使用规则第一参数通过R5寄存器来传递,第二参数通过R6寄存器来传递,其它类似。
如果子函数返回不是void型,返回值由R3(R4)来传递。
注意如果汇编子函数的输入参数是数值、结构体等,实际通过寄存器传递的地址指针。
如果要传递到子函数的输入参数比较多的话,就要采用堆栈的方式,把堆栈指针通过寄存器传递到子程序,由子程序根据堆栈指针来得到输入参数。C语言中的通过指针得到返回值的情况也类似。

三、汇编程序调用C语言函数
在汇编程序调用C语言函数的情况用的不如C 程序调用汇编语言函数的情况多,但同样要遵守寄存器使用规则。
首先要在汇编程序的开始处声明要调用的C语言函数为外部函数,用以下语法形式:
.extern CFunc
在调用处可以用以下方法调用:
BRLID r15, CFunc

四、在C程序中使用汇编语句
在C程序中直接内嵌汇编语句是一种最为简单的混合编程方法,在一些控制场合特别有用,如使用汇编语句开关中断使能位。但过多的使用容易破坏C语言的完整性。有兴趣的朋友可以参考下下面两个网址:
http://www.xilinx.com/support/answers/18561.htm
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Extended-Asm.html#Extended-Asm
返回列表