博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【龙芯1c库】龙芯1c上c语言写的函数调用汇编语言写的函数
阅读量:2361 次
发布时间:2019-05-10

本文共 1043 字,大约阅读时间需要 3 分钟。

封装龙芯1c上常见外设接口,便于在裸机程序或实时操作系统中使用,类似于STM32库,正在不断添加中。Git地址是https://gitee.com/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 
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

你可能感兴趣的文章
locale 详解(转载)
查看>>
linux系统主机安全配置!
查看>>
说说大型高并发高负载网站的系统架构
查看>>
大型Web2.0站点构建技术初探
查看>>
使用开源软件,设计高性能可扩展互动网站
查看>>
高并发高流量网站架构
查看>>
再说 Linux 下恢复 EXT3 Superblock
查看>>
YouTube 的架构扩展
查看>>
eBay 的数据库分布扩展架构
查看>>
学习 Flickr 的 基于 LAMP 的容量规划经验
查看>>
Second Life 的数据拾零
查看>>
Linux运行加速专题—性能优化
查看>>
优化策略:从头开始对Linux进行优化
查看>>
熟悉Linux系统安全和优化(全)
查看>>
优化Linux 系统服务来提高引导速度(全)
查看>>
浅谈Linux优化及安全配置的个人体会
查看>>
linux优化之全过程
查看>>
Linux配置与优化技巧三则
查看>>
关于在linux下的硬盘优化的一点试验
查看>>
Linux配置与优化经验
查看>>