1、ARM作业 ARM实验 专业年级: 10级通信工程 学号: 100103011119 姓名: 苏锦 指导教师: 郑汉麟 2013年6月8日华中科技大学文华学院信息学部 一编译前工作:1. 先新建新空间2. 新建程序窗口new file,程序写完后,将文件保存为XX.S文件,然后点击源文件菜单,增加XX.S文件,将.S文件打开。3. 编译:Project-settings对Processor设置:Cpu-arm7Endian-默认 little EndianBuild tools-gun tools for ARM对Remote设置:做软件程序时,Remote device -simARM7(软
2、件仿真器)Category: Target specific optionsInstructions sets-ARM interworking4. 将程序编译。5. 编译成功后,对debug设置设置debug:category-generalSymbol file打开XX.S文件中的debug文件中编译生成的XX.elf文件打开。category-DownloadSymbol file打开XX.S文件中的debug文件中编译生成的XX.elf文件打开。Execute program from - Download addresssDownload address : 0x10006. 设置成
3、功后 debug- remote connect,然后debug- download7. Viewdebug -manger(存储器)address 改成0x00001000 -register(寄存器)8. 按F11执行语句-往下跳一行9. 要修改指令,先断开链接debug- disconnect二,软件编程 1 .编写程序将R2的高8位传送到R3的低8位(不考虑R3的其他位)。程序:.global _start.text_start: LDR r2,=0x11111111 R2赋值0x11111111 LDR r3,=0x33333333 R3赋值0x33333333 AND r2,r2,
4、#0xff000000 保留R2的高8位,屏蔽低24位 AND r3,r3,#0xffffff00 保留R3的高24位,屏蔽低8位 MOV r3,r2,lsr#24 将R2的高8位传送到R3的低8位stop: b stop.end1.Debugremote connect 然后download结果:2.F11跟踪调试过程值: 将R2赋值为0x11111111,R3赋值为0x33333333 取R2的高八位,消去R3的低八位将R2的高八位传送到R3的低8位,R3的其他位清零最终结果:3.#用mov r3,r2,lsr#24将R2的高8位传送到R3的低8位没有考虑R3的其他位。还可以用orr r3
5、,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: ldr r0,=0x00003333 R0作为低32位赋值 ldr r1,=0x44440000 R1作为高32
6、位赋值 ldr r2,=0x00001111 R2作为低32位赋值 ldr r3,=0x22220000 R3作为高32位赋值 subs r0,r0,r2 R0与R2两个低32位相减 sbc r1,r1,r3 R1与R3两个高32位相减并减去借位位stop: b stop.end1.Debugremote connect 然后download结果:2.F11跟踪调试过程值: R0,R1,R2,R3分别赋值 R0减去R2,结果0x00002222放在R0;R1减去R再减去借位位3结果0x22220000放在R1最终结果:结果分析:R0,R1,R2,R3分别赋值为0x00003333,0x4444
7、0000,0x00001111,0x22220000。R0-R2低四位相减结果存入R0,R0为0x00002222,R1-R3高位相减再减去借位位0结果存入R1,R1为0x22220000,得到R1:R0。 3 .编程实现除法运算(不是移位指令),并保留商(若不能整除,则要求保留余数).程序代码:.global _start.text_start: mov r0,#25 R0为被除数,此时设为25 mov r1,#4 R1为除数,此时设为4 mov r2,#0 R2为商loop: mul r3,r1,r2 将r1和r2相乘结果放在r3 add r2,r2,#1 r2加1放在r2 sub r4,
8、r0,r3 R4为余数 cmp r4,r1 余数r4和除数r1比较 bhi loop 不相等循环 bleq A sub r2,r2,#1 消除无法消除时的商多1的问题stop: b stopA: 消除整除时的余数 mov r4,#0 b stop .end 1.Debugremote connect 然后download结果:2.F11跟踪调试过程值: 将除数和被除数存进去将商初始赋值为0,将商r2和除数r1相乘放入r3,用被除数减去r3得到的就是余数,和除数r1比较商为0时: 商为3时: 要是两者不相等,则跳转到loop语句循环,直到余数哥除数相等,则再将商减去1排除无法消除时的商多1的问题
9、,得到最终结果余数为1。最终结果:结果分析:首先给商赋初值为0,将商和除数相乘得到R3,用被除数减去R3,得到余数,将余数和除数比较,不相等则跳转到A,循环下去,直到余数和商相等结束循环,再排除无法消除时的商多1的情况,得到商,保留余数。 4.串拷贝(R0指向源数据的首地址,R1指向目的数据串的首地址)程序代码:.global.equ num,8 定义num=8_start: LDR R0,=srcstr 指向源数据R0 LDR R1,=dststr 指向目的数据R1 mov r3,#num R3=8 mov lr,pc 返回 B Astop:b stopA: LDRB R2,R0,#1 加载
10、无符号字节数据 STRB R2,R1,#1 存储无符号字节数据 SUBS r3,r3,#1 R3减去1,结果送入R3 cmp R3,#0 将R3的内容与0相比较看是否相等 bne A 不相等则跳转到A mov PC,LR 返回.datasrcstr:.long 1,2,3,4,5,6,7,0 定义源数据串srcstrdststr:.long 2,4,8,2,6,4,5,0 定义目的数据串dststr.end1.Debugremote connect 然后download结果:2.F11跟踪调试过程值: R0指向源数据 ,R1指向目的数据,设置num为8 将源数据存入1,将数据加载到R2,将目的
11、数据存入1存储到R2,然后将num减去1然后放在R3,再将R3和0比较,如果不想等则跳转到循环标致A循环。循环一次结果:循环8次直到num为0 最后结果:结果分析:先取R0指向源数据的首地址,R1指向目的数据串的首地址,每次循环将R0加载1,R1存储1,直到num为0时结束循环。三过程中遇到的问题 在做ARM软件编译的时候遇到了一些问题,在将程序编译好后,在下载的时候出现问题,检查一遍后发现在SETTING-DEBUG中category-general时,没有将Symbol file中选中编译后的文件,导致下载失败。还有的就是有些指令不是很会用,有的时候会把比如IDR和IDRB混淆,以致用错。
12、在我觉得,很多问题都出现自己Setting的时候,设置的时候,有次将Remote-Remote device -选择EasyIEDarm7,然后下载的时候就出错了,问同学之后才知道应该选择simarm7, EasyIEDarm7是在做硬件实验时候选择的。编写程序的过程中,还是觉得很多指令都不是很会用,字指令和字节指令时最容易弄错的。四心得体会以前学习过汇编编程,ARM给我的感觉就是和汇编很像,但是又比汇编简单很多,有些指令用起来很简单,让很很容易读懂。比如加载字数据IDR比MOV好用很多,在做实验的过程中有些命令不会用也会去问同学来搞懂。将程序下载下来后,我们可以对程序进行单步调试,这样可以很容易就清楚每一步执行之后的结果,还可以通过Memony(寄存器)设置地址来观察每个存储空间存储的内容,我觉得真的很方便。做完这次实验,给我感触最深的是,在实验过程中我们要非常的细心,不然只要有一点点错误,就无法编译成功或下载成功。ARM编程,程序也很易懂的,这样容易我们分析程序。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1