FriendlyARM Tiny210开发板硬件基础 第二篇--汇编调用c语言
2015-11-12 17:18
274 查看
对于所有的编程语言来说、经过编译器编译之后最后都要生成汇编代码,继而再生成机器码,所有c语言能实现的功能在汇编中照样可以实现,只不过比较麻烦而已。 无论是汇编还是c语言,函数的名字代表的是一个入口地址,即通过该地址可以访问到函数。
那么如何用c语言调用汇编那?
用c语言调用汇编首先要解决的就是参数传递问题,因为语言的函数都有参数如:int add(const int a, const int b); 在汇编语言中没有参数,函数定义是这样的: main: .....汇编代码..... 不过汇编中也是有参数的,他的规定是这样的:用寄存器来存储传递的参数值:在ARM的汇编中r0代表第一个参数r1,r2,r3用来存储四个参数。如果参数多于四个就会用栈来存储。下面就写一个简单地的c语言调用汇编的程序:
c语言:
#include <stdio.h> export int add(int a, int b); int main(void) { int a = 10; int b = 20; int c =0; c = add(a,b); printf("%d + %d = %d",a,b,c); return 0; }
汇编代码如下:
//头部是固定的格式 说明这是一个只读代码段 AREA add, CODE, READONLY EXPORT strcopy add adds r0,r0,r1 //r0 = r0+r1 s:影响标志位 END
这样一个简答的c语言调用汇编就实现了。
下面来说一下汇编调用c语言,汇编调用c语言更简单不用考虑传参问题,直接找到c函数的地址就可以了,以点亮LED为例来实现一个简单的汇编调用c语言的例子:(寄存器配置已在上篇说过 这里直接写代码) 汇编代码:
.global _start _start: //设置堆栈指针 因为c语言要用到栈 //该值是计算出来的 具体怎么计算 我也不清楚 ldr sp, =0xD0037780 //跳转到c语言的main函数去执行 bl main halt: b halt
c语言代码:
//设置GPJ控制寄存器的地址 #define GPJ2CON (*(volatile unsigned long *) 0xE0200280) #define GPJ2DAT (*(volatile unsigned long *) 0xE0200284) //延时函数 void delay(void) { int i; for(i=0x100000; i>0; i--); } int main(void) { //清空GPJ2CON的[15 0]位 GPJ2CON &= ~((0xf<<0)|(0xf<<4)|(0xf<<8)|(0xf<<12)); //将GPJ2的0-4号引脚设置为输出 GPJ2CON |= (0x1<<0)|(0x1<<4)|(0x1<<8)|(0x1<<12); //闪烁灯 while(1) { GPJ2DAT = 0; delay(); GPJ2DAT = 0xF; delay(); } return 0; }
Makefile:
led.bin:start.s main.c arm-linux-gcc -c -o start.o start.s arm-linux-gcc -c -o main.o main.c arm-linux-ld -Ttext 0x20008000 -o ledc_elf start.o main.o arm-linux-objcopy -O binary -S ledc_elf ledc.bin arm-linux-objdump -D ledc_elf > ledc.dis clean: rm -f *.o *.dis ledc_elf *.bin
这样利用c语言实现的一个点亮LED的程序就完成了。
相关文章推荐
- 记录:游戏开发中那些小坑坑
- C++虚继承虚基类虚函数纯虚函数总结
- C语言
- C项目开发—通讯录(二) 初始化、查看、添加功能实现
- 成功—失败法和0.618法结合求出局部极小值的C语言实现
- C,C++ 指针数组与数组指针
- C/C++优先级列表
- c++ primer 2 变量和基本类型
- 排序算法(c++编写)
- C++异常以及错误处理
- C++的头文件和实现文件
- c语言 头文件
- 深入 Qt5 信号槽新语法 重载函数 函数指针 c/c++风格类型转换 带有默认参数的槽函数
- C++编程值得参考的博客资料
- C语言三种参数传递方式
- Prime C++ Exercise 2.11 编写程序,要求用户输入两个数——底数(base)和指数 (exponent),输出底数的指数次方的结果。
- C++primer第五版第九章学习笔记
- 在C++中怎么判断一个double型数据的小数点部分是否为零
- C++ primer 第五版 答案
- C++primer第五版第八章学习笔记