当前位置:文档之家› 电子科技大学微嵌实验最新版

电子科技大学微嵌实验最新版

电子科技大学微嵌实验最新版电子科技大学实验报告修正了M00和旧版答案的错误,代码使用Keil uVision5 均已调试通过。

课程名称微处理器系统结构与嵌入式系统设计_____________________实验名称ARM基础编程实验_____________________________________任课教师________ 实验教师 ________ 姓名 ______ 学号__________ 实验地点分组号时间年月日、实验目的1.熟悉并掌握常用ARM匚编指令2.熟悉并掌握C+汇编混合编程技术3.熟练使用ARM软件开发调试工具Keil_、实验内容1.学习使用Keil开发工具2.使用ARM匚编语言,编程头现1+2+ ...... +N累加运算功冃匕3.使用C调用汇编函数,实现字符串拷贝功能4.使用汇编调用C函数,实现求和运算功能5.使用ARM匚编语言,实现冒泡排序算法(选做)三、实验步骤1.实验1.1 :运行Keil ,建立工程文件,单步运行调试演示示例程序,深刻理解每一条指令,观察寄存器,内存空间的变化。

2.实验1.2 :用汇编语言实现1+2+...+N的累加:a)建立新工程,加入实验1.2文件夹中的sum.s。

b)用汇编补充算法核心部分,代码参考流程图如下图 1.1所示。

c)使用单步调试,仔细观察过程中关键寄存器值的变化。

R0暂存累加和图3.实验1.3 : C调用汇编实现字符串拷贝功能:a)建立新工程,加入实验1.3文件夹中的ma in .c和testfile.s(同一个工程下添加两个文件一起编译)。

b)补充完成源代码中缺失的部分,分别实现1.拷贝源字符串的一个字节到R2中;2.将拷贝的字节复制到目标空间。

c)运行Debug进行调试。

4.实验1.4 :汇编调用C实现求和1+2+...+10 :a)建立新工程,加入实验1.4文件夹中的sum.c和testfile.s(同一个工程下添加两个文件一起编译)。

b)补充完成源代码中缺失的部分,通过调用c函数g()实现1+2+3+glovb1,结果存在R8中。

c)运行Debug进行调试5.实验1.5 : ARM匚编实现冒泡算法:a)建立新工程,加入实验1.5文件夹中的maopao.s。

b)补充完成源代码中缺失的部分,实现冒泡排序功能。

c)运行Debug进行调试四、实验结果1.实验1.2 :用汇编语言实现1+2+...+N的累加核心代码如下:ADD R0,R1BVS SUM_ENDCMP R1,R2BHS SUM_ENDADD R1,#1B SUN_L1Register Value &一Current0x0000001 [:K1QzOOOOOOOTR20x00000064K30x00000000K40x00000000站0x00000000R60x00000000RT0x00000000虻0K000013UL0x00000000R100x00000000K110x00000000K12OiOOOOOOOOH13(SV0130003EEDK14㈣O JE OOOOOOITLR150x00000028+ CFSR OxOOOOOOF3+ SFSR 0x00000000图1.2可以看见最终结果显示在寄存器R8处,十六进制为13BA 转换成十进制为5050,实现了累加功能。

2.实验1.3 : C调用汇编实现字符串拷贝功能核心代码如下:LDRB R2,[R1],#1 ; 拷贝源字符串的一个字节STRB R2,[R0],#1 ; 将拷贝的字节复制到目标空间Name Location/Yalue TypeB V main0x00000188intfO I 田J 5<..0^000001 E4 "aaaa'*auto - char*£ * cL0x40000450 "bbbb'1auto - charfS]图1.3Name LocationA'alje Type曰0 main QXOOOQOIBS int fQ+“ s..0x00000000auto - char *+i 30x40000450 'aaaa"自uto -char[5]图1.4可以看出拷贝前srcstr 是” aaaa”,dststr 是” bbbb”,拷贝后srcstr 是” aaaa” ,dststr 是” aaaa”,实现了字符串拷贝功能。

3.实验1.4 :汇编调用C实现求和1+2+...+10核心代码如下:MOV R0,#1MOV R1,#2MOV R2,#3MOV R3,#10BL gMOV R8,R0Value- CurrentEO ajtooaoooiaRI ojioooooooeK oxooaooctnE3 0x0000OCOkR4 O K ODOOOCOOB5 O K OOOCOOOOBT O K QQOQQOW图1.5ft CF5H O K OOOCQCD3□K OOOOOOOOT 5F5II可以看出最终结果显示在寄存器R8处,十六进制表示为0010,转换为十进制为0x104.实验1.5 : ARM匚编实现冒泡算法代码如下:AREA Sort,CODE,READONLYENTRYstartMOV R4,#0LDR R6,=srcADD R6,R6,#lenLDR R7,=src;初始化R4作为循环计数器inner2MOV R1,R7CMP R6,R7BLE outer ;将每次循环开始,正确设置R1 的值为数组开始地址;如果所有数字均已排序,即R6<=R7输出跳转到outer函数innerLDR R2,[R1]LDR R3,[R1,#4]CMP R2,R3BGT exchange ;判断相邻数字是否符合规律,不符合跳转到exchange 函数inner1ADD R1,R1,#4CMP R1,R6BLT innerADD R4,R4,#4CMP R4,#lenBLE subtractionexchangeSTR R3,[R1]STR R2,[R1,#4]B innerlsubtracti on SUB R6,R6,#4B inner2outerLDR R1,=srcsrc DCD 2,4,10,8,14,1,20AREA Array,DATA,READWRITE len EQU7*4ENDMemory MapCurrent Mapped Ranges:000: 0x00000000、OxOOOOCHJSB exec read001: (MXXHJOOSC - (k0000007B exec read write002; 0x00D0Q07C * 0x00000003 exec read 003: 0x40000000 - QxWOOFFF read write 004; OX4AOQOOOO-OX4AOOOC1F readwrile005: (MCOOOOOO - Qx4C000017 read write006; OxSSDOOOJO - Ox5€OO[HJ0F read wnleKill Seleded RangeCloseHelp图1.6排序前在star函数中获得R6地址后,首先如上图,设置权限才能正确执行程序。

Address |OtxOOOOM5C图1.7排序前Addr 廖 ItkODOOMSCOxOOOOOOSC 01 no oa 0000 cm 00 04 QQ 00 00 ns 00 00 00 DA. 00 00 on OE DO ao DO 1^1 OQ oo00 SCno no oa 00 DO OK00<DOD07E 00 DD ao QQ00 00 00 00 OD QO QO DO OD 00 00 OD QO 00 DQ OD 00 00 DO au oa DO OD 00 OQ DO 00 00 00 00 0x000000^0 oo OD00 00 00 oa 00 00 00 00 00 DO 00 00 □0 ao 00 DO 00 00 aa ao ao 00 00 OD 00 00 DO 00 00 00 00 OK0QOOOOC200 CD OQ 00 DO 00 OQ 00 □ QQ 00 DO □a OU DO □D QO QQ DO □ OU 00 oc 00 OQ 00 OD QO >00 oa 00 00 00 DO 0xaoooaoE4 00 QO oa 00 DO □ oa 00DO OD00 DOUD oa 00 00 ao 00DO 00 QOOQ 00 ao □000 OD00 OQ00 ao oa 00 00OxdOOGOioe00 00 00 OG 00 00 00 ■00000 00 00 加 g g 00 00 00 00 GOg 00 00 00 00 00 00 g 00 oo 00 g OCi0K aoooai23 DO OD 00 00 DO ao □a 00 OD QO 00 DO □ oa {)DO ao □0 DO ao oaDO QD oa DO ao oa O Q DO ao □a OQ DOC K OOCOOKA00 00 00 2 w 00 oo CO 00 CbO 00 g 00 OD g 00 00 oct 130 00 00zoe 00 g 0-0 00 00 00 0000地址0x0000005C-0x00000078中保存的排序后的结果正确, 程序实现了冒泡法排序功能。

五、 实验总结1•此次实验用汇编和C 语言实现了 1~N 的累加、字符串的拷贝、 数字求和以及冒泡法排序这几项功能,了解了汇编语言的基 础指令及其意义,学会了使用了 Keil 编译器编写和调试程 序。

2. 知道了 C 程序与汇编语言相互调用的规则: 寄存器的使用规则:“子程序间”通过寄存器 R (H R3来传递参数。

如果更多参数需要传递,则需要使用堆栈。

(这 — 也是第二题字符串复制中使用 R0和R1的原因)在“子程 序中”,使用寄存器R4〜R11来保存局部变量。

寄存器R12用于子程序间scratch 寄存器(用于保存SP,在 函数返回时使用该寄存器出桟),记作 IP 。

寄存器R13用于数据栈指针,记作SP 寄存器SP 在进入子 程序时的值和退出子程序时的值必须相等。

寄存器R14称为链接寄存器,记作LR 。

它用于保存子程序 的返回地址。

寄存器R15是程序计数器,记作PG六、 实验思考题1. Q: ADD 替换成ADDS SUB 替换成SUBS 有什么影响?A :替换后,运算结果会影响标志寄存器。

相关主题