《第8章ARM汇编指令.ppt》由会员分享,可在线阅读,更多相关《第8章ARM汇编指令.ppt(59页珍藏版)》请在三一文库上搜索。
1、第8章 ARM汇编指令,ARM采用三地址指令格式:,ARM汇编指令书写格式, S ,其中号内的项是必须的,号内的项可选。,opcode:指令助记符; cond:执行条件; S:是否影响CPSR寄存器的值; Rd:目标寄存器; Rn:第1个操作数的寄存器; operand2:第2个操作数(#immed_8r、Rm、Rm,shift);,2019-4-17,2/95,ARM指令中的第2操作数,8位常数循环右移10位,常数#immed_8r由一个8位常数通过循环右移偶数位得到:,Rm,shift由Rm移位得到。移位不消耗额外时间,且Rm值不变。,ALU,桶形移位器,Rd,结果N,预处理,未预处理,R
2、m,Rn,LSL,0,LSR,ASR,ROR,RRX,2019-4-17,桶形移位器的操作,ADD R1,R1,R1,LSL #3 ;R1=R1+R1R3,2019-4-17,4/95,ARM机器指令编码格式,所有的ARM指令都可以条件执行,而Thumb指令只有B(跳转)指令具有条件执行 功能。 如果指令不标明条件代码,将默认为无条件(AL)执行,ARM指令条件码cond,6/95,ARM处理器寻址方式,寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。 ARM处理器具有几种基本寻址方式: 1.寄存器寻址 2.立即寻址 3.寄存器间接寻址 移位寻址、间接寻址、基址变址寻址、多
3、寄存器寻址(块寻址) 4.堆栈寻址 5.相对寻址,7/95,0xAA,0x55,R2,R1,寄存器寻址,1. 操作数存放在寄存器中; 2.指令地址码字段给出寄存器编号(名); 3.指令执行时直接取出寄存器值来操作; MOV R1, R2 ; R1 = R2 SUB R0, R1, R2 ; R0 = R1-R2,0xAA,2019-4-17,8/95,1. 操作数包含在指令当中; 2. 指令地址码部分就是数据本身; 3. 取指时就取出了可立即使用的操作数; MOV R0,#0xFF00 ; R0 = #0xFF00 SUBS R0,R0,#1 ; R0 =R0-1,0x55,R0,MOV R0
4、,#0xFF00,立即寻址,0xFF00,从代码中获得数据,10进制数:#21,#0d57 2进制数: #0b01100 16进制数:#0x3a001,影响标志位,寄存器寻址,2019-4-17,9/95,1. 操作数存放在寄存器中; 2.指令地址码字段给出寄存器编号(名)及移位表达式; 3.指令执行时取出寄存器值并移位,再将结果作为源操作数; MOV R0, R2, LSL #3 ; R0=R28 ANDS R1, R1, R2, LSL R3 ; R1 = R1 and (R2R3),0x55,R0,R2,0x01,寄存器移位寻址,0x08,0x08,逻辑左移3位,寄存器寻址,影响标志位,
5、LSL、LSR ASR ROR、RRX,寄存器间接寻址,1. 操作数存放在内存单元中; 2.指令地址码字段给出 寄存器编号(名); 3.指令执行时根据寄存器值(指针)找到相应的存储单元; LDR R0,R1 ; R0= R1 SWP R1,R1,R2 ; R1 R2,0x55,R0,R1,0x40000000,0xAA,0x40000000,0xAA,内存单元,2019-4-17,11/95,基址变址寻址,1. 操作数存放在内存单元中; 2.指令地址码字段给出 寄存器编号(名)和偏移量; 3.指令执行时将基址寄存器的内容与偏移量(4K)相加/减,形成操作数的有效地址。 4. 常用于查表、数组操
6、作、功能部件寄存器访问等。 LDR R2,R3,#0x0C ;R2=R3+0x0C LDR R1,R0,#-4! ;R1=R0-4, R0=R0-4 LDR R0,R1 ,#4 ;R0=R1,R1R14 LDR R0,R1,R2 ;R0=R1+R2,前索引,后索引,0xAA,内存单元,12/95,多寄存器寻址/块复制寻址,1. 操作数存放在内存单元中; 2.指令地址码字段给出 寄存器编号(名)列表; 3.编号高的寄存器总是对应内存中的高地址单元; 4. 可完成存储块和16个寄存器或其子集之间的数据传送。 LDMIA R1!,R2-R4,R6 ; R2= R1 , R3= R1+4 ; R4=
7、R1+8 , R6= R1+C, R1=R1+10 STMDB R1,R2-R4,R6 ; R1-4= R6 , R1-8=R4 ; R1-C =R3, R1-10=R2,0x40000000,R1,R2,0x?,0x01,0x40000000,0x?,R3,R4,0x?,R6,0x?,0x02,0x03,0x04,0x40000004,0x40000008,0x4000000C,0x40000010,内存单元,Increase After,Decrease Before,堆 栈 寻 址,1. 操作数存放在内存栈顶单元中; 2.指令地址码字段固定使用栈顶指针SP; 3.指令执行时同多寄存器/块
8、寻址,可完成多个数据的入栈和出栈; LDMEA SP!,R2-R4,R6 ; R2= SP , R3= SP+4 ; R4= SP+8 , R6= SP+C,SP=SP+10 STMFD SP!,R2-R4,R6 ; SP-4= R6 , SP-8=R4 ; SP-C =R3, SP-10=R2, SP=SP-10,0x40000000,SP,R2,0x?,0x01,0x40000000,0x?,R3,R4,0x?,R6,0x?,0x02,0x03,0x04,0x40000004,0x40000008,0x4000000C,0x40000010,堆栈单元,Empty Ascending,Ful
9、l Desending,多寄存器/块寻址,ARM支持的四种堆栈类型,满递增(FA):堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。 空递增(EA) :堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。 满递减(FD) :堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。 空递减(ED) :堆栈向下增长,堆栈指针向堆栈下的第一个空位置。,2019-4-17,15/95,堆栈的递增与递减,递增堆栈:向高地址方向生长,即向上生长 递减堆栈:向低地址方向生长,即向下生长,0x12345678,0x12345678,2019-4-17,16/95,堆栈的空与满,空堆栈:堆栈指针SP指向下一个待压入
10、数据的空位置 满堆栈:堆栈指针SP指向最后压入的堆栈的有效数据项,0x12345678,0x12345678,0x12345678,2019-4-17,17/95,相 对 寻 址,1. 操作数为指令存放地址; 2.指令地址码字段为地址偏移量; 3.指令执行时同基址寻址,由PC提供基地址根据偏移量完成跳转; BL SUBR1 ;调用SUBR1子程序 BEQ LOOP ;条件跳转到LOOP处 . LOOP MOV R6,#1,2019-4-17,18/95,带条件码的指令,C代码: If(a b) a+; Else b+;,对应的汇编代码: CMP R0,R1 ;比较R0(a)与R1(b) ADD
11、HI R0,R0,#1 ;若R0R1,则R0=R0+1 ADDLS R1,R1,#1 ;若R0R1,则R1=R1+1,2019-4-17,19/95,ARM指令集,数据处理指令 转移指令 程序状态寄存器访问指令 加载/存储指令,数据处理指令的编码格式,指令条件码,I=1:立即数; I=0:寄存器移位,第二操作数,Rd目标寄存器,Rn第一操作数寄存器,S=1:根据结果设置CPSR中的条件码 S=0:不设置CPSR中的条件码,21/95,乘法指令的编码格式,Rm被乘数寄存器,Rn: MLA指令相加的寄存器 RdLo: 64位乘法指令目标寄 存器的低32位,Rd: 目标寄存器 RdHi: 64位乘法
12、指令目标寄存器的高32位,Rs为乘数寄存器,2019-4-17,22/95,单数据存取指令的编码格式,字和无符号字节存取指令LDR/STR,P表示前/后变址,U=1:加 U=0: 减,B=0:字 B=1:字节,W=1:回写基址寄存器,对应指令中的“!” W=0:不回写,存储单元寻址方式,L=1:加载 L=0:存储,Rd为源/目标寄存器,Rn为基址寄存器,S=1:有符号数, S=0: 无符号数,H=1:半字,H=0:字节,存储单元寻址方式,半字和有符号字节存取指令LDR/STR,I=1立即数 I=0寄存器移位,23/95,数据块(多寄存器)存取指令的编码格式,数据块(多寄存器)存取指令编码LDM
13、/STM,S对应于指令中的”符号:在恢复PC时也同时恢复SPSR,P表示前/后变址,U表示加/减,W表示回写(!),寄存器列表,Rn为基址寄存器,L=1:加载 L=0:存储,2019-4-17,24/95,寄存器/存储器交换指令的编码格式,B用于区别无符号字节(B为1)或字(B为0),Rm源寄存器,Rd目标寄存器,Rn为基址寄存器,SWP R1,R1,R0 ; R1R0 SWPB R1,R2,R0 ;将R0指向的存储单元低字节数据读 ;取到R1中(高24位清零),并将R2的 ;内容写入到该内存单元中的最低字节,2019-4-17,25/95,分支指令的编码格式,分支指令B/BL指令编码格式,L
14、=0:B指令,跳转 L=1: BL指令,保存PC并跳转,可返回,24位有符号立即数(偏移量),分支指令BX指令编码格式,Rm目标地址寄存器,该寄存器装载31位跳转地址,最低位为1时切换到Thumb状态,2019-4-17,26/95,状态寄存器访问指令的编码格式,指定传送的区域,可以为以下字母(必须小写)的一个或者组合: c 控制域屏蔽字节(psr70) x 扩展域屏蔽字节(psr158) s 状态域屏蔽字节(psr2316) f 标志域屏蔽字节(psr3124),要传送到状态寄存器指定域的立即数,MSR指令编码1,MSR指令编码2,8位立即数,目标寄存器,不能为R15,R 0:CPSR R
15、1:SPSR,MRS指令编码,立即数 移位次数,2019-4-17,软中断指令的编码格式,SWIcond immed_24,指令执行的条件码,指令传递的参数(24位立即数,其值 为02241); 执行时CPU忽略该参数,交OS处理。,2019-4-17,28/95,数据处理指令,ARM的数据处理指令大致可分为以下几类: 数据传送指令:MOV、MVN 算术运算指令:ADD、SUB、RSB、ADC、SBC、RSC、 MUL、MLA、UMULL、UMLAL、SMULL、SMLAL 逻辑运算指令 :AND、ORR、EOR、BIC 比较指令:CMP、CMN、TST、TEQ 数据处理指令只能对寄存器的内容
16、进行操作,而不能对内存中的数据进行操作。 所有ARM数据处理指令均可选择使用S后缀,以使指令影响状态标志。,29/95,数据传送指令,MOV R11,#0xF000000B ;R1= 0xF000000B MOV R0,R1 ;R0=R1 MOVS R3,R1,LSL #2 ;R3=R12,并影响标志位 MOV PC,LR ;PC=LR,子程序返回 MVN R1,#0xFF ;R1=0xFFFFFF00 MVN R1,R2 ;将R2按位取反,结果存到R1,当有后缀S时指令将根据结果更新标志N和Z,在计算 operand2( 8位立即数或寄存器)时更新标志C,不影响标志V。 MVN指令具有取反功
17、能,所以可以装载范围更广的立即数。,30/95,算术运算指令,可影响N,Z,C和V标志位。,ADDS R1,R1,#1020 ;R1=R1+1020,并影响标志位 ADD R1,R1,R2,LSL #2 ;R1=R1+R22 SUBS R0,R0,#240 ;R0=R0-240 ,并影响标志位 SUBS R2,R1,R2 ;R2=R1-R2 ,并影响标志位 RSB R3,R1,#0xFF00 ;R3=0xFF00-R1 ADDS R0,R0,R2 ;R0等于低32位相加,并影响标志位 ADC R1,R1,R3 ;R1等于高32位相加,并加上低位进位 SUBS R0,R0,R2 ;低32位相减,
18、并影响标志位 SBC R1,R1,R3 ;高32位相减,并减去低位借位 RSBS R2,R0,#0 ;R2=-R0 RSC R3,R1,#0 ;R3=-R1- !Carry,64位取负,64位加法,64位减法,乘(加)法 指 令,MUL R1,R2,R3 ;R1=R2R3,结果的低32位保存 MLAS R1,R2,R3,R0 ;R1=R2R3+R0,影响标志位 UMULL R0,R1,R5,R8 ;(R1、R0)=R5R8 UMLAL R0,R1,R5,R8 ;(R1、R0)=R5R8+(R1、R0) SMULL R2,R3,R7,R6 ;(R3、R2)=R7R6 SMLAL R2,R3,R7
19、,R6 ;(R3、R2)=R7R6+(R3、R2),注: R不能为R15且 RdRm ; 可影响N、Z标志位; 32位指令不影响V,C不确定;64位指令V 和C不确定;,32/95,逻辑运算指令,可标志N和Z。计算Operand2时更新标志C,不影响标志V。,ANDS R0,R0,#0x01 ;取R0的最低位数据,并影响标志位 ORR R0,R0,#0x0F ;将R0的低4位置1 ,其它位不变 EOR R1,R1,#0x0F ;将R1的低4位取反,其它位不变 BIC R1,R1,#0x0F ;将R1的低4位清零,其它位不变 ANDEQ R2,R1,R3 ;若Z1,则R2=R1 将R2的高8位移
20、入到R3低8位 ORR R3,R1,R3,LSL #8,33/95,比较指令,不需要使用S后缀,会影响N/Z/C/V标志位;不保存运算结果;,CMP R1,#10 ; R1与10比较,并设置相关标志位 CMPGT R1,R2 ;若R110,则比较R1与R2,并设置相关标志位 CMN R0,#1 ;比较R0与-1,判断R0是否为1的补码-1,是则设置Z标志 TST R1,#0x0F ;判断R1的低4位是否为0 TEQ R0,R1 ;较R0与R1是否相等 (不影响V位和C位),TST指令的下一条指令常与EQ、NE条件码配合使用:当所有测试位均为0时,EQ有效(Z=1),否则NE有效(Z=0);,计
21、算R0+1,TEQ指令的下一条指令常与EQ、NE条件码配合使用:当两个数据相等时,EQ有效(Z=1),否则NE有效(Z=0);,2019-4-17,34/95,存储器访问指令,ARM处理器是典型的RISC处理器,对存储器的访问只能使用加载/存储指令 实现。 ARM的存储空间及I/O空间统一编址,因此对外围I/O及程序数据的访问均需通过加载/存储指令进行。 一、单寄存器操作指令LDR/STR 用于对访问内存变量、内存缓冲区数据、查表、控制外围部件等。若使用LDR指令加载数据到PC寄存器,则实现程序跳转。 又分为“字和无符号字节加载存储指令”及“半字和有符号字节加载存储指令”两类。 二、多寄存器操
22、作指令LDM/STM 主要用于现场保护、数据复制、常数传递等。 三、数据交换指令SWP,35/95,单寄存器存取指令,符号数加载时用符号扩展到32位,否则用零扩展到32位; 半字读写的指定地址必须为偶数,否则将产生不可靠的结果;,单寄存器存取指令的寻址方式,基址寄存器(任一通用寄存器)+地址偏移量 立即数:LDR R1,R0,#0x12 ;R1-R0+0x12 寄存器:LDR R1,R0,-R2 ; R1-R0-R2 寄存器移位:LDR R1,R0,R2,LSL #2 ;R1-R0+R2*4,地址索引的4种格式 零偏移: LDR Rd,Rn 程序相对偏移: LDR Rd,labe1 前索引偏移
23、: LDR Rd,Rn,#0x04! 后索引偏移: LDR Rd,Rn,#-0x04,必须是在当前指令的4K字节范围内,2019-4-17,37/95,LDR R2,R5 STR R1,R0,#0x04 LDRB R3,R2,#-1 STRB R0,R3,-R8,ASR 2 LDRSB R1,R0,R3 LDRH R6,R2,#2 LDRD R6,R11 STRD R4,R9,#24,单寄存器存取指令应用示例,双字存储时注意: Rd必须是偶数寄存器,且不是R14。 除非指令为零偏移,或不带写回的前索引,否则Rn不允许与Rd和R(d+1)相同。,;将R5指向的字数据存入R2 ;将R1的内容存储到
24、R0+0x04字单元 ;将R2指向的无符号字节存入R3,R2R21 ;R0最低有效字节-R3-R8/4 ;将R0+R3指向的字节存入R1,高24位符号扩展 ;将R2指向的半字存入R6,高16位0扩展;R2=R2+2 ;双字装载,R6R11,R7R11+4 ;双字存储,R4R9+24,R5R9+28,38/95,多寄存器存取指令,reglist表示寄存器列表(由小到大),如R1,R2,R6-R9; ! 表示在操作结束后,将最后的地址写回Rn中; 允许在用户模式或系统模式下使用。它有以下两个功能: 1)异常模式下LDM指令中寄存器列表包含R15时,除正常多寄存器传送外,还将SPSR也复制到CPSR
25、中。常用于异常处理返回。 2)使用用户模式下的寄存器,而不是当前模式的寄存器。,39/95,多寄存器存取指令应用示例,R1:指令执行前的基址寄存器 R1:指令执行后的基址寄存器,R1 ,R1 ,指令STMIA R1!,R5-R7,R1 ,R1 ,指令STMDA R1!,R5-R7,R1 ,R1 ,指令STMIB R1!,R5-R7,R1 ,R1 ,指令STMDB R1!,R5-R7,40/95,堆 栈 操 作,;使用数据块传送指令进行堆栈操作 STMDA R0!,R5-R6 . . . LDMIB R0!,R5-R6,;使用堆栈指令进行堆栈操作 STMED R13!,R5-R6 . . . L
26、DMED R13!,R5-R6,两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。,堆栈操作和数据块传送指令之间的关系如下表所示:,寄存器和存储器交换指令,若Rm与Rd相同,则为寄存器与存储器内容进行互换; Rn为要进行数据交换的存储器地址,Rn不能与Rd和Rm相同。,2019-4-17,42/95,分 支 指 令,在ARM中有两种方式可以实现程序的跳转,一种则是直接向PC寄存器赋值实现跳转,另一种是使用分支指令直接跳转。 以下三种分支指令跳转范围限制在当前指令的32M字节地址内,且
27、ARM指令为字对齐,因此最低2位地址固定为0。,2019-4-17,43/95,分支指令应用示例,Addr1,Addr2,1.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC),2. 程序跳转到目标地址Label继续执行,当子程序执行结束后,将LR寄存器内容存入PC,返回调用函数继续执行,B WAITA ; 跳转到WAITA标号处 B 0x1234 ; 跳转到绝对地址0x1234处 BL Label ;调用子程序 ADRL R0,ThumbFun+1 ;将Thumb程序的入口地址加1存入R0 BX R0 ; 跳转到指定地址并切换到Th
28、umb状态,44/95,2019-4-17,PSR访问指令,读CPSR可了解当前工作状态; 读SPSR可以了解进入异常前的状态; MSR与MRS配合使用,可以切换处理器模式或允许/禁止中断等。,(1),(2),(3),(4),应用示例1: ;子程序:使能IRQ中断 ENABLE_IRQ MRS R0, CPSR BIC R0, R0,#0x80 MSR CPSR_c,R0 MOV PC,LR,应用示例2: ;子程序:禁能IRQ中断 DISABLE_IRQ MRS R0, CPSR ORR R0, R0,#0x80 MSR CPSR_c,R0 MOV PC,LR,1.将CPSR寄存器内容读出到R
29、0;,2.修改对应于CPSR中的I控制位;,3.将修改后的值写回 CPSR寄存器的对应控制域;,4.返回上一层函数;,2019-4-17,45/95,软中断指令,主要用于用户程序调用操作系统的系统服务:切换到管理模式,并将CPSR保存到管理模式的SPSR中,然后程序跳转到SWI异常入口。不影响条件码标志。 根据SWI指令传递的参数SWI异常处理程序可以作出相应的处理。SWI指令传递参数有以下两种方法:,1. 指令中的24位立即数指定服务类型,参数通过通用寄存器传递。 MOV R0,#34 ;设置子功能号为34 SWI 12 ;调用12号软中断 2.指令中的24位立即数被忽略,服务类型由R0的值
30、决定,参数通过其它的通用寄存器传递。 MOV R0,#12 ;调用12号软中断 MOV R1,#34 ;设置子功能号为34 SWI 0,2019-4-17,46/95,在SWI异常中断处理程序中,取出SWI指令中立即数的步骤为: 首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到; 然后取得该SWI指令的地址,这可通过访问LR寄存器得到; 接着读出该SWI指令,分解出立即数。,SWI_Handler STMFD SP!, R0-R3, R12, LR ; 现场保护 MRS R0, SPSR ; 读取SPSR STMFD SP!, R0 ; 保存SPSR T
31、ST R0, #0x20 ; 测试T标志位 LDRNEH R0, LR,#-2 ; 若是Thumb指令,读取指令码(16位) BICNE R0, R0, #0xFF00 ; 取得Thumb指令的8位立即数(低8位) LDREQ R0, LR,#-4 ; 若是ARM指令,读取指令码(32位) BICEQ R0, R0, #0xFF000000 ; 取得ARM指令的24位立即数(低23位) . LDMFD SP!, R0-R3, R12, PC ; SWI异常中断返回,2019-4-17,47/95,伪指令,在ARM汇编指令中,有一类特殊的指令没有对应的指令编码。在汇编时根据情况会解释为相应的AR
32、M、Thumb-2或Thumb-2之前的Thumb指令的组合。这类指令被ARM公司称为“伪指令”。 需要特别注意的是,这几条指令和第9章中介绍的伪指令虽然形式上类似,但作用却大不相同。第9章中介绍的伪指令用于指导汇编器完成相应的汇编工作,符合通常意义上对伪指令的定义,而本节所介绍的这几条伪指令的作用和正常的ARM汇编指令类似,设计这几条伪指令的目的主要是使用一条指令替代多条指令的组合,方便程序员完成汇编程序设计工作,其作用类似于80x86处理器的宏指令。,伪指令,ADR/ADRL 将相对于程序或相对于寄存器的地址载入寄存器中(中等范围,与位置无关)。 指令书写格式:ADR(ADRL) , MO
33、V R0, #0x18 ; 给R0赋值用于查表 ADR R3, JumpTable ; 装载跳转表的首地址 LDR PC, R3,R0,LSL#2 ; 查表,将查到的地址赋给PC JumpTable ,ADR R3 JumpTable,LDR PC,R3,R0,LSL#2,xxx,JumpTable,xxx,xxx,JumpTable+0x60,xxx,PC,R3,JumpTable,PC,xxx,伪指令,LDR 将32位常数或地址载入寄存器(无范围限制,但与位置相关) 指令书写格式:LDR , / expr取值为一个数值常数 如果expr的值位于范围内,则汇编器将会生成一个MOV或MVN指令
34、 如果expr的值不在MOV或MVN指令的范围内,则汇编器会将常数放入文字池中,并会生成一个相对于程序的LDR指令,该指令可从文字池中读取此常数 指令举例 LDR R3,=0xFF0 ; 把立即数0xFF0赋值给R3 LDR R2,=place ; 把标号place对应的地址赋值给R2,伪指令,MOV32 将32位常数或地址载入寄存器(无范围限制,但与位置相关) 仅可用于ARMv6T2及更高版本 指令书写格式:MOV32 , expr可以是symbol(程序区域中的标号)、constant(任何32位常数)或symbol+constant(一个加上32位常数的标号)。,伪指令,UND 生成无体
35、系结构定义的指令 指令书写格式:UND 执行未定义指令会引发未定义指令异常。程序员可以利用指令异常完成相应的异常处理。,ARM指令系统总结,ARM指令集 ARM指令:32 bits(字长),4字节边界对齐 Thumb指令:16 bits(半字), 4字节边界对齐 数据类型 字节:8bit,任意存放 半字:16bit,2字节边界对齐 字: 32 bits,4字节边界对齐 所有数据操作都以字为单位; Load-store操作: 可以对字节、半字、字和双字进行操作; 当装载字节或半字时自动实现零扩展或符号扩展。,2019-4-17,53/95,ARM指令与Thumb指令,THUMB指令是ARM指令的
36、子集,只要遵循一定的调用规则,可以相互调用,Thumb指令与ARM指令的时间效率和空间效率关系,存储空间约为ARM代码的6070,指令数比ARM代码多约3040,存储器为32位时ARM代码比Thumb代码快约40,存储器为16位时Thumb比ARM代码快约4050,存储器的功耗会降低约30,2019-4-17,54/95,ARM支持的数据类型,字节:8位 半字:16位(必须分配为占用2个字节) 字:32位(必须分配为占用4个字节) 注意:1)半字存储单元地址最低位为0 2)字存储单元地址最低两位为0 N位无符号数: 二进制格式表示范围为02N-1的非负整数; N位有符号数时,N位数据值使用2的
37、补码格式表示范围为-2N-1+2N-1-1的整数,2019-4-17,55/95,数据存储格式,ARM体系结构所支持的最大寻址空间为4GB(232字节) ARM体系结构将存储器看成是以字节为单位的线性组合,存储单元地址从0x00000000开始编址 ARM可按大端格式和小端格式两种方式存储字数据,字数据0x12345678,一个基于ARM内核的芯片可以只支持大端模式或小端模式,也可以两者都支持。通常,小端模式是ARM处理器的默认形式。 在ARM指令集中不包含任何直接选择大小端的指令,但是一个同时支持大小端模式的ARM芯片可以通过硬件配置(一般使用芯片的引脚来配置)来匹配存储器系统所使用的规则。 ARM大小端是通过配置协处理器CP15寄存器1的bit7来修改大小端格式。,56/95,基于ARM内核的芯片具有许多外设,这些外设访问的标准方法是使用存储器映射的I/O,为每个端口寄存器都分配一个地址。 通常,从这些地址装载数据用于读入,向这些地址保存数据用于输出。有些地址的装载和保存用于外设的控制功能,而不是输入或输出功能。 存储器映射的I/O位置的操作不同于正常的存储器位置的操作。通常,存储器映射的I/O位置没有高速缓存或缓冲区。,存储器映射的I/O,57/95,作业,8.2、8.3、8.4、8.5、8.7、8.8、8.9,第8章 结束,
链接地址:https://www.31doc.com/p-2608906.html