微机实验报告实验1.doc

上传人:b****9 文档编号:159914 上传时间:2022-10-04 格式:DOC 页数:8 大小:53KB
下载 相关 举报
微机实验报告实验1.doc_第1页
第1页 / 共8页
微机实验报告实验1.doc_第2页
第2页 / 共8页
微机实验报告实验1.doc_第3页
第3页 / 共8页
微机实验报告实验1.doc_第4页
第4页 / 共8页
微机实验报告实验1.doc_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

微机实验报告实验1.doc

《微机实验报告实验1.doc》由会员分享,可在线阅读,更多相关《微机实验报告实验1.doc(8页珍藏版)》请在冰豆网上搜索。

微机实验报告实验1.doc

电子科技大学

实验报告

学号学生姓名:

课程名称:

任课老师:

实验项目名称

实验一ARM汇编基础实验

【实验目的】

1.掌握ARM汇编指令

2.学习掌握C与汇编混合编程基础

3.熟练使用ARM调试工具RVDS进行调试操作

【实验内容】

1.熟悉ARM汇编

2.用ARM汇编实现1+2+...+N

3.C调用汇编实验(实现字符串拷贝功能)

4.汇编调用C实验

5.ARM汇编实现冒泡算法(选做)

【预备知识】

1.ARM汇编、C语言

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

SUM_N

PUSH{R1-R7,LR};寄存器入栈保护

MOVSR2,R0;将n的值复制到R2,并影响相应条件标志

BEQSUM_END;若N=0,则返回

CMPR2,#1

BEQSUM_END;若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

2、理解C和汇编,并用汇编程序实现字符串拷贝,并在C程序中调用该汇编程序。

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

externvoidstrcopy(char*d,char*s);

intmain(void)

{

char*srcstr="aaaa";

chardststr[]="bbbb";

printf("Beforecopying:

\n");

printf("%s%s\n",srcstr,dststr);

strcopy(dststr,srcstr);

printf("Aftercopying:

\n");

printf("%s\n%s\n",srcstr,dststr);

return(0);

}

3、在汇编中调用C函数。

Arm汇编:

;文件名:

TESTFILE8.S

;功能:

从汇编语言中调用C语言

;说明:

使用ARMulate软件仿真调试

IMPORTg

AREA Example1,CODE,READONLY ;声明代码段Example1

CODE32 ;声明32位ARM指令

ENTRY

IMPORTglovb1

START

;------------------------------------------

MOVR0,#1

MOVR1,#2

MOVR2,#3

LDRR3,glovb1

BLg

MOVR8,R0

;------------------------------------------

END ;文件结束

C语言:

/****************************************

文件名:

main.c

功能:

完成求和

****************************************/

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汇编的混合编程。

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

当前位置:首页 > 表格模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1