微机实验报告实验1Word格式.doc
- 文档编号:13091594
- 上传时间:2022-10-04
- 格式:DOC
- 页数:8
- 大小:53KB
微机实验报告实验1Word格式.doc
《微机实验报告实验1Word格式.doc》由会员分享,可在线阅读,更多相关《微机实验报告实验1Word格式.doc(8页珍藏版)》请在冰豆网上搜索。
2.RVDS工具
【实验设备和工具】
硬件:
PC机Pentium100以上
软件:
Windows操作系统,RVDS软件
【实验原理】
1.在汇编中使用C定义的全局变量
在汇编和C之间进行一些数据的传递,最简便的办法就是使用全局变量。
在汇编中调用C中定义的全局变量,需要在汇编中IMPORT对应的全局变量。
IMPORT伪指令用于通知编译器要使用的标号或变量在其他的源文件中定义。
例如:
汇编文件asmfile.s想调用C文件cfile.c中定义的全局变量a,则在汇编文件asmfile.s前面要添加:
IMPORTa
2.在汇编中调用C的函数
要在汇编中调用C文件中定义的函数,主要做两方面的工作:
首先:
需要在汇编中IMPORT对应的C函数名。
其次:
在调用该C函数之前还需要通过汇编语言传递该函数的
参数。
C和汇编之间的参数传递是通过ATPCS(ARMThumbProcedureCallStandard)的规定来进行的。
简单的说就是如果函数有不多于四个参数,对应的用ARM寄存器R0-R3来进行传递,多于4个时借助栈。
函数的返回值通过R0来返回。
3.在C中调用汇编的函数
在C中调用汇编文件中的函数,要做的主要工作有两个:
一:
是在C中声明函数原型,并加extern关键字;
二:
是在汇编中用EXPORT导出函数名,并用该函数名作为汇
编代码段的标识,最后用movpc,lr返回。
然后,就可以
在C中使用该函数了。
EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。
【实验步骤】
1、用ARM汇编实现1+2+….n的运算。
2、理解C和汇编,并用汇编程序实现字符串拷贝,并在C程序中调用该汇编程序。
在汇编文件testfile1.s中添加两行汇编代码,分别实现:
拷贝源字符串的一个字节到R2中
将拷贝的字节复制到目标空间
注意事项:
1.C文件和汇编文件都必须加到工程中去,否则编译会报错。
2.C文件和汇编文件要拷贝到工程目录下。
3、在汇编中调用C函数。
在汇编文件testfile2.s中相应位置添加汇编代码,通过调用c函数g()实现1+2+3+glovb1,结果存在R8中。
【实验结果和程序】
1、用ARM汇编实现1+2+….n的运算。
;
功能:
计算1+2+3+4+...+N
;
说明;
N>
=0,当N=0时结果为0,当N=1时结果为1
NEQU100;
定义N的值100
AREAExamples,CODE,READONLY;
声明代码断Examples3
ENTRY;
标识程序入口
CODE32
ARM_CODE
LDRSP,=0X30003F00;
设置堆栈指针
ADRR0,THUMB_CODE+1;
BXR0;
跳转并切换处理器状态
LTORG;
声明文字池
CODE16
THUMB_CODE
LDRR0,=N;
设置子程序SUM_N的入口参数
BLSUM_N;
调用子程序SUM_N
BTHUMB_CODE
SUM_N
计算1+2+3+......+N
入口参数:
R0N的值
出口参数:
R0运行结果
占用资源:
R0
说明:
当N=0时结果为0,当N=1时结果为1
若运算溢出,结果为0
PUSH{R1-R7,LR};
寄存器入栈保护
MOVSR2,R0;
将n的值复制到R2,并影响相应条件标志
BEQSUM_END;
若N=0,则返回
CMPR2,#1
若N=1,则返回
MOVR1,#1;
初始化计数器R1=1
MOVR0,#0;
初始化计数器R0=1
SUN_L1
;
------------------------------------------
用汇编实现算法核心部分
ADDR0,R0,R1;
BVSSUM_END;
CMPR1,R2;
BCSSUM_END;
ADDR1,R1,#1;
BSUN_L1
SUM_END
MOVR8,R0 ;
将结果保存在R8中
POP{R1-R7,PC};
寄存器出栈,返回
END
Arm汇编:
文件名:
TESTFILE11.S
从C语言中调用汇编语言
使用ARMulate软件仿真调试
AREA Example1,CODE,READONLY ;
声明代码段Example1
CODE32 ;
声明32位ARM指令
IMPORT__main
EXPORTstrcopy
strcopy
LDRBR2,[R1],#1
STRBR2,[R0],#1
CMP R2,#0
BNEstrcopy
MOVPC,LR
END ;
文件结束
C语言:
/****************************************
main.c
完成字符串的拷贝
****************************************/
#include<
stdio.h>
externvoidstrcopy(char*d,char*s);
intmain(void)
{
char*srcstr="
aaaa"
chardststr[]="
bbbb"
printf("
Beforecopying:
\n"
);
%s%s\n"
srcstr,dststr);
strcopy(dststr,srcstr);
Aftercopying:
\n"
%s\n%s\n"
return(0);
}
TESTFILE8.S
从汇编语言中调用C语言
IMPORTg
ENTRY
IMPORTglovb1
START
MOVR0,#1
MOVR1,#2
MOVR2,#3
LDRR3,glovb1
BLg
MOVR8,R0
完成求和
int*glovb1;
glovb1=10;
intg(inta,intb,intc,intd)
returna+b+c+d;
【思考题】
1、add替换成adds,sub替换成subs有什么影响。
答:
运算结果不影响CPSR中相应标志位的值,跳转指令因为上一步的CPSR的值没有改变而无法正确执行。
2、mov替换成movne有什么影响?
只有在上一步计算结果为不相等时才执行。
3、STMIA换成STMIB,STMIA换成STMDA有什么区别。
第一个是将每次写入前地址+4改为地址-4,第二个是将每次写入前地址+4改为+1
4、思考用ARM汇编实现1+3+5+….+(2n+1)或者2+4+6+…..+2n。
实现1+3+5+….+(2n+1):
将addr1,r1,#1改为addr1,r1,lsl#1subr1,r1,#1
2+4+6+…..+2n:
将addr1,r1,#1改为addr1,r1,lsl#1.
5、实验4中如果去除汇编代码中的“EXPORTstrcopy”会有什么现象,为什么?
答:
C语言无法调用用strcopy函数。
因为EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。
6、实验5中如果去除汇编代码中的“IMPORT…..”会有什么现象,为什么?
无法调用C语言的main函数。
因为IMPORT伪指令用于通知编译器要使用的标号或变量在其他的源文件中定义。
【实验结论】
本实验使用RVDS软件熟悉了C语言和arm汇编的混合编程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 实验 报告