【龙芯1c库】龙芯1c上c语言写的函数调用汇编语言写的函数
2017-03-24 12:20
495 查看
封装龙芯1c上常见外设接口,便于在裸机程序或实时操作系统中使用,类似于STM32库,正在不断添加中。Git地址是http://git.oschina.NET/caogos/OpenLoongsonLib1c
封装龙芯1c库难免会涉及到汇编程序,本文以c语言main()函数中调用一个用汇编实现的禁止中断的函数。源码如下
test_entry.S
main.c
使用命令“mipsel-linux-gcc test_entry.S main.c -o test”编译
看着很顺利,很轻松。不妨把文件"test_entry.S"的扩展名改为小写的s,试试。
为什么会出现错误呢?提示非法操作数,就以16行“mfc0 v0, CP0_STATUS”为例,操作数v0和CP0_STATUS不是已经在前面定义了的吗,为什么把扩展名改为小写的s之后就“不认识”了呢?
原因是,汇编文件扩展名如果是小写的s,则表示改文件为“纯”汇编文件,不会执行预处理操作。即不认识“#include、#define、#ifdef、 #endif”等,而‘#’在汇编程序中是注释的意思,所以直接忽略了宏定义,最后在碰到宏的时候,就“不认识”了。
如果汇编文件扩展名是大写的S则会在编译汇编文件之前执行预处理操作,就没有这个问题了。
参考了《GNU 汇编中的#define 等宏定义解释》 http://blog.csdn.net/zhangjun1992/article/details/21962093
封装龙芯1c库难免会涉及到汇编程序,本文以c语言main()函数中调用一个用汇编实现的禁止中断的函数。源码如下
test_entry.S
#define v0 $2 /* return value */ #define v1 $3 #define ra $31 /* return address */ #define CP0_STATUS $12 .section ".text", "ax" .set noreorder .globl irq_disable irq_disable: mfc0 v0, CP0_STATUS and v1, v0, 0xfffffffe mtc0 v1, CP0_STATUS jr ra nop .set reorder
main.c
#include <stdio.h> extern void irq_disable(); int main(void) { irq_disable(); }
使用命令“mipsel-linux-gcc test_entry.S main.c -o test”编译
看着很顺利,很轻松。不妨把文件"test_entry.S"的扩展名改为小写的s,试试。
为什么会出现错误呢?提示非法操作数,就以16行“mfc0 v0, CP0_STATUS”为例,操作数v0和CP0_STATUS不是已经在前面定义了的吗,为什么把扩展名改为小写的s之后就“不认识”了呢?
原因是,汇编文件扩展名如果是小写的s,则表示改文件为“纯”汇编文件,不会执行预处理操作。即不认识“#include、#define、#ifdef、 #endif”等,而‘#’在汇编程序中是注释的意思,所以直接忽略了宏定义,最后在碰到宏的时候,就“不认识”了。
如果汇编文件扩展名是大写的S则会在编译汇编文件之前执行预处理操作,就没有这个问题了。
参考了《GNU 汇编中的#define 等宏定义解释》 http://blog.csdn.net/zhangjun1992/article/details/21962093
相关文章推荐
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈(转载)
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- ARM基础:为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆
- ARM基础:为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- 为何C语言(的函数调用)需要堆栈,而汇编语言不需要
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆
- C语言调用汇编语言 实现字符串拷贝
- C/C++与汇编语言的交互之-(2)从C/C++代码调用汇编代码中的函数与变量
- C语言与C++语言函数互相调用
- 为何汇编里调用C函数需要堆栈,而汇编语言的函数的调用却不需要堆栈