ARM作业.docx

上传人:b****6 文档编号:5098200 上传时间:2022-12-13 格式:DOCX 页数:11 大小:130.28KB
下载 相关 举报
ARM作业.docx_第1页
第1页 / 共11页
ARM作业.docx_第2页
第2页 / 共11页
ARM作业.docx_第3页
第3页 / 共11页
ARM作业.docx_第4页
第4页 / 共11页
ARM作业.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

ARM作业.docx

《ARM作业.docx》由会员分享,可在线阅读,更多相关《ARM作业.docx(11页珍藏版)》请在冰豆网上搜索。

ARM作业.docx

ARM作业

ARM实验

 

专业年级:

10级通信工程

学号:

100103011119

姓名:

苏锦

指导教师:

郑汉麟

 

2013年6月8日

华中科技大学文华学院信息学部

一.编译前工作:

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

Symbolfile—打开XX.S文件中的debug文件中编译生成的XX.elf文件打开。

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]中。

程序:

.global_start

.text

_start:

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位相减并减去借位位

stop:

bstop

.end

1.Debugremoteconnect然后download结果:

2.F11跟踪

调试过程值:

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.编程实现除法运算(不是移位指令),并保留商(若不能整除,则要求保留余数).

程序代码:

.global_start

.text

_start:

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的问题

stop:

bstop

A:

@消除整除时的余数

movr4,#0

bstop

.end

1.Debugremoteconnect然后download结果:

2.F11跟踪

调试过程值:

将除数和被除数存进去

将商初始赋值为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

_start:

LDRR0,=srcstr@指向源数据R0

LDRR1,=dststr@指向目的数据R1

movr3,#num@R3=8

movlr,pc@返回

BA

stop:

bstop

A:

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

.end

1.Debugremoteconnect然后download结果:

2.F11跟踪

调试过程值:

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编程,程序也很易懂的,这样容易我们分析程序。

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

当前位置:首页 > 高等教育 > 军事

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

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