C和汇编混合编程
来源:互联网 发布:淘宝百度百科 编辑:程序博客网 时间:2024/04/25 20:55
C和汇编混合编程
嵌入式里面用到汇编的地方:
开机时的硬件系统的初始化,包括CPU的状态设定,中断使能主频设定,以及RAM控制参数以及初始化一些中断处理方面涉及一些汇编。‘
C中内嵌汇编大多数为ARM和Thumb指令,其中注意:
1:不能直接向PC赋值,程序跳转用B或者BL指令
2:使用物理寄存器不能使用过于复杂的C表达式,避免物理寄存器冲突
3:R12和R13可能被编译器用来存放中间编译结果,计算表达式可能将R0~R3,R12~R14用于程序调用,避免直接用这些寄存器。
4:一般不要直接指定寄存器,最好让编译器自动分配。
C和汇编参数调用问题,汇编文件如果过大,一般单独作为一个文件,所以参数传递一般用全局变量来进行。
C中调用汇编中的函数,一般注意:
1:在C中声明函数原型,并加extern关键字
2:汇编export导出函数名,并用该函数作为汇编代码段标识,最后用
mov PC LR返回
原因是因为C函数名起到了函数代码起始地址作用,和汇编的Lable是一致的。
C中调用汇编
C语言#include <stdio.h>extern void strcopy(char *d, const char *s);int main(){ const char *srcstr = "First string - source "; char dststr[] = "Second string - destination "; /* 下面将 dststr 作为数组进行操作 */ printf("Before copying:\n"); printf(" %s\n %s\n",srcstr,dststr); strcopy(dststr,srcstr); printf("After copying:\n"); printf(" %s\n %s\n",srcstr,dststr); return(0); }汇编代码.global strcopystrcopy: @R0 指向目的字符串 @R1 指向源字符串LDRB R2, [R1],#1 @加载字节并更新源字符串指针地址STRB R2, [R0],#1 @存储字节并更新目的字符串指针地址CMP R2, #0 @判断是否为字符串结尾BNE strcopy @如果不是,程序跳转到 strcopy 继续复制MOV pc,lr @程序返回
汇编用C语言
;prog1_asm.asm.extern prog1_c @ 声明prog1_c函数.text _start:.global prog1_asmprog1_asm:STR lr, [sp, #-4]! @ 保存当前lrldr r0,=0x1 @ 参数1ldr r1,=0x2 @ 参数2ldr r2,=0x3 @ 参数3bl prog1_c @ 调用C函数LDR pc, [sp], #4 @ 将lr装进pc(返回main函数) .end//prog1_c.cvoid prog1_c(int p1,int p2,int p3){printk("%0x %0x %0x\r\n",p1,p2,p3); // 输出参数值}//main.cint main(){ prog1_asm();while(1);}
阅读全文
0 0
- C和汇编混合编程
- 汇编和c混合编程
- C和汇编混合编程
- c和汇编混合编程
- C和汇编混合编程
- c和汇编混合编程
- c/c艹和汇编混合编程
- ARM中C和汇编混合编程
- 转C/C++和汇编混合编程
- 转C和汇编混合编程
- PICC中C和汇编混合编程
- C和汇编混合编程及示例
- C和ARM汇编混合编程
- C语言和汇编混合编程
- arm汇编和c混合编程
- ARM汇编和C混合编程-笔记
- C 汇编混合编程
- ARM汇编, C语言和汇编混合编程
- window 版Caffe 绘制.prototxt流程图
- C#高级参数out的使用
- 安卓安全开发
- java中的switch语句
- sift学习
- C和汇编混合编程
- 图文直击 | 北美KubeCon爆点之Service Mesh
- 第15周项目3
- 别为Docker本地实现不支持GPU发愁,解决方案在此!
- django创建一个工程
- 【程序猿分享】Cover的美。– background-size:cover
- 轮播图再探
- mysql 正则表达式
- Scrapped or attached views may not be recycled. isScrap:false isAttached:true异常