C和ARM汇编混合编程实验

上传人:豆浆 文档编号:47873160 上传时间:2018-07-05 格式:PDF 页数:9 大小:2.85MB
返回 下载 相关 举报
C和ARM汇编混合编程实验_第1页
第1页 / 共9页
C和ARM汇编混合编程实验_第2页
第2页 / 共9页
C和ARM汇编混合编程实验_第3页
第3页 / 共9页
C和ARM汇编混合编程实验_第4页
第4页 / 共9页
C和ARM汇编混合编程实验_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《C和ARM汇编混合编程实验》由会员分享,可在线阅读,更多相关《C和ARM汇编混合编程实验(9页珍藏版)》请在金锄头文库上搜索。

1、SYSTEM-2440 实验指导书深圳市海天雄电子有限公司SYSTEM-2440 实验指导书深圳市海天雄电子有限公司. . . .28. . . .实验三实验三C C C C 和和 ARMARMARMARM 汇编混合编程实验汇编混合编程实验1、实验目的掌握 S3C2440A 的 I/O 控制寄存器的配置。掌握 ARM 汇编指令和 C 语言相互调用的方法2、实验设备PC 机、SYSTEM-2440II型 开发板。3、实验内容熟悉 ARM 开发环境的建立。使用 ARM 汇编和 C 语言设置 GPIO 口的相应寄存器。编写跑马灯程序。4、实验原理C C C C 程序与汇编程序相互调用规则为了使单独编

2、译的 C 语言程序和汇编程序之间能够相互调用,必须为子程序间的调用规定一定的规则。ATPCS,即ARM,Thumb过程调用标准(ARM/ThumbProcedureCall Standard),是 ARM 程序和 Thumb 程序中子程序调用的基本规则,它规定了一些子程序间调用的基本规则,如子程序调用过程中的寄存器的使用规则,堆栈的使用规则,参数的传递规则等。下面结合实际介绍几种 ATPCS 规则,如果读者想了解更多的规则,可以查看相关的书籍。1 1 1 1基本基本 ATPCSATPCSATPCSATPCSSYSTEM-2440 实验指导书深圳市海天雄电子有限公司. . . .29. . .

3、.基本 ATPCS 规定了在子程序调用时的一些基本规则,包括下面 3 方面的内容:(1)各寄存器的使用规则及其相应的名称。(2)数据栈的使用规则。(3)参数传递的规则。相对于其它类型的 ATPCS,满足基本 ATPCS 的程序的执行速度更快,所占用的内存更少。但是它不能提供以下的支持:ARM 程序和 Thumb 程序相互调用,数据以及代码的位置无关的支持,子程序的可重入性,数据栈检查的支持。而派生的其他几种特定的 ATPCS 就是在基本 ATPCS 的基础上再添加其他的规则而形成的。其目的就是提供上述的功能。2 2 2 2寄存器的使用规则寄存器的使用规则寄存器的使用必须满足下面的规则:(1)子

4、程序间通过寄存器 R0R3 来传递参数。这时,寄存器 R0R3 可以记作A0A3。被调用的子程序在返回前无需恢复寄存器 R0R3 的内容。(2)在子程序中, 使用寄存器 R4Rll来保存局部变量。 这时, 寄存器R4R11 可以记作 V1V8。如果在子程序中使用到了寄存器 V1V8 中的某些寄存器,子程序进入时必须保存这些寄存器的值, 在返回前必须恢复这些寄存器的值; 对于子程序中没有用到的寄存器则不必进行这些操作。在 Thumb 程序中,通常只能使用寄存器 R4R7 来保存局部变量。(3)寄存器 R12 用作子程序间 scratch 寄存器,记作 IP。在子程序间的连接代码段中常有这种使用规

5、则。(4)寄存器 R13 用作数据栈指针,记作 SP。在子程序中寄存器 R13 不能用作其他用途。寄存器 SP 在进入子程序时的值和退出子程序时的值必须相等。(5)寄存器 R14 称为连接寄存器,记作 LR。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器 R14 则可以用作其他用途。(6)寄存器 R15 是程序计数器,记作 PC。它不能用作其他用途。3. 3. 3. 3.参数传递规则参数传递规则根据参数个数是否固定可以将子程序分为参数个数固定的(nonvariadic)子程序和参数个数可变的(variadic)子程序。这两种子程序的参数传递规则是不同的。SYSTEM-2440

6、 实验指导书深圳市海天雄电子有限公司. . . .30. . . .(1)参数个数可变的子程序参数传递规则对于参数个数可变的子程序,当参数不超过 4 个时,可以使用寄存器 R0R3 来传递参数;当参数超过 4 个时,还可以使用数据栈来传递参数。在参数传递时,将所有参数看作是存放在连续的内存字单元中的字数据。然后,依次将各字数据传送到寄存器 R0、R1、R2、R3 中,如果参数多于 4 个,将剩余的字数据传送到数据栈中, 入栈的顺序与参数顺序相反, 即最后一个字数据先入栈。 按照上面的规则 ,一个浮点数参数可以通过寄存器传递, 也可以通过数据栈传递, 也可能一半通过寄存器传递 ,另一半通过数据栈

7、传递。(2)参数个数固定的子程序参数传递规则对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同。如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递: 各个浮点参数按顺序处理。 为每个浮点参数分配 FP 寄存器。 分配的方法是,满足该浮点参数需要的且编号最小的一组连续的 FP 寄存器。第一个整数参数,通过寄存器 R0R3 来传递。其他参数通过数据栈传递。(3)子程序结果返回规则子程序中结果返回的规则如下: 结果为一个 32 位的整数时,可以通过寄存器 R0 返回。 结果为一个 64 位整数时,可以通过寄存器 R0 和 Rl 返回,依次类推。 结果为一个浮点数时,可

8、以通过浮点运算部件的寄存器 f0、d0 或者 s0 来返回。 结果为复合型的浮点数(如复数)时,可以通过寄存器 f0fN 或者 d0dN 来返回。 对于位数更多的结果,需要通过内存来传递。4. 4. 4. 4.C C C C 语言函数和语言函数和 ARMARMARMARM 汇编语言函数间相互调用汇编语言函数间相互调用高级语言函数与汇编语言函数的混合调用也要遵循 ATPCS 规则,保证程序调用时参数的正确传递。在汇编程序中使用 EXPORT 伪指令声明本子程序,使其它程序可以调用此子程序,而在 C 语言程序中使用 extern 关键字声明外部函数(声明要调用的汇编子程序),即可调用此汇编子程序。

9、下面给出两个例子来介绍函数相互调用。SYSTEM-2440 实验指导书深圳市海天雄电子有限公司. . . .31. . . .例例C C C C 函数中调用汇编函数中调用汇编示例中汇编子程序strcopy 使用两个参数,一个表示目标字符串地址,一个表示源字符串的地址,参数分别存放 R0,R1 寄存器中。#includeexternvoidstrcopy(char*d,const char*s) /声明外部函数。即要调用的汇编子/程序intmian (void)constchar *srcstr= “First string-source“;/定义字符串常量chardstsrt = “Secon

10、d string-destination“;/定义字符串变量printf( “Before copying:/n“ );printf ( “%s n%s/n,“ srcstr,dststr);/显示源字符串和目标字符串的/内容strcopy(dststr,srcstr);/调用汇编子程序, R0=dststr,R1=srcstrprintf( “After copying:n“ )printf ( “ %s n%sn,“ srcstr,dststr);/显示 strcopy 复制字符串结果return(0);被调用汇编子程序:AREASCopy,CODE,READONLYEXPORTstrco

11、py;声明 strcopy,以便外部程序引用strcopy;R0 为目标字符串的地址;R1 为源字符串的地址LDRB R2,R1,#1;读取字节数据,源地址加 lSTRB R2,R0,#1;保存读取的 1 字节数据,目标地址加 1SYSTEM-2440 实验指导书深圳市海天雄电子有限公司. . . .32. . . .CMPr2,#0;判断字符串是否复制完毕BNEstrcopy ;没有复制完毕,继续循环MOVpc,1r;返回END例例汇编程序调用汇编程序调用 C C C C 程序程序汇编程序的设置要遵循 ATPCS 规则,保证程序调用时参数的正确传递。在汇编程序中使用 IMPORT 伪指令声明

12、将要调用的 C 程序函数。在调用 C 程序时,要正确设置入口参数,然后使用 BL 调用。示例程序中使用了 5 个参数,分别使用寄存器 R0 存储第 1个参数,R1 存储第 2 个数,R2 存储第 3 个参数,R3 存储第 4 个参数,第 5 个参数利用堆栈传送。由于利用了堆栈传递参数,在程序调用用结果后要调整堆栈指针。汇编调用 C 程序的汇编程序/*函数 sum ()返回 5 个整数的和*/int sum (inta,litb,intc,intd,inte)return(a+b+c+d+e);/返回 5 个变量的和EXPORTCALLSUMAREAExample,CODE,READONLYIM

13、PORT sum;声明外部标号 sum5,即 C 函数 sum5()CALLSUMSTMFDSP!LR;LR 寄存器堆栈ADDR1,R0,R0;设置 sum 函数入口参数,R0 为参数 aADDR2,R1,R0;R1 为参数 b,R2 为参数 cADDR3,R1,R2STRR3,SP,#-4!;参数 e 要通过堆栈传递SYSTEM-2440 实验指导书深圳市海天雄电子有限公司SYSTEM-2440 实验指导书深圳市海天雄电子有限公司. . . .34. . . .6、实验电路图nLED_1接S3C2440A的GPF4引脚;nLED_2接S3C2440A的GPF5引脚;nLED_3接S3C244

14、0A 的 GPF7 引脚;nLED_4 接 S3C2440A 的 GPF6 引脚。7、实验程序实现7.17.17.17.1 利用利用 C C C C 语言实现跑马灯程序语言实现跑马灯程序/*LEDTEST.C*/*C 语言函数*/SYSTEM-2440 实验指导书深圳市海天雄电子有限公司. . . .35. . . ./*端口 F 寄存器预定义*/#define GPFCON(*(volatile unsigned *)0x56000050) /Port Fcontrol#define GPFDAT(*(volatile unsigned *)0x56000054) /Port Fdata#d

15、efine GPFUP(*(volatile unsigned *)0x56000058) /Pull-up/controlFextern int delay(int time); /*声明汇编函数*/int xmain()GPFCON=(GPFCON|0xFF00)/GPF4-GPF7 设置为 outputGPFUP|=0xF0;/disable GPF pull upwhile(1)GPFDAT=(GPFDAT/GPF4 output 0delay(0x5fffff);/调用汇编语言编写的延时程序GPFDAT=(GPFDAT/GPF5 output 0delay(0x5fffff);/调用汇编语言编写的延时程序GPFDAT=(GPFDAT/GPF7 output 0delay(0x5fffff);/调用汇编语言编写的延时程序GPFDAT=(GPFDAT/GPF6 output 0delay(0x5fffff);/调用汇编语言编写的延时程序

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号