- 1、本文档共50页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
主要内容: 一、ARM 汇编语言程序设计 1、两种常用 IDE 简介 2、ADS/SDT 下的伪操作 3、ARM 汇编语言伪指令 4、ARM 汇编语言的文件和语句 5、ARM 汇编语言编程的几个问题 6、ARM 汇编语言编程示例 二、C 与汇编语言混合编程 1、嵌入式 C 语言程序设计的几个问题 2、C 与汇编语言混合编程及示例 三、ARM 汇编语言编程示例 参数个数固定的子程序参数传递规则: 第一个整数参数,通过寄存器R0~R3来传递。其他参数通过数据栈传递。 参数个数可变的子程序参数传递规则: 当参数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数 子程序结果返回规则 结果为一个32位整数时,可以通过寄存器R0返回;结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。 参数的传递规则 在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。 armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指令集。所以,同一个C程序中不能同时包含ARM指令和Thumb指令。 内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。 嵌入式汇编在形式上表现为独立定义的函数体。 ② 内嵌汇编 内嵌汇编示例: # include stdio.h void astrcpy(char *p1,char *p2) { char tempch; __asm { loop:LDRB tempch,[p1],#1 STRB tempch,[p2],#1 CMP tempch,#0 BNE loop } } void main() { …定义并初始化str1、str2, …定义字符串tempstr __asm { MOV R0,str1 MOV R1,str2 MOV R2,tempstr BL astrcpy,(R0,R2) BL astrcpy,(R1,R0) BL astrcpy,(R2,R1) } } ③ C和ARM汇编程序间相互调用 遵守ATPCS的前提下,注意export和extern的配合使用 示例:C程序调用汇编程序 #include stdio.h extern void strcpy(char *,char *) void main() { char *src=“source”; char *dst=“destination”; strcpy(dst,src); printf(“%s\n%s\n”,src,dst); } area Scopy,code,readonly export strcpy strcpy LDRB R2,[R1],#1 STRB R2,[R0],#1 CMP R2,#0 BNE strcpy MOV PC,LR end 示例:汇编程序调用C程序 int g(int a,int b,int c,int d,int e) { return a+b+c+d+e; } C程序用于计算五个数之和 汇编程序则把四个放入R0~R3, 最后一个放在数据栈内; 编译器判断出需要几个参数, 自动取得。 area f,code,readonly extern g STR LR,[SP,#-4]! ADD R1,R0,R0 ADD R2,R1,R0 ADD R3,R1,R2 STR R3,[SP,#-4]! ADD R3,R1,R1 BL g ADD SP,SP,#4 LDR PC,[SP],#4 end 1、求两个向量的点积 2、SWI 软件中断 3、IRQ 中断 4、异常中断向量表的搬运 例程 1:求两个向量的点积 #include stdio.h #define low32(a) (((unsigned *)a)[0]) #define high32(a) (((int *)a)[1]) ; 小端存储模式 void main() { int a[10] = {1,2,3,4,5,6,7,8,9,10}; int b[10] = {10,9,8,7,6,5,4,3,2,1}; printf(“Dotprod is %ld \n”, dotprod(a,b,10)); } __int64 dotprod(int *a, int *b, unsigned n) { __int64 sum=0; do { sum += mlal(sum, *a++, *b++); } while
文档评论(0)