好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

ARM中C语言调用汇编语言方法浅析.doc

6页
  • 卖家[上传人]:飞***
  • 文档编号:39935102
  • 上传时间:2018-05-21
  • 文档格式:DOC
  • 文档大小:29KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1 ARM中 中中 中 C 语言调用汇编语言 语言调用汇编语言语言调用汇编语言 语言调用汇编语言方法 方法方法 方法浅析 浅析浅析 浅析 在嵌入式系统开发中,目前使用的主要编程语言是 C 和 ARM 指令汇编 在 一些对性能非常敏感的代码块,基于汇编与机器码一一对应的关系,这时不能依 靠 C 编译器的生成代码,而要手工编写汇编,从而达到优化的目的 一 一一 一、 、 、 、在 在在 在 C 语言中内嵌汇编 语言中内嵌汇编语言中内嵌汇编 语言中内嵌汇编 在 C 中内嵌的汇编指令包含大部分的 ARM 和 Thumb 指令,不过使用与单纯 的汇编程序使用的指令略有不同,存在一些限制,主要有下面几个方面: ① 不能直接向 PC 寄存器赋值,程序跳转要使用 B 或者 BL 指令; ② 在使用物理寄存器时,不要使用过于复杂的 C 表达式,避免物理寄存器冲 突; ③ R12 和 R13 可能被编译器用来存放中间编译结果,计算表达式值时可能把 R0-R3、R12 及 R14 用于子程序调用,因此避免直接使用这些物理寄存器; d 一般不要直接指定物理寄存器; ④ 让编译器进行分配内嵌汇编使用的标记是__asm 或 asm 关键字,用法如下: __asm{instruction [; instruction]}或 asm(“instruction [; instruction]“)。

      下面是一个例子来说明如何在 C 中内嵌汇编语言: //C 语言文件*.c #include void my_strcpy(const char *src, char *dest){ char ch; __asm{ loop: ldrb ch, [src], #1 strb ch, [dest], #1 cmp ch, #0 bne loop } } int main(){ char *a=“forget it and move on!“; char b[64]; my_strcpy(a, b); printf(“original: %s“, a); printf(“copyed: %s“, b); return 0; } 在此例子中C 语言和汇编之间的值传递是用 C 语言的指针来实现的,因为指 针对应的是地址,所以汇编中也可以访问 恢碌摹?2 二 二二 二、 、 、 、在汇编中使用 在汇编中使用在汇编中使用 在汇编中使用 C 定义的全局变量 定义的全局变量定义的全局变量 定义的全局变量 内嵌汇编不用单独编辑汇编语言文件,比较简洁,但是有很多的 限制。

      当汇编 的代码较多时一般放在单独的汇编文件中,这时就需要在汇编文件和 C 文件之 间进行一些数据的传递,最简便的办法就是使用全局变量下面是一个 C 语言 和汇编语言共享全局变量的例子: //C 语言文件*.c #include int gVar=12; extern asmDouble(void); int main(){ printf(“original value of gVar is: %d“, gVar_1); asmDouble(); printf(“ modified value of gVar is: %d“, gVar_1); return 0; } ;汇编语言文件*.S AREA asmfile, CODE, READONLY EXPORT asmDouble IMPORT gVar asmDouble ldr r0, =gVar ldr r1, [r0] mov r2, #2 mul r3, r1, r2 str r3, [r0] mov pc, lr END 在此例中,汇编文件与 C 文件之间相互传递了全局变量 gVar 和函数 asmDouble,留意声明的关键字 extern 和 IMPORT 三 三三 三、 、 、 、在 在在 在 C 中调用汇编的函数 中调用汇编的函数中调用汇编的函数 中调用汇编的函数 有一些对机器要求高的敏感函数,通过 C 语言编写再通过 C 编译器翻译有时 会出现误差,因此这样的函数一般采用汇编语言来编写,然后供 C 语言调用。

      在 C 文件中调用汇编文件中的函数,要注意的有两点: 一、是要在 C 文件中声明所调用的汇编函数原型,并加入 extern 关键字作为引 入函数的声明; 二、是在汇编文件中对对应的汇编代码段标识用 EXPORT 关键字作为导出函数的声明,函数通过 mov pc, lr 指令返回这样,就可以在 C 文件中使用该函数了 从 C 语言的角度的角度,并不知道调用的函数的实现是用 C 语言还是汇编汇编 语言,原因 C 语言的函数名起到表明函数代码起始地址的作用,而这个作用和 汇编语言的代码段标识符是一致的 3 下面是一个 C 语言调用汇编函数例子: //C 语言文件*.c #include extern void asm_strcpy(const char *src, char *dest); int main(){ const char *s=“seasons in the sun“; char d[32]; asm_strcpy(s, d); printf(“source: %s“, s); printf(“ destination: %s“,d); return 0; } ;汇编语言文件*.S AREA asmfile, CODE, READONLY EXPORT asm_strcpy asm_strcpy loop ldrb r4, [r0], #1 cmp r4, #0 beq over strb r4, [r1], #1 b loop over mov pc, lr END 在此例中,C 语言和汇编语言之间的参数传递是通过对应的用 R0-R3 来进行 传递,即 R0 传递第一个参数,R1 传递第二个参数,多于 4 个时借助栈完成,函 数的返回值通过 R0 来传递。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.