微机实验报告(含思考题)实验1

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一

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 前面要添加:

IMPORT a

2.在汇编中调用C的函数

要在汇编中调用C文件中定义的函数,主要做两方面的工作:

首先:需要在汇编中IMPORT 对应的C函数名。

其次:在调用该

C函数之前还需要通过汇编语言传递该函数的

参数。

C和汇编之间的参数传递是通过A TPCS(ARM Thumb Procedure Call Standard)的规定来进行的。简单的说就是如果函数有不多于四个参数,对应的用ARM寄存器R0-R3来进行传递,多于4个时借助栈。函数的返回值通过R0来返回。

3.在C中调用汇编的函数

在C中调用汇编文件中的函数,要做的主要工作有两个:

一:是在C中声明函数原型,并加extern关键字;

二:是在汇编中用EXPORT导出函数名,并用该函数名作为汇

编代码段的标识,最后用mov pc,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

N EQU 100 ;

定义N的值100

AREA Examples,CODE,READONL Y ;声明代码断Examples3

ENTRY ;标识程序入口

CODE32

ARM_CODE

LDR SP,=0X30003F00 ;设置堆栈指针

ADR R0,THUMB_CODE+1 ;

BX R0 ;跳转并切换处理器状态

LTORG ;声明文字池

CODE16

THUMB_CODE

LDR R0,=N ;设置子程序SUM_N的入口参数

BL SUM_N ;调用子程序SUM_N

B THUMB_CODE

;SUM_N

;功能:计算1+2+3+......+N

;入口参数:R0 N的值

;出口参数:R0 运行结果

;占用资源:R0

;说明:当N=0时结果为0,当N=1时结果为1

;若运算溢出,结果为0

SUM_N

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

MOVS R2,R0 ;将n的值复制到R2,并影响相应条件标志BEQ SUM_END ;若N=0,则返回

CMP R2,#1

BEQ SUM_END ;若N=1,则返回

MOV R1,#1 ;初始化计数器R1=1

MOV R0,#0 ;

初始化计数器R0=1

SUN_L1

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

;用汇编实现算法核心部分

ADD R0,R0,R1;

BVS SUM_END;

CMP R1,R2;

BCS SUM_END;

ADD R1,R1,#1;

B SUN_L1

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

SUM_END

MOV R8,R0 ;将结果保存在R8中

POP {R1-R7,PC} ;寄存器出栈,返回

END

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

;文件名:TESTFILE11.S

;功能:从C语言中调用汇编语言

;说明:使用ARMulate软件仿真调试

AREA Example1,CODE,READONL Y ;声明代码段Example1

CODE32 ;声明32位ARM指令

IMPORT __main

EXPORT strcopy

strcopy

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

LDRB R2,[R1],#1

STRB R2,[R0],#1

CMP R2,#0

BNE strcopy

MOV PC,LR

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

END ;文件结束

C语言:

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

文件名:main.c

功能:完成字符串的拷贝

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

#include

extern void strcopy(char *d ,char *s);

int main(void)

{

char *srcstr = "aaaa";

char dststr[] = "bbbb";

printf("Before copying:\n");

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

strcopy(dststr,srcstr);

相关文档
最新文档