收藏 分享(赏)

第八次课 汇编语言和c的混合编程.ppt

上传人:kpmy5893 文档编号:8465215 上传时间:2019-06-29 格式:PPT 页数:19 大小:81KB
下载 相关 举报
第八次课 汇编语言和c的混合编程.ppt_第1页
第1页 / 共19页
第八次课 汇编语言和c的混合编程.ppt_第2页
第2页 / 共19页
第八次课 汇编语言和c的混合编程.ppt_第3页
第3页 / 共19页
第八次课 汇编语言和c的混合编程.ppt_第4页
第4页 / 共19页
第八次课 汇编语言和c的混合编程.ppt_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、汇编与c的混合编程,在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,因为C语言的结构比较好,便于人的理解,而且有大量的支持库。汇编语言,例如开机时硬件系统的初始化,包括CPU状态的设定,中断的使能,主频的设定,以及RAM的控制参数及初始化,一些中断处理方面也可能涉及汇编。,C和汇编的混合编程,在c中嵌入汇编指令在汇编程序和c程序之间进行变量的互访在汇编程序,c程序之间的相互调用,1 在C语言中内嵌汇编,在C中内嵌的汇编指令包含大部分的ARM和Thumb指令,存在一些限制,主要有下面几个方面:不能直接向PC寄存器赋值,程序

2、跳转要使用B或者BL指令在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能将R0到R3、R12及R14用于子程序调用,因此要避免直接使用这些物理寄存器,内嵌汇编使用的标记是 _asm,用法如下:_asm instruction ; instructioninstruction ,void enable_IRQ(void)int tmp;_asmMRS tmp,CPSRBIC tmp,tmp, #80MSR CPSR_c,tmp ,void disable_IRQ(void) int tmp;_asmMRS tmp

3、,CPSRORR tmp,tmp, #80MSR CPSR_c,tmp ,80=0x50=0b1010000,#include void my_strcpy(const char *src, char *dest) char ch; _asmloop:ldrb ch, src, #1strb ch, dest, #1cmp ch, #0bne loop ,int main() char *a = “forget it and move on!“;char b64;my_strcpy(a, b);printf(“original: %s“, a);printf(“copyed: %s“, b);

4、 return 0; ,在程序中定义一个变量,在编译时就给 这个变量分配一个内存单元,同时根据 变量的类型决定这个内存单元的大小。 如:整型2字节,实型4字节。,内存中每一个字节都有一个编号, 就是“地址”。,对每一个变量,它在内存中都有一个 存储位置,这个位置就是该变量的地址, 对变量值的存取是通过地址进行。 在C语言中这个地址被形象化地称为“指针”。,指针:一个变量的地址。 指针变量:存放地址的变量.,定义一个指针变量指针变量在使用前必须定义,使其指向特定类型的变量,指针变量存放地址,必须定义为“指针类型”。 定义的一般形式:基类型 *指针变量名; 基类型:用来指定指针变量可以指向的变量的

5、类型。将决定指针移动和运算时的移动量。构成:存储类型 数据类型 * :表示该变量为指针类型,注意: 1、指针变量名是p1,p2 ,不是*p1,*p2 2、指针变量只能指向定义时所规定类型的变量 3、指针变量定义后,变量值不确定,应用前必须先赋值,2 在汇编中使用C定义的全局变量,汇编通过地址访问c的全局变量 访问方法: 使用INPORT/EXTERN伪操作引用该全局变量 使用LDR伪指令读取全局变量的地址 使用LDR指令读取全局变量 使用STR指令存储该全局变量,范例:globvar的地址载入R1,将该地址中包含的值载入R0,并与2相加,结果保存在globvar中.,PRESERVE8AREA

6、 globals,CODE,READONLYEXPORT asmsubroutineIMPORT globvar ;引入全局变量globvar asmsubroutineLDR R1,=globvarLDR R0,R1ADD R0,R0,#2STR R0,R1MOV pc,lrEND,2 在汇编中使用C定义的全局变量,#include int gVar_1 = 12; extern asmDouble(void);int main() printf(“original value of gVar_1 is: %d“, gVar_1);asmDouble();printf(“ modified

7、value of gVar_1 is: %d“, gVar_1);return 0; ,AREA asmfile, CODE, READONLYEXPORT asmDoubleIMPORT gVar_1asmDoubleldr r0, =gVar_1ldr r1, r0mov r2, #2 mul r3, r1, r2str r3, r0mov pc, lrEND,2.在c中访问汇编的程序数据,访问方法: 在汇编中用EXPORT/GLOBAL伪操作声明该全局标号 在c中定义相应的数据类型指针变量,将该指针变量赋值为汇编中的全局标号,用该指针访问汇编中的数据.,3.汇编与c的相互调用,1.在C中

8、调用汇编的函数 在C中调用汇编文件中的函数,主要工作有两个:一是在C中声明函数原型,并加extern关键字;二是在汇编中用EXPORT导出函数名,并用该函数名作为汇编代码段的标识,最后用mov pc, lr返回。,范例:将一个字符串赋值给另一个字符串,#include Extern void strcopy(char *d,const char *s); Int main() Const char *srcstr=“Source string”;Char dststr= =“destination string”;Printf(“before copying :n”);Printf(“%sn%

9、sn”,srcstr,dsttr);Strcopy(srcstr,dsttr);Printf (“after copying :n”);Printf(“%sn%sn”,srcstr,dsttr);Return(0); ,PRESERVE8AREA Scopy ,CODE,READONLYEXPORT strcopy strcopyLDRB R2,R1,#1STRB R2,R0,#1CMP R2,0BNE strcopyMOV pc,lrEND,在汇编中调用C的函数,在汇编中调用C的函数,需要在汇编中IMPORT 对应的C函数名,使用BL指令调用 EXPORT asmfileAREA asmfi

10、le, CODE, READONLYIMPORT cFunENTRYmov r0, #11mov r1, #22mov r2, #33 BL cFunEND/*C file, called by asmfile */int cFun(int a, int b, int c) return a + b + c; ,int g( int a, int b, int c, int d, int e, int f ) printf(“e=%dn”, e);printf(“f=%dn”, f);return (a+b+c+d+e+f); ; 汇编程序调用C程序 g( ) 计算6个整数 i, 2*i, 3

11、*i, 4*i, 5*i, 6*i的和,假设R0中的内容为iEXPORT fAREA f ,CODE, READONLYIMPORT gADD R1, R0, R0 ;R1存放第2个参数2*iADD R2, R1, R0 ;R2存放第3个参数3*iADD R3, R2, R0 ;R3存放第4个参数4*iADD R4, R3, R0 ;R4=5*iADD R5, R4, R0 STR R4, SP, #-4! ;堆栈存放第5个参数5*iSTR R5, SP, #-4! ;堆栈存放第6个参数6*iBL gADD SP, SP, #4 ;在程序调用结束后调整数据栈指针ADD SP, SP, #4 ;在程序调用结束后调整数据栈指针 STOP B STOPEND,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报