- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验1_ARM汇编指令基础
实验一 ARM汇编指令基础
学号: 姓名:
一、实验目的
初步学会使用Embest IDE for ARM 开发环境及ARM软件模拟器;
通过实验掌握简单ARM汇编指令的使用方法。
二、实验原理
ARM处理器共有37个寄存器:
31个通用寄存器,包括程序计数器(PC)。这些寄存器都是32位。
6个状态寄存器。这些寄存器也是32位,但只使用了其中的12位。
ARM通用寄存器
通用寄存器(R0~R15)可分为3类。
不分组寄存器R0~R7
R0~R7是不分组寄存器。在所有处理器模式下,它们都能被访问。它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。
分组寄存器R8~R14
R8~R14是分组寄存器。被访问的物理寄存器取决于当前的处理器模式。若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字。
寄存器R8~R12各有两组物理寄存器:一组为FIQ模式,另一组为除了FIQ模式以外的所有模式。R8~R12没有任何指定的特殊用途。只是使用R8~R12来简单地处理中断。寄存器R13和寄存器R14各有6个分组的物理寄存器,1个用于用户模式和系统模式,其他5个分别用于5种异常模式。R13通常用作堆栈指针,称作SP。每种异常模式都有自己的R13。R14用作子程序链接寄存器,也称作LR。
程序计数器R15
寄存器R15用作程序计数器(PC)。
本实验中,ARM核工作在用户模式,R0~R15可用。
存储器格式
ARM体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。
大端格式
在这种格式中,字数据的高位字节存储在低地址中,而字数据的低位字节存
放在高地址中,如下所示:
高地址 31 23 22 16 15 8 7 0 字地址
8 9 10 11 8 4 5 6 7 4 0 1 2 3 0
低地址
小端格式
在这种格式中,字数据的高位字节存储在高地址中,而字数据的低位字节存
放在低地址中,如下所示:
高地址 31 23 22 16 15 8 7 0 字地址
11 10 9 8 8 7 6 5 4 4 3 2 1 0 0
低地址
3.GNU基础知识
Embest IDE集成了GNU汇编器as、编译器gcc和链接器ld。因此,编写程序要符合GNU的语法和规则。这里简单介绍几点基本知识:
程序默认入口点为“_start”,代码段默认起始地址为0x8000
常用伪操作符
.equ
为数字常量、基于寄存器的值和程序标号定义一个字符名称。
.global及.globl
声明一个符号可以被其他文件引用,相当于声明了一个全局变量。
.text
将操作符开始的代码编译到代码段或代码段子段(Subsection)。
.end
标记汇编文件的结束行。
三、实验内容
熟悉开发环境的使用并使用ldr/str,mov等指令访问寄存器或存储单元。
使用add/sub/lsl/lsr/and/orr等指令,完成基本数学/逻辑运算。
运行Embest IDE集成开发环境,将下面两段参考程序分别编辑输入,生成目标代码,设置调试模块,下载目标代码到软件仿真器。
四、实验步骤
打开memory窗口,观察地址0x8000~0x801f与地址0x1000的内容。
单步执行程序并观察和记录寄存器与memory的值变化。
结合实验内容和相关资料,观察程序运行,通过实验加深理解ARM指令的使用。
五、实验参考程序
1. 实验A参考程序:
.equ x, 45 /* 定义变量x,并赋值为45*/
.equ y, 64 /* 定义变量y,并赋值为64*/
.equ stack_top, 0x1000 /* 定义栈顶0x1000*/
.global _start
.text
_start: /*程序代码开始标志*/
MOV sp, #stack_top
MOV r0, #x /* x的值放入R0 */
STR r0, [sp] /* R0的值保存到堆栈*/
MOV r0, #y /* y的值放入R0*/
LDR r1, [sp] /* 取堆栈中的数到R1*/
ADD r0, r0, r1
STR r0,
文档评论(0)