ARM作业Word文件下载.docx
《ARM作业Word文件下载.docx》由会员分享,可在线阅读,更多相关《ARM作业Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
一.编译前工作:
1.先新建新空间
2.新建程序窗口newfile,程序写完后,将文件保存为XX.S文件,然后点击源文件菜单,增加XX.S文件,将.S文件打开。
3.编译:
Project-->
settings
对Processor设置:
Cpu-->
arm7
Endian-->
默认littleEndian
Buildtools---guntoolsforARM
对Remote设置:
做软件程序时,Remotedevice----simARM7(软件仿真器)
Category:
Targetspecificoptions
Instructionssets---ARMinterworking
4.将程序编译。
5.编译成功后,对debug设置
设置debug:
category----general
Symbolfile—打开XX.S文件中的debug文件中编译生成的XX.elf文件打开。
category----Download
Executeprogramfrom----Downloadaddresss
Downloadaddress:
0x1000
6.设置成功后debug----remoteconnect,然后debug----download
7.View—debug---manger(存储器)address改成0x00001000
---register(寄存器)
8.按F11执行语句---->
往下跳一行
9.要修改指令,先断开链接debug----disconnect
二,软件编程
Ø
1.编写程序将R2的高8位传送到R3的低8位(不考虑R3的其他位)。
程序:
.global_start
.text
_start:
LDRr2,=0x11111111@R2赋值0x11111111
LDRr3,=0x33333333@R3赋值0x33333333
ANDr2,r2,#0xff000000@保留R2的高8位,屏蔽低24位
ANDr3,r3,#0xffffff00@保留R3的高24位,屏蔽低8位
MOVr3,r2,lsr#24@将R2的高8位传送到R3的低8位
stop:
bstop
.end
1.Debugremoteconnect然后download结果:
2.F11跟踪
调试过程值:
将R2赋值为0x11111111,R3赋值为0x33333333
取R2的高八位,消去R3的低八位
将R2的高八位传送到R3的低8位,R3的其他位清零
最终结果:
3.#用movr3,r2,lsr#24将R2的高8位传送到R3的低8位没有考虑R3的其他位。
还可以用orrr3,r3,r2,lsr#24将R2的高8位传送到R3的低8位,没有改变R3的其他位。
结果分析:
将R2赋值0x11111111然后和0xff000000相与取R2的低八位后为0x11000000,将R3赋值为0x33333333,然后和0xffffff00相与,得到0x333333300,再将将R2的高8位传送到R3的低8位,R3其他位清零。
2.编写实现64位的加法运算,要求[R1:
R0]-[R3:
R2],结果放回[R1:
R0]中。
ldrr0,=0x00003333@R0作为低32位赋值
ldrr1,=0x44440000@R1作为高32位赋值
ldrr2,=0x00001111@R2作为低32位赋值
ldrr3,=0x22220000@R3作为高32位赋值
subsr0,r0,r2@R0与R2两个低32位相减
sbcr1,r1,r3@R1与R3两个高32位相减并减去借位位
R0,R1,R2,R3分别赋值
R0减去R2,结果0x00002222放在R0;
R1减去R再减去借位位3结果0x22220000放在R1
结果分析:
R0,R1,R2,R3分别赋值为0x00003333,0x44440000,0x00001111,0x22220000。
R0-R2低四位相减结果存入R0,R0为0x00002222,R1-R3高位相减再减去借位位0结果存入R1,R1为0x22220000,得到[R1:
R0]。
3.编程实现除法运算(不是移位指令),并保留商(若不能整除,则要求保留余数).
程序代码:
movr0,#25@R0为被除数,此时设为25
movr1,#4@R1为除数,此时设为4
movr2,#0@R2为商
loop:
mulr3,r1,r2@将r1和r2相乘结果放在r3
addr2,r2,#1@r2加1放在r2
subr4,r0,r3@R4为余数
cmpr4,r1@余数r4和除数r1比较
bhiloop@不相等循环
bleqA
subr2,r2,#1@消除无法消除时的商多1的问题
A:
@消除整除时的余数
movr4,#0
.end
将除数和被除数存进去
将商初始赋值为0,将商r2和除数r1相乘放入r3,用被除数减去r3得到的就是余数,和除数r1比较
商为0时:
商为3时:
要是两者不相等,则跳转到loop语句循环,直到余数哥除数相等,则再将商减去1排除无法消除时的商多1的问题,得到最终结果余数为1。
首先给商赋初值为0,将商和除数相乘得到R3,用被除数减去R3,得到余数,将余数和除数比较,不相等则跳转到A,循环下去,直到余数和商相等结束循环,再排除无法消除时的商多1的情况,得到商,保留余数。
4.串拷贝(R0指向源数据的首地址,R1指向目的数据串的首地址)
程序代码:
.global
.equnum,8@定义num==8
LDRR0,=srcstr@指向源数据R0
LDRR1,=dststr@指向目的数据R1
movr3,#num@R3=8
movlr,pc@返回
BA
bstop
LDRBR2,[R0],#1@加载无符号字节数据
STRBR2,[R1],#1@存储无符号字节数据
SUBSr3,r3,#1@R3减去1,结果送入R3
cmpR3,#0@将R3的内容与0相比较看是否相等
bneA@不相等则跳转到A
movPC,LR@返回
.data
srcstr:
.long1,2,3,4,5,6,7,0@定义源数据串srcstr
dststr:
.long2,4,8,2,6,4,5,0@定义目的数据串dststr
R0指向源数据,R1指向目的数据,设置num为8
将源数据存入1,将数据加载到R2,将目的数据存入1存储到R2,然后将num减去1然后放在R3,再将R3和0比较,如果不想等则跳转到循环标致A循环。
循环一次结果:
循环8次直到num为0
最后结果:
先取R0指向源数据的首地址,R1指向目的数据串的首地址,每次循环将R0加载1,R1存储1,直到num为0时结束循环。
三.过程中遇到的问题
在做ARM软件编译的时候遇到了一些问题,在将程序编译好后,在下载的时候出现问题,检查一遍后发现在SETTING---DEBUG中category----general时,没有将Symbolfile中选中编译后的文件,导致下载失败。
还有的就是有些指令不是很会用,有的时候会把比如IDR和IDRB混淆,以致用错。
在我觉得,很多问题都出现自己Setting的时候,设置的时候,有次将Remote---Remotedevice----选择EasyIEDarm7,然后下载的时候就出错了,问同学之后才知道应该选择simarm7,EasyIEDarm7是在做硬件实验时候选择的。
编写程序的过程中,还是觉得很多指令都不是很会用,字指令和字节指令时最容易弄错的。
四.心得体会
以前学习过汇编编程,ARM给我的感觉就是和汇编很像,但是又比汇编简单很多,有些指令用起来很简单,让很很容易读懂。
比如加载字数据IDR比MOV好用很多,在做实验的过程中有些命令不会用也会去问同学来搞懂。
将程序下载下来后,我们可以对程序进行单步调试,这样可以很容易就清楚每一步执行之后的结果,还可以通过Memony(寄存器)设置地址来观察每个存储空间存储的内容,我觉得真的很方便。
做完这次实验,给我感触最深的是,在实验过程中我们要非常的细心,不然只要有一点点错误,就无法编译成功或下载成功。
ARM编程,程序也很易懂的,这样容易我们分析程序。