【龙芯1c库】龙芯1c上c语言写的函数调用汇编语言写的函数
来源:互联网 发布:卫宁软件股票代码 编辑:程序博客网 时间:2024/06/09 17:19
封装龙芯1c上常见外设接口,便于在裸机程序或实时操作系统中使用,类似于STM32库,正在不断添加中。Git地址是http://git.oschina.NET/caogos/OpenLoongsonLib1c
封装龙芯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_disableirq_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
0 0
- 【龙芯1c库】龙芯1c上c语言写的函数调用汇编语言写的函数
- c语言写的程序里,调用C++写的库里的函数
- 使用 lua 调用 c 语言写的函数
- GO语言如何调用C写的函数
- 一位MM写的C语言函数
- C语言写的Sin函数曲线
- C语言写的trim()函数
- C语言写的trim()函数
- C语言写的trim()函数
- C语言写参数可变的函数
- 【C语言】写一个函数,只要调用一次就可以将参数的值,增加1。
- 汇编语言调用C语言函数的简单方法
- 嵌入式汇编语言调用C语言函数的小例子
- C语言与汇编语言之间的函数调用
- C语言的strcpy函数和自己写的函数
- C语言函数声明不写参数导致函数调用参数可以随便传的问题
- Android上,用mk文件调用C写的函数,承自上一篇(hellojni)
- Visual Studio 2008(C#)调用MATLAB 2008写的函数
- Cookie,session, localStorage 区别
- Intelij 自定义代码注释初探
- 细说apply、call和bind
- PHP进程之信号捕捉中的declare(ticks=1)
- Mybatis分页插件-PageHelper(5.0)的使用
- 【龙芯1c库】龙芯1c上c语言写的函数调用汇编语言写的函数
- 数据挖掘-目录-深度学习(Deep Learning)
- Android 控件——利用Dialog实现底部弹出对话框
- Casino Malaysia iBET Slots REBATE 1% Bonus(casino malaysia, casino malaysia ibet, rebate 1% bonus, r
- iOS APP提交上架最新流程
- JS编码规范插件:JSHint
- 既使用maven又使用本地Jar包
- 蜜罐网络攻击分析实验(网安实验7)
- L2-007. 家庭房产