仅作演示。

1.C和汇编可相互调用,汇编子函数格式参考 汇编:普通的函数调用的汇编代码解析 http://www.cnblogs.com/mylinux/p/4139972.html

  本文演示了 : 汇编嵌入到c语言;

            汇编调用c语言,c语言调用汇编。

2.C函数参数从左到右是放到r0-r3,[不够再push stack];push stack用stmfd ldmfd,右边的参数会先入栈

;//call_asm.s
PRESERVE8
AREA |C$$code|, CODE, READONLY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IMPORT cfunc_print
IMPORT c_add
IMPORT c_sub EXPORT AsmCallerAdd
EXPORT AsmCallerSub
EXPORT AsmCallerPrint
EXPORT slib_ReadCpuStatus AsmCallerAdd ; ,执行子函数TestFunc6(,)
sub r13, r13, # ;sp-=
str r14, [r13] ;sp--->lr
bl c_add ;BL : r0,r1中的参数传到子函数
ldr r14, [r13] ;lr--->sp
add r13, r13, # ;sp+=
bx r14 ;goto sp AsmCallerSub
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #
bl c_sub
ldmfd sp, {fp, sp, pc}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AsmCallerPrint
sub r13, r13, # ;sp -=
str r14, [r13] ;sp ---> lr
bl cfunc_print ;
ldr r14, [r13] ;lr ---> sp
add r13, r13, # ;sp +=
bx r14 ;goto sp slib_ReadCpuStatus
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #
mrs r0,cpsr
ldmfd sp, {fp, sp, pc} END
//asm_c.c

/*
根据“ARM-thumb 过程调用标准”:
r0-r3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。
被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。
r4-r11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。
r12 是内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。
在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。
r13 是栈指针 sp。它不能用于任何其它用途。sp 中存放的值在退出被调用函数时必须与进入时的值相同。
r14 是链接寄存器 lr。如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复
r15 是程序计数器 PC。它不能用于任何其它用途。
注意:在中断程序中,所有的寄存器都必须保护,编译器会自动保护R4~R11
*/ int c_add(int a ,int b)
{
return a+b;
}
int c_sub(int a ,int b)
{
return a-b;
} unsigned int asm_c_ctl_cp15(void)
{
unsigned int i = ;
Uart_Printf("asm_c_ctl_cp15\n"); __asm
{
mrc p15,,r0,c1,c0,
MOV i,r0
}
return i;
} unsigned int asm_c_ReadCPSR(void)
{
unsigned int i = ;
__asm
{
mrs r0,cpsr
MOV i,r0
}
return i;
} void cfunc_print()
{
Uart_Printf("this is cfunc_print,called_by_asm\n");
} void asm_demo(void)
{
int i, j,a ;
Uart_Printf("asm_demo\n"); asm_c_ctl_cp15();//在c中使用汇编语言操作协处理器cp15
Uart_Printf("4+5 = %d \n" , AsmCallerAdd(, ) ); //汇编调用c语言函数
//mdk_jlink:
//get into AsmCallerAdd(4, 5) : r0=4 ,r1=5
//get into c_add : r0=4 ,r1=5
//return from c_add : r0=9
//return from AsmCallerAdd: r0=0x30006160 ,r1=9 .
//函数参数从左到右是放到r0-r3,[不够再push stack]
//push stack用stmfd ldmfd,右边的参数会先入栈
//STMFD&&LDMFD http://www.cnblogs.com/mylinux/p/4139972.html Uart_Printf("9-5 = %d \n" , AsmCallerSub(, ) );//汇编调用c语言函数
Uart_Printf("slib_ReadCPSR :%x \n" , asm_c_ReadCPSR() ); //在c语言中混合汇编,读取Cpsr寄存器 AsmCallerPrint();//汇编调用c语言函数
switch(0x1f & slib_ReadCpuStatus()){//c语言调用汇编编写的函数
case 0x13:
Uart_Printf("in svc\n" , a);
} }
// asm_demo
// asm_c_ctl_cp15
// 4+5 = 9
// 9-5 = 4
// slib_ReadCPSR :60000013 //mode[4-0] 10011 svc模式。
// this is cfunc_print,called_by_asm。
// in svc

arm:c语言和汇编混合编程的更多相关文章

  1. ARM中C和汇编混合编程及示例(转)

    在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

  2. c语言环境初始化&c语言和汇编混合编程

    bootloader通常会分为两个阶段:第一阶段采用汇编语言来编写,主要是一些核心的初始化工作(内存,时钟的初始化),第二阶段使用C语言来编写,主要是它会完成一些板载硬件的初始化(串口,网口)然后其启 ...

  3. 【转】VxWorks中高精度实时时钟的实现及C语言汇编混合编程

    最近一个项目中需要在VxWorks下使用一个高精度实时时钟,要求精度为1ms,溢 出时间大于5小时.VxWorks提供系统时钟,该时钟在操作系统启动后开始计数,精度为1个tick,可以通过tickGe ...

  4. C51与汇编混合编程详解

    C51和汇编混合编程(1)-C语言中嵌入汇编 1.在 C文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ;Assembler Code Here #pragma ENDASM ...

  5. keil C语言与汇编语言混合编程

    C与汇编混合编程主要有以下几种:(1)C语言中嵌入汇编(2)无参数传递的函数调用(3)有参数传递的函数调用 一.C语言中嵌入汇编 1.在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #prag ...

  6. 单片机C 语言与汇编语言混合编程

    在单片机应用系统设计中,过去主要采用汇编语言开发程序. 汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差.C语言程序开发是近年来单片机系统 ...

  7. Part10-C语言环境初始化-C与汇编混合编程lesson4

    1.为什么要混合编程 汇编语言:执行效率高:编写繁琐: 执行效率高:能够更直接地控制处理器. c语言:可读性强,移植性好,调试方便. 1.汇编调用c函数 2.c调用汇编函数 汇编语言定义的函数(标号) ...

  8. C语言与汇编语言混合编程实验

    混合编程方法: 模块链接法 汇编指令嵌入法 1: 模块链接法则 模块链接法是指分别用汇编语言和C语言实现独立的模块(或子程序),再用链接程序把各模块生成的obj文件连接成一个可执行程序. 1:C语言调 ...

  9. C语言调用Python 混合编程

    导语 Python有很多库,Qt用来编写界面,自然产生C++调用Python的需求.一路摸索,充满艰辛 添加头文件搜索路径,导入静态库 我的python头文件搜索路径:C:\Python27amd64 ...

随机推荐

  1. HDU 4705 Y

    Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submis ...

  2. [置顶] 如何在Windows 7 64位安装Python,并使用Matplotlib绘图

    1.     安装Python 我使用的是Windows 7 64 bit,所以我从Python官网下载python-2.7.5.amd64.msi,安装步骤如下: 1)        安装windo ...

  3. RADOS工作原理

    转:http://www.csdn.net/article/2014-04-08/2819192-ceph-swift-on-openstack-m/2 Ceph的工作原理及流程 本节将对Ceph的工 ...

  4. nodejs partials 分布视图

    在学习<node.js开发指南>nodejs partials view时,怎么都不能运行成功.经过艰苦探索,终于成功了,分享一下. Cause: nodejs 的express 版本之间 ...

  5. ASP.NET 操作配置文件

    1.配置文件的各种操作 http://www.cnblogs.com/shimeng3344518/archive/2007/04/23/723999.html 2. http://www.jb51. ...

  6. ios7以上自定义导航栏标题的字体大小及颜色的方法

    自定义导航栏的字体和颜色,只需要自定义一个lable,然后将lable添加到导航栏的titleview中就可以了 代码如下 UILabel *label = [[UILabel alloc] init ...

  7. c#程序添加其他网站的webservice引用。

    前言: 有A网站,B网站两个网站独立运行.某一天,需要两个网站进行合作来完成一件事,比如用A网站接收一些数据进行处理,存入中转数据库,B网站定时去取数据进入自己的系统进行处理. 可能我们会先想到在B网 ...

  8. BZOJ 1806: [Ioi2007]Miners 矿工配餐( dp )

    dp... ------------------------------------------------------------------------------- #include<cs ...

  9. CSS——图片替换方法比较

    图片替换主要是指将文字替换成图片的技术,即在html语句中使用文字,浏览器显示时用对应的图片显示.其意义在于便于做网站优化(SEO),文字才是搜索引擎寻找的主要对象. 经典的替换方法: Fahrner ...

  10. Apache的Mod_rewrite学习(RewriteRule重写规则的语法)

    URL:http://www.tenwe.com/tech/web/server/200705/content_1548.shtml 今天学习重写规则的语法.RewriteRuleSyntax: Re ...