实践-ARM的多寄存器寻址
ARM处理器9种基本寻址方式
寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式,ARM处理器有9 种基本寻址方式。
1.寄存器寻址操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,寄存器的内容是操作数,指令执行时直接取出寄存器值操作。
例如指令:MOV R1,R2 ;R1←R2SUB R0,R1,R2 ;R0←R1- R22.立即寻址在立即寻址指令中数据就包含在指令当中,立即寻址指令的操作码字段后面的地址码部分就是操作数本身,取出指令也就取出了可以立即使用的操作数(也称为立即数)。
立即数要以“#”为前缀,表示16进制数值时以“0x”表示。
例如指令:ADD R0,R0,#1 ;R0←R0 + 1MOV R0,#0xff00 ;R0←0xff003.寄存器移位寻址寄存器移位寻址是ARM指令集特有的寻址方式。
第2个寄存器操作数在与第1个操作数结合之前,先进行移位操作。
例如指令:MOV R0,R2,LSL #3 ;R2的值左移3位,结果放入R0,即R0=R2 * 8 ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相与操作,结果放入R1可采用的移位操作如下:LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0。
LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0。
ASR:算术右移(Arithmetic Shift Right),移位过程中保持符号位不变,即如果源操作数为正数,则字的高端空出的位补0,否则补1ROR:循环右移(Rotate Right),由字的低端移出的位填入字的高端空出的位RRX:带扩展的循环右移(Rotate Right extended by 1 place),操作数右移一位,高端空出的位用原C 标志值填充。
各移位操作过程如图所示。
4.寄存器间接寻址指令中的地址码给出的是一个通用寄存器编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针,操作数存放在存储器中。
ARM寄存器及功能介绍R0-R15寄存器
ARM寄存器及功能介绍R0-R15寄存器1、ARM 寄存器组介绍ARM 处理器⼀般共有 37 个寄存器,其中包括:(1) 31 个通⽤寄存器,包括 PC(程序计数器)在内,都是 32 位的寄存器。
(2) 6 个状态寄存器,都是 32 位的寄存器。
ARM 处理器共有 7 种不同的处理器模式:⽤户模式(User),快速中断模式(FIQ),普通中断模式(IRQ),管理模式(Svc),数据访问中⽌模式(Abort),未定义指令中⽌模式(Und),系统模式(Sys),在每⼀种处理器模式中有⼀组相应的寄存器。
在任意⼀种处理器模式下,可见的寄存器包括 15 个通⽤寄存器(R0~R14)、⼀个或者⼆个状态寄存器以及程序计数器(PC)。
在所有的寄存器中,有些是各模式共⽤同⼀个物理寄存器,有些寄存器是各个模式⾃⼰拥有独⽴的物理寄存器其中 r0~r3 主要⽤于⼦程序间传递参数, r4~r11 主要⽤于保存局部变量,但在 Thumb 程序中,通常只能使⽤ r4~r7 来保存局部变量;r12 ⽤作⼦程序间scratch 寄存器,即 ip 寄存器; r13 通常⽤做栈指针,即 sp; r14 寄存器⼜被称为连接寄存器(lr),⽤于保存⼦程序以及中断的返回地址; r15 ⽤作程序计数器(pc),由于 ARM 采⽤了流⽔线机制,当正确读取了 PC 的值后,该值为当前指令地址加8 个字节,即 PC 指向当前指令的下两条指令地址。
CPSR和SPSR都是程序状态寄存器,其中SPSR是⽤来保存中断前的CPSR中的值,以便在中断返回之后恢复处理器程序状态。
2.CPSR寄存器详解所有处理器模式下都可访问当前程序状态寄存器CPSR。
CPSR中包含条件码标志、中断禁⽌位、当前处理器模式以及其他状态和控制信息。
在每种异常模式下都有⼀个对⽤的程序状态寄存器SPSR。
当异常出现时,SPSR⽤于保存CPSR的状态,以便异常返回后恢复异常发⽣时的⼯作状态。
arm实验报告最终版
ARM与嵌入式技术实验报告专业班级:10通信工程1班姓名:万洁学号:100103011125实验日期:2013年5月28日指导老师:郑汉麟1、 通过实验掌握ARM 指令的特点和寻址方式;2、 掌握简单的ARM 汇编语言的程序设计;3、 了解集成开发环境 Embest IDE 及其开发软件的应用;、实验环境Embest IDE 应用于嵌入式软件开发的新一代图形化的集成开发环境,它包括一套完备 的面向嵌入式系统的开发和调试工具。
其开发软件 Embest IDE for ARM 是集编辑器、编译 器、调试器、工程管理器( projectma nager )于一体的高度集成的窗口环境,用户可以在Embest IDE 集成开发环境中创建工程、编辑文件、编译、链接、运行,以及调试嵌入式应 用程序。
三、实验步骤1)新建工程:运行Embest IDE 集成开发环境,选择菜单项 File 宀New Workspace ,如图一,系统弹出一个对话框,键入文件名“ wj ”,如图二,点击 0K 按钮。
将创建一个新工程,并同时创 建一个与工程名相同的工作区。
此时在工作区窗口将打开该工作区和工程 .。
(老师提醒:不要放入Bin 文件夹中)■ Emb«t QE Pre 亠 Educat「販]£dii_VwwBuid frtbug D if** Qri+W 诊 Open-"Qrl*O2)建立源文件:点击菜单项 File T New ,如图三,系统弹出一个新的文本编辑窗,输入源文件代码。
编辑完后,保存文件“ wj.s ”后缀,如图三,四。
Hr*Open Workspace.・图一■■ rflJO IUU rl jil rd f rfl,rlClop: h Ho. .end图tut vUrl:3)添加源文件:选择菜单项Project T Add To Project Files,在工程目录下选择刚才建立的源文件.s 后缀文件,如图五,图六,图七。
ARM指令分类及寻址方式
〈immediate〉= immed_8循环右移(2 X rotate_imm)
8bit
最大为0xff
4bit(0—15)
范围:0—30
一个合法的立即数可能有多种编码方法。如0x3f0是一个合法的立即数,它可以 采用下面两种编码方法: Immed_8=0x3f,rotate_imm=0xe 或者 Immed_8=0xfc,rotate_imm=0xf ARM汇编编译器按照下面的规则来生成立即数的编码: 当立即数数值在0—0xff范围内时,令<immediate>=immed_8, rotate_imm=0 其它情况下,汇编编译器选择rotate_imm数值最小的编码方法
立即寻址,操作数不是存储在寄存器或存储器 中,而是包含在指令的操作码中,也就是说,数据 就包含在指令当中,取出指令也就取出了可以立即 程序存储 使用的操作数(这样的数称为立即数)。立即寻址指 MOV R0,#0xFF00 令举例如下: 从代码中获得数据
SUBS
MOV
R0,R0,#1 R0
;R0减1,结果放入R0,并且影响标志位 0xFF00 0x55
• 寻址方式分类——变址寻址
变址寻址就是将基址寄存器的内容与指令中给出的偏 移量相加,形成操作数的有效地址。变址寻址用于访问基 址附近的存储单元,常用于查表、数组操作、功能部件寄 0x4000000C 0xAA 存器访问等。变址寻址指令举例如下: LDR R2,[R3,#0x0C] ;读取R3+0x0C地址上的存储单元 将R3+0x0C作 R3 0x40000000 为地址装载数 ;的内容,放入R2,执行后R3 不变。 R2 0xAA 0x55 据 STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值寄存 LDR
ARM——精选推荐
1、ARM处理器具有8种基本寻址方式:1.寄存器寻址;2.立即寻址;3.寄存器移位寻址;4.寄存器间接寻址;5.基址寻址;6.多寄存器寻址;7.堆栈寻址;8.相对寻址。
2、实时操作系统的特点:实时性、可靠性和灵活性。
从实时系统的应用特点来看实时操作系统可以分为两种:一般实时操作系统和嵌入式实时操作系统。
3、以下代码是初始化外部中断0,用它来唤醒掉电的LPC2114,请填空。
PINSEL0= =0x00000000;PINSEL1= =(PINSEL1&0xFFFFFFFC) | 0x01;//设置I/O口连接,P0.16设置为EINT0EXTMODE= =EXTMODE & 0x0E ; //设置EINT0为电平触发模式EXTPOLAR= =EXTPOLAR & 0x0E; //设置EINT0为低电平触发EXTWAKE= =EXTWAKE& 0x0E; //允许外部中断0唤醒掉电的CPUEXTINT= = 0x0F ; //清除外部中断标志EXTMODE = EXTMODE | 0x01; //设置EINT0为边沿触发模式EXTPOLAR = EXTPOLAR & 0x0E; //初始化EINT0为下降沿中断4、使用NOP伪指令、比较指令、条件跳转指令等完成一个软件延时子程序,延时长度由R0寄存器的数值控制?DelayNOP ;空操作NOPNOPSUBS R0,R0,#1 ;循环次数减一BNE Delay ;如果循环未结束,跳转Delay继续MOV PC,LR ;子程序返回5、初始化串口0程序。
设置为8位数据位,1位停止位,无奇偶校验,入口参数:bps 通讯波特率void UART0Init(uint32 bps){ uint16 Fdiv;PINSEL0=(PINSEL0&(~0x0F))|0x05; //不影响其它管脚连接,设置I/O连接到UART0U0LCR = 0x83; // DLAB = 1,可设置波特率Fdiv = (Fpclk/16) / bps; // 设置波特率U0DLM = Fdiv / 256;U0DLL = Fdiv % 256;U0LCR = 0x03;}6、设计完成主模式I2C的初始化V oid I2C_init(uint32 fi2c) //传入参数为I2C时钟频率{ if(fi2c > 400000)fi2c = 400000;//过滤传入参数,最高400K时钟频率PINSEL0=(PINSEL0 & 0xFFFFFF0F)|0x50;//设置引脚连接模块(PINSEL0)I2SCLH=(Fpclk/fi2c+1)/2; //设置通信波特率(I2SCLH、I2SCLL)I2SCLL=(Fpclk/fi2c)/2;I2CONCLR= 0x2C;I2CONSET=0x40; //使能主I2C(I2CONSET)VICIntSelect=0x00000000;VICV ectCntl0=0x29;VICV ectAddr0=(int)IRQ_I2C; //设置中断向量(VICxxx)VICIntEnable = 0x0200;}7、下列程序语句完成什么操作,并在空格里说明程序中语句的作用?答: ARM状态切换到Thumb状态。
ARM的37个寄存器详解
ARM的37个寄存器详解ARM寄存器ARM共有37个32位物理寄存器,7种⼯作模式下可访问的寄存器见下表,User和System使⽤完全相同的物理寄存器。
2.1 R0~R7所有⼯作模式下,R0-R7都分别指向同⼀个物理寄存器(共8个物理寄存器),它们未被系统⽤作特殊的⽤途。
在中断或异常处理进⾏⼯作模式转换时,由于不同⼯作模式均使⽤相同的物理寄存器,可能造成寄存器中数据的破坏。
2.2 R8~R12在User&System、IRQ、Svc、Abt和Und模式下访问的R8~R12都是同⼀个物理寄存器(共5个物理寄存器);在FIQ模式下,访问的R8_fiq~R12_fiq是另外独⽴的物理寄存器(共5个物理寄存器)。
2.3 R13和R14在User&System、IRQ、FIQ、Svc、Abt和Und访问的R13_~R14都是各⾃模式下独⽴的物理寄存器(共12个物理寄存器)。
R13在ARM指令中常⽤作堆栈指针(SP),但这只是⼀种习惯⽤法,⽤户也可使⽤其他的寄存器作为堆栈指针。
⽽在Thumb指令集中,某些指令强制性的要求使⽤R13作为堆栈指针。
由于处理器的每种⼯作模式均有⾃⼰独⽴的物理寄存器R13,在⽤户应⽤程序的初始化部分,⼀般都要初始化每种模式下的R13,使其指向该⼯作模式的栈空间。
这样,当程序进⼊异常模式时,可以将需要保护的寄存器放⼊R13所指向的堆栈,⽽当程序从异常模式返回时,则从对应的堆栈中恢复,采⽤这种⽅式可以保证异常发⽣后程序的正常执⾏。
R14称为链接寄存器(Link Register),当执⾏⼦程序调⽤指令(BL)时,R14可得到R15(程序计数器PC)的备份。
在每⼀种⼯作模式下,都可⽤R14保存⼦程序的返回地址,当⽤BL或BLX指令调⽤⼦程序时,将PC的当前值复制给R14,执⾏完⼦程序后,⼜将R14的值复制回PC,即可完成⼦程序的调⽤返回。
以上的描述可⽤指令完成。
执⾏以下任意⼀条指令:MOV PC, LRBX LR在⼦程序⼊⼝处使⽤以下指令将R14存⼊堆栈:STMFD SP!,{,LR}对应的,使⽤以下指令可以完成⼦程序返回:LDMFD SP!,{,PC}R14也可作为通⽤寄存器。
ARM32位寄存器操作
除了允许 PC 使用完全的 32 位之外,还有进一步的变更,就是给 PSR 增加了额外的有特权的模式。这些模式用于处理未定义指令和异常终止例外:
未定义指令、异常终止、和超级用户不再共享同一个模式。去掉了在早期 ARM 上存在的对超级用户的那些限制。
在 ARM6 系列(和以后的其他兼容芯片)中通过设置片上某个控制寄存器来确定这些特征的可获得性。可以选择三个处理器配置中的一个:
在 ARM 6(和以后)的 32 位模式下可获得的寄存器有:
User26 SVC26 IRQ26 FIQ26 User SVC IRQ ABT UND FIQ
R0 ----- R0 ----- R0 ----- R0 -- -- R0 ----- R0 ----- R0 ----- R0 ----- R0 ----- R1
32 位程序和数据空间。这个配置把地址空间扩展成 32 位,并介入了对处理器模型的重大变更。在这个配置中你可以选择任何 26 位和 32 位处理器模式(参见下面的处理器模式)。
在配置成 32 位程序和数据空间的时候,ARM6 和 ARM7 系列支持十个有所重叠的处理器操作模式:
用户模式: 正常的程序执行状态;
--------- R15 (PC / PSR) --------- --------------------- R15 (PC) ---------------------
----------------------- CPSR -----------------------
当在一个 32 位程序和数据空间配置下的时候,所有例外(包括未定义指令和软件中断)把处理器返回到一个 32 位模式,所以必须修改操作系统来处理它们。
第3章_ARM指令系统
23
3.2 ARM指令的 寻址方式
堆栈寻址和多寄存器寻址有很多相似之处,可以说 堆栈寻址是多寄存器寻址的特例,堆栈操作的指令
也有一一对应的多寄存器访问指令,如下表所示。
递增 满 先增 增值 后增 先减 减值 后减 LDMDA LDMFA STMIB STMFA STMIA LDMIA 空 满 递减 空 LDMIB LDMED
、后索引偏移和自动索引之分。
零偏移----实际上就是寄存器间接寻址 前索引偏移: LDR R2, [R3, #0X12] ; [(R3)+ #0X12]送R2,R3值不变 后索引偏移: STR R2, [R3], #0X12; R2送[R3],R3+0X12送R3 自动索引: LDR R2, [R3,#0X12]!; [(R3)+ #0X12]送R2,R3+0X12送R3
存储器 R2 0X00009000 0X00009000
0X20
R1
0X20
13
3.2 ARM指令的寻址方式
(6)基址变址寻址
基址变址寻址是指操作数的有效地址是由寄存器的内容加
上指令中给出的变址来确定的;
操作数所在存储单元的基地址由寄存器给出,这个寄存器 就叫做基址寄存器。 变址既可以以立即数形式给出,也可以由寄存器来提供。
4
3.2 ARM指令的寻址方式
所谓寻址方式就是人们根据操作数所在位置、数据 类型及其数据结构的不同,人为规定的根据指令中
给出的信息找出操作数有效地址的方式。
根据操作数的种类不同,ARM寻址方式可以分为
数据操作数寻址方式和地址操作数寻址方式两大类
,其中,数据操作数又有立即数、寄存器操作数、 存储器操作数和I/O操作数之分。 操作的对象不同,所用的寻址方式也不同。
arm调试内核寄存器的方法
arm调试内核寄存器的方法使用ARM调试内核寄存器的方法引言:在软件开发和调试过程中,经常需要查看和修改CPU的寄存器值。
而对于ARM架构的处理器,了解如何调试内核寄存器值是非常重要的。
本文将介绍一些常用的方法和工具,帮助开发者在ARM平台上进行内核寄存器的调试。
一、使用GDB调试器GDB是一款功能强大的开源调试器,可以用于调试多种编程语言和平台。
在ARM架构上,可以使用GDB调试器来查看和修改内核寄存器的值。
1. 准备工作需要安装GDB工具链,并将其添加到系统的环境变量中。
然后,在编译内核时,需要在配置文件中启用GDB调试支持选项,以生成可调试的内核映像。
2. 连接调试器将目标设备与主机通过调试接口(如JTAG、SWD)连接起来。
然后,在主机上运行GDB,并使用以下命令连接到目标设备:```$ gdb <kernel_image>```3. 设置断点在GDB中,可以使用`break`命令设置断点。
例如,要在内核函数`foo`的入口处设置断点,可以使用以下命令:```(gdb) break foo```4. 运行程序使用`run`命令启动目标设备上的程序,并让其执行到断点处。
当程序停止时,可以使用`info registers`命令查看所有寄存器的值。
5. 查看寄存器值使用`info registers`命令可以列出所有寄存器的值。
例如,要查看R0寄存器的值,可以使用以下命令:```(gdb) info registers r0```6. 修改寄存器值使用`set`命令可以修改寄存器的值。
例如,要将R0寄存器的值修改为0x1234,可以使用以下命令:```(gdb) set $r0 = 0x1234```二、使用JTAG调试器JTAG调试器是一种常用的硬件调试工具,也可以用于调试ARM架构的处理器。
它可以提供更低层次的访问权限,可以直接读写寄存器的值。
1. 准备工作需要将目标设备与JTAG调试器连接起来,并确保JTAG调试器的驱动程序已正确安装。
ARM指令的寻址方式
寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作 数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地 址指针。
ADD LDR STR
R3,R2,[R1] R0,[R1] R0,[R1]
; R3R2+[R1] ;R0[R1] ;[R1]R0
6
ARM指令的寻址方式
基址变址寻址
ARM指令的寻址方式
堆栈寻址
堆栈是一种数据结构,操作顺序分为“先进后出”(FILO)和“后进 先出”(LIFO),使用一个成为堆栈指针的专用寄存器指示当前的操作 位置,堆栈指针总是指向栈顶。
根据增长方向,堆栈可分为: 向上生长:即向高地址方向生长,称为递增堆栈(Ascending Stack)。 向下生长:即向低地址方向生长,称为递减堆栈(Descending Stack)。 根据栈指针的指向位置,堆栈可分为: 满堆栈:堆栈指针指向最后压入堆栈的有效数据项 空堆栈:堆栈指针指向下一个数据项放入的空位置
12
寄存器寻址
寄存器中的数值作为操作数,指令中地址码字段给出的是 寄存器编号,指令执行时直接取出寄存器值操作。 ADD R0,R1,R2 ; R0R1+R2
该指令的执行效果是将寄存器R1和R2的内容相加,其结 果存放在R0寄存器中。 MOV R1,R2 ; R1R2 该指令的执行效果是将寄存器R2的内容传送到寄存器R1中。
可以采取的移位操作如有:
LSL:逻辑左移(Logical Shift Left)。寄存器中字的低端空出的位补0。
0
LSR:逻辑右移(Logical Shift Right)。寄存器中字的高端空出的位补0。04ARM指来自的寻址方式寄存器移位寻址
ASR:算术右移(Arithmetic Shift Right)。算术移位的对象是 带符号数,若源操作数为正数,则字的高端空出的位补0。若源操 作数为负数,则字的高端空出的位补1。
ARM基本寻址方式
ARM基本寻址方式所谓寻址方式,指的是处理器根据指令中给出的内存地址信息,找出操作数的物理地址,实现对操作数的访问。
根据指令中给出的操作数的不同形式,ARM 指令系统支持的常见寻址方式有:立即寻址、寄存器寻址、寄存器移位寻址、寄存器间接寻址、基址变址寻址、多寄存器寻址、相对寻址及堆栈寻址。
1.立即寻址立即寻址又称为立即数寻址,是一种特殊的寻址方式,指令中直接给出操作数,只要取出指令也就取到了操作数,这个操作数称为立即数。
例如,MOV R0,#2 ;R0←2ADD R0,R0,#100 ;R0←R0+100以上两条指令中,以“#”为前缀的操作数即为立即数。
对于以十六进制数表示的立即数,要求在“#”后加上“0X'’或“&”;对于以二进制数表示的立即数,要求在“#”后加上“0b”;对于以十进制数表示的立即数,要求在“#”后加上“Od”或缺省。
2.寄存器寻址寄存器寻址指的是将寄存器中存放的数值作为操作数,这是各类微处理器常采用的一种执行效率较高的寻址方式。
例如,ADD R0,R1,R2 ;R0←R1+R2此指令中,两个输入操作数存放在寄存器R1和R2中,该指令将R1和R2中的数值相加,结果存放在寄存器R0中。
3.寄存器移位寻址寄存器移位寻址是ARM指令系统特有的寻址方式。
寻址的操作数由寄存器中的数值进行相应移位得到,移位的方式在指令中以助记符形式给出。
关于移位操作将在5.3.3节中详细介绍。
移位的位数可由立即数或寄存器寻址方式表示。
例如,ADD R0,R1,R2,LSL#1该指令表示将R2中的值向左移1位,然后与R1中的值相加,结果存人R0中。
MOV Ri,R0,LSR R2该指令表示将R0中的值向右移位,移位的次数由R2中的值决定,移位后的结果存人R1中。
4.寄存器间接寻址寄存器间接寻址指的是将寄存器中存放的数值作为操作数的有效地址,而操作数存放在内存中。
用于寄存器间接寻址的寄存器必须用“[]”括起来。
arm指令的基本结构
arm指令的基本结构ARM指令的基本结构包括指令操作码、寻址方式和操作数。
下面将对ARM指令的基本结构进行详细介绍。
1. 指令操作码:指令操作码是ARM指令的最重要部分,用于表示指令的功能和操作类型。
ARM指令的操作码一般分为两个部分,前4位表示指令的类型,后28位表示具体的操作种类。
指令操作码采用无符号二进制表示。
2. 寻址方式:寻址方式指的是指令中的地址定位方式,用于确定操作数的来源或目的地址。
ARM指令的寻址方式主要有以下几种:- 立即寻址(Immediate addressing):操作数直接出现在指令中,例如`MOV R1, #10` 表示将立即数10移动到寄存器R1。
- 寄存器寻址(Register addressing):操作数的地址存放在寄存器中,例如`ADD R2, R1, R3` 表示将寄存器R1和R3中的值相加,并将结果存放在寄存器R2中。
- 寄存器间接寻址(Register indirect addressing):操作数地址存放在寄存器中,但寄存器的内容是另一个地址。
例如`LDR R4, [R5]` 表示将存放在寄存器R5地址位置的内容加载到寄存器R4中。
- 基址变址寻址(Base-index addressing):指令的地址是由基址寄存器和索引寄存器相加得到的,例如`LDR R6, [R5, R1]` 表示将寄存器R5和R1中的内容相加得到地址,并将该地址的内容加载到寄存器R6中。
- 相对寻址(Relative addressing):指令中的地址是当前指令地址的相对偏移量。
例如`B label1` 表示无条件跳转到标签label1处,label1是相对于当前指令地址的相对偏移量。
- 堆栈寻址(Stack addressing):指令通过堆栈指针寄存器来操作堆栈的内容。
例如`PUSH {R1, R2}` 表示将寄存器R1和R2的内容压入堆栈。
3. 操作数:操作数指的是指令中要操作的数据,可以是寄存器、内存、立即数等。
详解ARM处理器中的37个寄存器
详解ARM处理器中的37个寄存器ARM处理器共有37个寄存器。
其中包括:31个通用寄存器,包括程序计数器(PC)在内。
这些寄存器都是32位寄存器。
6个状态寄存器。
这些寄存器都是32位寄存器。
ARM处理器共有7种不同的处理器模式,每一种模式中都有一组相应的寄存器组。
在任何时刻,可见的寄存器包括15个通用寄存器(R0-R14),一个或两个状态寄存器及程序计数器(PC)。
在所有的寄存器中,有些是各模式公用一个物理寄存器,有一些寄存器各模式拥有自己独立的物理寄存器。
通用寄存器:通用寄存器分为以下三类:备份寄存器、未备份寄存器、程序计数器PC未备份寄存器:未备份寄存器包括R0-R7。
对于每一个未备份寄存器来说,所有处理器模式下都是使用同一个物理寄存器。
未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的场合都可以使用未备份寄存器。
备份寄存器:对于R8-R12备份寄存器来说,每个寄存器对应两个不同的物理寄存器。
系统为将备份寄存器用于任何的特殊用途,但是当中断处理非常简单,仅仅使用R8-R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理非常迅速。
对于R13,R14备份寄存器来说,每个寄存器对应六个不同的物理寄存器,其中的一个是系统模式和用户模式共用的;另外的五个对应于其他的五种处理器模式。
采用下面的记号来区分各个物理寄存器:R13_其中MODE可以是下面几种模式之一:usr,svc,abt,und,irq,fiq程序计数器PC可以作为一般的通用寄存器使用,但有一些指令在使用R15时有一些限制。
由于ARM采用了流水线处理器机制,当正确读取了PC的值时,该值为当前指令地址值加上8个字节。
也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址。
由于ARM指令是字对齐的,PC值的第0位和第一位总为0。
需要注意的是,当使用str/stm保存R15时,保存的可能是当前指令地址值加8个字节,也可能保存的是当前指令地址值加12个字节。
ARM的8种寻址方式详细总结
二、ARM7的8种寻址方式1.3级流水线是ARM7TDMI的主要特征之一,而ARM7之后的处理器,比如ARM9的5级流水线等等,流水线越多,就越快。
他在执行程序时,要分3个步骤。
第一步是要把指令从程序存储器中取出来,取指是在处理器内核和程序存储器之间进行的,取指时间的长短和程序存储器的位置远近,和速度(用的静态还是动态,Cachae,Flash等)这些有关。
第二部就是把读到的内核的指令进行译码,也就是把二进制指令转变为电路的动作,打开哪些门电路,关闭哪些门电路。
第三步就是把门电路的动作送到制定的目标地址。
2.寻址方式寻址就是找与数据相关联的地址,ARM寻址复杂,操作数为2个或以上。
寄存器寻址:此种寻址就是寄存器内容就是操作数,寄存器本身就是操作数地址,在ARM 任何一个模式中都有R0—R14以及PC和CSSR可以寻址。
如下举例:注意在ARM指令中第二条,应为ARM的寄存器大部分都可以作为ADD,ADD R4,R4,R5中第一个R4就相当于存了51系列本来用ADD存结果。
立即寻址:操作数不是存储在寄存器或存储器中,而是包含在指令的操作码,取出指令就取出了操作码。
如图:注意:十进制立即数表达举例:#0005、#0376、#01234十六进制立即数表达举例:#0x0005、#0x0FFF、#0x072寄存器移位寻址:寄存器移位寻址是ARM指令独有的寻址方式,51系列单片机没有,在这种方式中,对一个寄存器的内容进行移位(左右移位),移位的位数必须写在表达式中。
如图:ARM指令集有5种移位操作:(1)LSL逻辑左移向左移位,左侧移出的位丢失,右端空出位补0。
注意最后一个左移出的位放在状态寄存器的C位CPSR【29】中。
这种相当于寄存器的乘法。
移出n位相当于乘以2的n次幂。
(2)LSR逻辑右移向右移位,右侧移出的位丢失,左端空出位补0。
注意最后一个右移出的位放在状态寄存器的C位CPSR【29】中。
这种相当于寄存器的除法。
arm汇编指令 组成结构
arm汇编指令组成结构ARM汇编指令是一种低级程序设计语言,用于编写针对ARM架构的机器码指令。
ARM汇编指令由一系列操作码(opcode)和操作数(operand)组成,用于执行特定的计算和操作。
ARM汇编指令的基本组成结构如下:1. 操作码(Opcode):操作码是指令的核心部分,用于指定要执行的操作类型。
ARM指令集包含多种操作码,如数据处理、分支、加载/存储等。
2. 操作数(Operand):操作数是指令的操作对象,包括寄存器、立即数和内存地址等。
操作数用于指定要操作的数据和存储位置。
3. 寻址模式(Addressing Mode):寻址模式用于确定操作数的存储位置。
ARM架构支持多种寻址模式,如寄存器寻址、立即数寻址、基址寻址、间接寻址等。
4. 条件码(Condition Code):条件码用于指定指令的执行条件。
ARM指令集中的大多数指令都可以根据条件码来选择是否执行。
5. 注释(Comment):注释是对指令的解释和说明,用于提高代码的可读性和可维护性。
注释在汇编代码中以分号(;)开头,可以在指令后面或单独一行进行编写。
下面是一个示例,展示了一条ARM汇编指令的组成结构:```ADD r0, r1, r2 ; 将寄存器r1和r2中的值相加,结果存入r0寄存器```- 操作码:ADD,表示进行加法运算。
- 操作数:r0、r1和r2,分别表示寄存器的编号。
- 寻址模式:无,因为操作数直接使用寄存器。
- 条件码:无,表示无条件执行。
- 注释:"; 将寄存器r1和r2中的值相加,结果存入r0寄存器",用于解释指令的作用。
需要注意的是,ARM汇编指令的具体语法和操作码取决于所使用的ARM架构版本和指令集。
不同的ARM架构版本可能会有不同的指令集和指令格式。
因此,在编写ARM汇编代码时,需要参考相应的ARM架构手册或文档以获取准确的指令信息。
实验1 ARM 指令实验
2012-5-17
深圳市优龙科技有限公司
数据处理指令 数据处理指令可分为数据传送指令、算术逻 辑运算指令和比较指令等。 数据传送指令用于在寄存器和存储器之间进 行数据的双向传输。 算术逻辑运算指令完成常用的算术与逻辑的 运算,该类指令不但将运算结果保存在目的寄 存器中,同时更新CPSR中的相应条件标志位。 比较指令不保存运算结果,只更新CPSR中 相应的条件标志位。
加载/存储指令 加载 存储指令 ARM微处理器支持加载/存储指令用于在寄存器和存 储器之间传送数据,加载指令用于将存储器中的数据传 送到寄存器,存储指令则完成相反的操作。 常用的加载存储指令如下: ------ LDR 字数据加载指令 ------LDRB 字节数据加载指令 ------LDRH 半字数据加载指令 ------STR 字数据存储指令 ------STRB 字节数据存储指令 ------STRH 半字数据存储指令 在本实验中主要用到了LDR和STR指令,下面将介 绍这两条指令的用法:
2012-5-17 深圳市优龙科技有限公司
上面是关于该实验涉及到的部分函数,完整的 代码请看光盘目录的exp文件夹下相应实验的工程 目录。 1.7 练习题 编写一个汇编代码,让LED灯D13不停的闪烁, 同时可以通过调节延迟时间来控制D13闪烁的频率。
2012-5-17
深圳市优龙科技有限公司
2012-5-17 深圳市优龙科技有限公司
1.6 ARM汇编程序编程实例 汇编程序编程实例 1.参考汇编代码程序 参考汇编代码程序,主要实现LED灯D14的不停 闪烁的功能,主要代码如下: ;汇编指令实验 ;定义端口E寄存器预定义 rGPFCON EQU 0x56000050 rGPFDAT EQU 0x56000054 rGPFUP EQU 0x56000058 AREA Init,CODE,READONLY ;该伪指令 定义了一个代码段,段名为Init,属性只读 ENTRY ;程序的入口点标识 ResetEntry
嵌入式Linux系统开发教程参考答案
嵌入式Linux系统开发教程参考答案参考答案第一章p20一、填空题。
1、嵌入式系统主要融合了、和,它是将计算机直接嵌入到应用系统中,利用计算机的高速处理能力以实现某些特定的功能。
2、目前国B、嵌入式控制器C、单片机D、集成芯片2、20世纪90年代以后,随着系统应用对实时性要求的提高,系统软件规模不断上升,实时核逐渐发展为,并作为一种软件平台逐步成为目前国际嵌入式系统的主流。
(D)A、分时多任务操作系统B、多任务操作系统C、实时操作系统D、实时多任务操作系统3、由于其高可靠性,在美国的火星表面登陆的火星探测器上也使用的嵌入式操作系统是。
(B)A、PalmB、VxWorksC、LinuxD、WinCE4、嵌入式系统设计过程中一般需要考虑的因素不包括:()A、性能B、功耗C、价格D、大小5、在嵌入式系统中比较流行的主流程序有:()嵌入式linux系统开发教程A、AngelB、BlobC、Red BootD、U-BootA DB ? A三、叙述题1、举例说明身边常用的嵌入式系统。
• 2 •生活中最常见的嵌入式系统恐怕要数智能手机了,包括Symbian、Windows Mobile、Android等手机嵌入式系统。
还有,如路由器也是一个典型的嵌入式系统。
2、如何理解嵌入式系统,谈谈自己的理解。
嵌入式系统是指:以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
他具有如下特点:1、嵌入式系统是面向产品、面向用户、面向应用的。
2、嵌入式系统是一个技术密集、集成度高、需要不断创新的集成系统。
3、嵌入式系统必须根据应用场合对软硬件进行必要的裁剪已实现需要的功能。
3、简述嵌入式系统的开发方法有哪几种。
目前,嵌入式系统的开发有模拟开发调试、嵌入式在线仿真和远程调试等几种方法。
4、结合当前嵌入式系统的发展,想象一下嵌入式系统的应用前景。
嵌入式系统技术有着非常广泛的应用前景,其领域包括:工业控制领域、信息家电领域、机器人领域、POS网络及电子商务领域、家庭智能管理系统、交通管理领域、环境工程与自然领域等。
微处理器系统结构与嵌入式系统设计(第2版)第8章答案
微处理器系统结构与嵌⼊式系统设计(第2版)第8章答案8.1 ARM指令有哪⼏种寻址⽅式?试分别说明。
ARM指令系统⽀持的常见寻址⽅式有:寄存器寻址:1. 操作数存放在寄存器中;2.指令地址码字段给出寄存器编号(名);3.指令执⾏时直接取出寄存器值来操作;⽴即寻址:1. 操作数包含在指令当中;2. 指令地址码部分就是数据本⾝;3. 取指时就取出了可⽴即使⽤的操作数;寄存器间接寻址:寄存器移位寻址1. 操作数存放在寄存器中;2.指令地址码字段给出寄存器编号(名)及移位表达式;3.指令执⾏时取出寄存器值并移位,再将结果作为源操作数;寄存器间接寻址:1. 操作数存放在内存单元中;2.指令地址码字段给出 [寄存器编号(名)];3.指令执⾏时根据寄存器值(指针)找到相应的存储单元;基址变址寻址1. 操作数存放在内存单元中;2.指令地址码字段给出 [寄存器编号(名)]和偏移量;3.指令执⾏时将基址寄存器的内容与偏移量(<4K)相加/减,形成操作数的有效地址。
4. 常⽤于查表、数组操作、功能部件寄存器访问等。
多寄存器寻址/块复制寻址:1. 操作数存放在内存单元中;2.指令地址码字段给出 {寄存器编号(名)列表};3.编号⾼的寄存器总是对应内存中的⾼地址单元;4. 可完成存储块和16个寄存器或其⼦集之间的数据传送。
堆栈寻址:1. 操作数存放在内存栈顶单元中;2.指令地址码字段固定使⽤栈顶指针SP;3.指令执⾏时同多寄存器/块寻址,可完成多个数据的⼊栈和出栈;相对寻址:1. 操作数为指令存放地址;2.指令地址码字段为地址偏移量;3.指令执⾏时同基址寻址,由PC提供基地址根据偏移量完成跳转;8.2 指出下列指令操作数的寻址⽅式。
1)MOVE R1,R2 寄存器直接寻址2)SUBS R0,R0, #2 ⽴即寻址3)SWP R1,R1,[R2] 寄存器间接寻址4)STR R1,[R0,#-4]! 基址变址寻址5)LDMFD SP! , {R1~R4,LR} 多寄存器直接寻址6)ANDS R0,R0,R1,LSL R2 寄存器移位寻址7)STMIA R1!, {R2~R5,R8} 多寄存器直接寻址8)BL AGAIN 相对寻址8.3 ARM指令中的第⼆操作数有哪⼏种表⽰形式?举例说明。
ARM汇编指令实验
ARM 汇编指令实验一一. 实验目的1.初步学会使用μVision IDE for ARM 开发环境及ARM 软件模拟器;2.通过实验掌握简单 ARM 汇编指令的使用方法。
二. 实验设备1.硬件:PC 机一台;2.软件:μVision IDE for ARM 集成开发环境,Windows 98/2000/NT/XP。
三. 实验内容1.熟悉开发环境的使用并使用 ldr/str,mov 等指令访问寄存器或存储单元;2.使用 add/sub/lsl/lsr/and/orr 等指令,完成基本算术/逻辑运算。
四. 实验原理ARM 处理器共有37 个寄存器:31 个通用寄存器,包括程序计数器(PC)。
这些寄存器都是32 位的;6 个状态寄存器。
这些寄存器也是32 位的,但是只是使用了其中的12 位。
1. ARM 通用寄存器通用寄存器(R0-R15)可分为三类:1)不分组寄存器 R0~R7不分组寄存器R0~R7 在所有处理器模式下,它们每一个都访问一样的32 位寄存器。
它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。
2)分组寄存器 R8~R14分组寄存器R8~R14 对应的物理寄存器取决于当前的处理器模式。
若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字。
寄存器R8~R12 各有两组物理寄存器:一组为FIQ 模式,另一组为除了FIQ 以外的所有模式。
寄存器R8~R12 没有任何指定的特殊用途,只是在作快速中断处理时使用。
寄存器R13,R14 各对应6 个分组的物理寄存器,1 个用于用户模式和系统模式,其它5 个分别用于5 种异常模式。
寄存器R13 通常用做堆栈指针,称为SP;寄存器R14 用作子程序链接寄存器,也称为LR。
3)程序计数器 PC寄存器R15 用做程序计数器(PC)。
在本实验中,ARM 核工作在用户模式,R0~R15 可用。
2. 存储器格式ARM 体系结构将存储器看作是从零地址开始的字节的线性组合。
ARM指令寻址方式
Before) :操作完成前地址增
After) :操作完成后地址减
DA(Decrement
DB(Decrement
Before) :操作完成前地址减
22
7)块拷贝寻址/多寄存器寻址
LDMIA R1,{R0,R2,R5} ; R0[R1]
; R2[R1+4] ; R5[R1+8] 该指令的后缀IA表示在每次执行完加载/存储 操作后,R1按字长度增加,指令可将连续存 储单元的值送到R0,R2,R5寄存器中
STMDA R9!, {R0,R1,R5}
STMDB R9!, {R0,R1,R5}
26
8)相对寻址
相对寻址: 以程序计数器PC的当前值为基地址,指令 中的地址标号作为偏移量,两者相加得操作数的有效 地址。以下程序段完成子程序的调用和返回,跳转指 令BL采用了相对寻址方式:
BL NEXT …… …… ;跳转到子程序NEXT处执行 ;返回到此 ;当前PC
通过阅读报刊,我们能增长见识,扩大自己
有许多书籍还能培养我们的道德情操,
High
Base, High 2 1 Low
SP
空递增堆栈
空递减堆栈
20
6)堆栈寻址
例
ARM
STMFD LDMFD
SP! {r0,r1,r3-r5} ; r0-r1,r3-r5入栈 SP! {r0,r1,r3-r5} ; r0-r1,r3-r5出栈
Thumb
PUSH POP
{r0,r1,r3-r5} ; r0-r1,r3-r5入栈 {r0,r1,r3-r5} ; r0-r1,r3-r5出栈
6
2)寄存器寻址
寄存器寻址:操作数在寄存器中,指令中的 地址码为寄存器编号,寄存器的内容即为操 作数。执行效率较高的寻址方式。例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LDR R1,=0x20026 SWI 0x123456 END ;标记程序结束
实验结论 实验总结及心得体会
实验思考题
1.运行测试下面 Load/Store 指令, 每条语句要求写注释说明寻址方式。 有错误的地方请改正并 说明原因. ldmia r8,{r0,r5,r9} stmdb stmfd ldmfd r1!,{r3-r6,r11,r12} r13!,{r0,r4-r7,lr} r13!,{r0,r4-r7,pc}
2.分析下列堆栈操作指令 ,写出对应的块操作指令. STMFD R0!,{R5-R6} ... LDMFD R0!,{R5-R6}
实验步骤 实验参考程序
AREA Example1,CODE,READONLY ; 声明代码段 Ex0,r4-r7,lr} ldmfd r13!,{r0,r4-r7,pc} STOP MOV R0,#0x18 ; 标识程序入口 ; 声明 32 位 ARM 指令
注意寄存器的编号连续和不连续的情况
寻址方式分类— — 堆栈寻址 堆栈是一个按特定顺序进行存取的存储区,操作顺序为 “ 后进先出 ” 。堆栈寻址是隐含的, 它使用一个专门的寄存器(堆栈指针) 指向一块存储区域( 堆栈),指针所指向的存储单元即是 堆栈的栈顶。存储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈 向下生长:向低地址方向生长,称为递减堆栈 寻址方式分类— — 块拷贝寻址 块拷贝是将寄存器内容复制到寄存器的地址所指示的存储器中, 需要注意的是在存储第一个 值之后存储器地址是增加还是减少. 增值类型如下: IA---- 每次传送后, 地址加 4 IB---- 每次传送前 ,地址加 4 DA— — 每次传送后 ,地址减 4 DB— — 每次传送前 , 地址减 4
ARM 的多寄存器寻址
实验原理
寻址方式分类— — 多寄存器寻址 多寄存器寻址一次可传送几个寄存器值,允许一条指令传送 16 个寄存器的任何子集或所有 寄存器。多寄存器寻址指令举例如下: LDMIA R1!,{R2-R4,R6} ;将 R1 指向的单元中的数据读出到 ;R2~R4 、R6 中(R1 自动加 1) STMIA R0!,{R2-R4,R6} ;将寄存器 R2~R4 、R6 的值保 ;存到 R0 指向的存储 ; 单元中 ;(R0 自动加 1)