第8章 ARM汇编指令_第1页
第8章 ARM汇编指令_第2页
第8章 ARM汇编指令_第3页
第8章 ARM汇编指令_第4页
第8章 ARM汇编指令_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

A

R

M

令8.1ARM指令格式(掌握)ARM指令的一般编码格式ARM指令的条件域指令的第二源操作数8.2ARM寻址方式(掌握)立即寻址

寄存器直接寻址

寄存器移位寻址寄存器间接寻址

基址变址寻址多寄存器直接寻址相对寻址堆栈寻址8.3ARM指令集(掌握)数据处理指令转移指令程序状态寄存器访问指令加载/存储指令异常产生指令伪指令

ARM采用三地址指令格式:ARM汇编指令书写格式<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

其中<>号内的项是必须的,{}号内的项可选。opcode:操作码助记符(英语单词缩写); cond:执行条件;S:是否影响CPSR寄存器的值;Rd:目标寄存器;Rn:第1个操作数的寄存器;operand2:第2个操作数(#immed_8r、Rm、Rm,shift);指令语法目标寄存器(Rd)源寄存器1(Rn)源寄存器2(Rm)ADDr3,r1,r2r3r1r2yyyy-M-2/95ARM机器指令编码格式操作码条件助记符标志含义0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1无符号数大于或等于0011CC/LOC=0无符号数小于0100MIN=1负数0101PLN=0正数或零0110VSV=1溢出0111VCV=0没有溢出1000HIC=1,Z=0无符号数大于1001LSC=0,Z=1无符号数小于或等于1010GEN=V有符号数大于或等于

1011LTN!=V有符号数小于

1100GTZ=0,N=V有符号数大于

1101LEZ=1,N!=V有符号数小于或等于

1110AL任何无条件执行

(指令默认条件)1111NV任何从不执行(不要使用)所有的ARM指令都可以条件执行,而Thumb指令只有B(跳转)指令具有条件执行功能。如果指令不标明条件代码,将默认为无条件(AL)执行ARM指令条件码cond4/95ARM指令中的第2操作数0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常数循环右移10位常数#immed_8r由一个8位常数通过循环右移偶数位得到:Rm,shift由Rm移位得到。移位不消耗额外时间,且Rm值不变。ALU桶形移位器Rd结果N预处理未预处理RmRnLSL0LSR0ASRRORRRXCyyyy-M-数据处理指令第二操作数编码格式ARM处理器寻址方式

寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有几种基本寻址方式:1.立即寻址2.寄存器寻址

3.寄存器间接寻址移位寻址、间接寻址、基址变址寻址、多寄存器寻址(块寻址)4.堆栈寻址5.相对寻址7/951.操作数包含在指令当中;2.指令地址码部分就是数据本身;3.取指时就取出了可立即使用的操作数;MOV R0,#0xFF00;R0<=#0xFF00SUBS R0,R0,#1;R0<=R0-10x55R0MOVR0,#0xFF00立即寻址0xFF00从代码中获得数据10进制数:#21,#0d572进制数:#0b0110016进制数:#0x3a001影响标志位寄存器寻址yyyy-M-8/95立即数规则因为指令长度是32位的,32位的指令中,即有指令码还有立即数所以要表示比较宽的数据范围,只能取某些特殊的数了,例如通过移位来实现。如果不能用该方法得到立即数,则可以使用LDR伪指令实现(先把数据放到ROM中,然后再通过地址加载到寄存器中)如果第二个源操作数不能由一个8位常数通过循环右移偶数位得到,则可以通过后面提到的伪指令实现。例如,不能使用使用MOVR0,#0x32000001指令,需要转换为:

LDRR0,=0x32000001(注意0x前没有“#”,有”=”)(伪指令LDR对于不能被MOV和MVN指令所读取的立即数,可以将其转换为如下格式:

LDRR0,[0x00008040]

即把数据“0x32000001”放在内存地址0x8040处,然后用存储器访问指令LDR得到该存储单元的值:0x32000001)ARM指令中的第2操作数特例1.操作数存放在寄存器中;2.指令地址码字段给出寄存器编号(名);3.指令执行时直接取出寄存器值来操作;

MOVR1,R2;

R1<=R2

SUBR0,R1,R2;R0<=R1-R20xAA0x55R2R1寄存器直接寻址0xAAyyyy-M-11/951.操作数存放在寄存器中;2.指令地址码字段给出寄存器编号(名)及移位表达式;3.指令执行时取出寄存器值并移位,再将结果作为源操作数;MOV R0,R2,LSL#3 ;R0<=R2×8

ANDSR1,R1,R2,LSLR3 ;R1<=R1and(R2<<R3)0x55R0R20x01寄存器移位寻址0x080x08逻辑左移3位寄存器寻址影响标志位LSL、LSRASRROR、RRX寄存器间接寻址1.操作数存放在内存单元中;2.指令地址码字段给出[寄存器编号(名)];3.指令执行时根据寄存器值(指针)找到相应的存储单元; LDR R1,[R2] ;R1<=[R2] SWP R1,R1,[R2] ;R1

[R2]0x55R0R20x400000000xAA0x400000000xAA内存单元yyyy-M-13/951.操作数存放在内存单元中;2.指令地址码字段给出[寄存器编号(名)]和偏移量;3.指令执行时将基址寄存器的内容与偏移量(<4K)相加/减,形成操作数的有效地址。4.常用于查表、数组操作、功能部件寄存器访问等。 LDR R2,[R3,#0x0C] ;R2<=[R3+0x0C]STR R1,[R0,#-4]! ;R1<=[R0-4],R0<=R0-4LDR R0,[R1],#4 ;R0<=[R1],R1<=R1+4基址变址寻址前索引后索引0x55R2R30x400000000xAA0x4000000C0xAA内存单元14/951.操作数存放在内存单元中;2.指令地址码字段给出{寄存器编号(名)列表};3.编号高的寄存器总是对应内存中的高地址单元;4.可完成存储块和16个寄存器或其子集之间的数据传送。

LDMIA R1!,{R2-R4,R6};R2<=[R1],R3<=[R1+4] ;R4<=[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多寄存器直接寻址0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C0x010x020x030x040x40000010内存单元(IncreaseAfter)DecreaseBefore相对寻址1.操作数为指令存放地址;2.指令地址码字段为地址偏移量;3.指令执行时同基址寻址,由PC提供基地址根据偏移量完成跳转;

BL SUB ;调用SUB子程序SUB

BEQ LOOP ;条件跳转到LOOP处

...LOOPMOVR6,#1yyyy-M-16/95堆栈寻址操作数存放在内存栈顶单元中;2.指令地址码字段固定使用栈顶指针SP(初始化为栈底);3.指令执行时同多寄存器/块寻址,可完成多个数据的入栈和出栈;ARM支持的四种堆栈类型1.满递增(FA):堆栈指针SP的值增加,SP指向最后放入数据的位置2.空递增(EA)

:堆栈指针SP的值增加,SP指向下一个将要放入数据的空位置3.满递减(FD)

:堆栈指针SP的值减小,SP指向最后放入数据的位置4.空递减(ED)

:堆栈指针SP的值减小,SP指向下一个将要放入数据的空位置yyyy-M-18/94注意:入栈和出栈的堆栈类型一定要相同。堆栈的递增与递减递增堆栈:向高地址方向生长,即向上生长递减堆栈:向低地址方向生长,即向下生长栈底栈顶栈区SP

堆栈存储区栈顶栈底栈区

SP地址减少地址增加0x123456780x12345678递增堆栈压栈递减堆栈压栈yyyy-M-19/940x10100x1000注意:SP初始化时指向栈底栈顶SP

栈顶SP

栈底栈底堆栈的空与满空堆栈:堆栈指针SP指向下一个待压入数据的空位置满堆栈:堆栈指针SP指向最后压入的堆栈的有效数据项0x123456780x12345678栈顶SP

0x12345678栈顶SP

满堆栈压栈空堆栈压栈yyyy-M-20/94数据处理指令

ARM的数据处理指令大致可分为以下几类:

数据传送指令:MOV、MVN

算术运算指令:ADD、SUB、RSB、ADC、SBC、RSC、 MUL、MLA、UMULL、UMLAL、SMULL、SMLAL

逻辑运算指令:AND、ORR、EOR、BIC

比较指令:CMP、CMN、TST、TEQ数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均可选择使用S后缀,以使指令影响状态标志。

21/95数据处理指令的编码格式指令条件码I=1:立即数;I=0:寄存器移位第二操作数Rd目标寄存器Rn第一操作数寄存器S=1:根据结果设置CPRS中的条件码S=0:不设置CPRS中的条件码带进位加法ADC0101带进位减法指令SBC0110带进位逆向减法指令RSC0111位测试指令TST1000相等测试指令TEQ1001比较指令CMP1010负数比较指令CMN1011逻辑或操作指令ORR1100数据传送MOV1101位清除指令BIC1110数据非传送MVN1111加法运算指令ADD0100逆向减法指令RSB0011减法运算指令SUB0010逻辑异或操作指令EOR0001逻辑与操作指令AND0000说明指令助记符操作码22/95数据传送指令MOV R11,#0xF000000B ;R1=0xF000000BMOV R0,R1 ;R0=R1

MOVSR3,R1,LSL#2 ;R3=R1<<2,并影响标志位

MOV PC,LR ;PC=LR,子程序返回

MVN R1,#0xFF ;R1=0xFFMVN R1,R2 ;将R2按位取反,结果存到R1指令格式说明操作MOV{cond}{S}Rd,operand2数据传送Rd←operand2MVN{cond}{S}Rd,operand2数据非传送Rd←(~operand2)当有后缀S时指令将根据结果更新标志N和Z,在计算 operand2(8位立即数或寄存器)时更新标志C,不影响标志V。MVN指令具有取反功能,所以可以装载范围更广的立即数。23/95算术运算指令指令格式说明操作ADD{cond}{S}Rd,Rn,operand2加法Rd←Rn+operand2SUB{cond}{S}Rd,Rn,operand2减法Rd←Rn-operand2RSB{cond}{S}Rd,Rn,operand2逆向减法Rd←operand2-RnADC{cond}{S}Rd,Rn,operand2带进位加法Rd←Rn+operand2+CSBC{cond}{S}Rd,Rn,operand2带进位减法Rd←Rn-operand2-~CRSC{cond}{S}Rd,Rn,operand2带进位逆向减法Rd←operand2-Rn-~C可影响N,Z,C和V标志位。ADDS R1,R1,#1020 ;R1=R1+1020,并影响标志位ADD R1,R1,R2,LSL#2 ;R1=R1+R2<<2SUBS 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位相减,并影响标志位SBC R1,R1,R3

;高32位相减,并减去低位借位RSBS R2,R0,#0 ;R2=-R0RSC R3,R1,#0 ;R3=-R1-!Carry64位取负64位加法

64位减法

比较和测试指令指令格式说明操作CMP{cond}Rn,operand2比较指令标志←Rn-operand2CMN{cond}Rn,operand2负数比较指令标志←Rn+operand2TST{cond}Rn,operand2位测试指令标志←Rn&operand2TEQ{cond}Rn,operand2相等测试指令标志←Rn^operand2不需要使用S后缀,会影响N/Z/C/V标志位;不保存运算结果;CMP R1,#10 ;R1与10比较,并设置相关标志位CMPGT R1,R2 ;若R1>10,则比较R1与R2,并设置相关标志位CMN R0,#1

;比较R0与-1,判断R0是否为1的补码-1,是则设置Z标志TST R1,#0x0F ;判断R1的低4位是否为0TEQ R0,R1 ;较R0与R1是否相等(不影响V位和C位)TST指令的下一条指令常与EQ、NE条件码配合使用:当所有测试位均为0时,EQ有效(Z=1),否则NE有效(Z=0);计算R0+1TEQ指令的下一条指令常与EQ、NE条件码配合使用:当两个数据相等时,EQ有效(Z=1),否则NE有效(Z=0);yyyy-M-25/95逻辑运算指令指令格式说明操作AND{cond}{S}Rd,Rn,operand2逻辑与操作Rd←Rn&operand2ORR{cond}{S}Rd,Rn,operand2逻辑或操作Rd←Rn|operand2EOR{cond}{S}Rd,Rn,operand2逻辑异或操作Rd←Rn^operand2BIC{cond}{S}Rd,Rn,operand2位清除Rd←Rn&(~operand2)可标志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位清零,其它位不变ANDEQR2,R1,R3 ;若Z=1,则R2=R1&R3BIC R1,R2,R3 ;将R3的反码和R2相逻辑“与”MOV R1,R2,LSR#24 ;将R2的高8位移入到R3低8位ORR

R3,R1,R3,LSL#8

26/95乘(加)法指令指令格式说明操作MUL{cond}{S}

Rd,Rm,Rs32位乘法Rd←Rm*RsMLA{cond}{S}

Rd,Rm,Rs,Rn32位乘加Rd←Rm*Rs+RnUMULL{cond}{S}

RdLo,RdHi,Rm,Rs64位无符号乘法(RdLo,RdHi)←Rm*RsUMLAL{cond}{S}

RdLo,RdHi,Rm,Rs64位无符号乘加(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)SMULL{cond}{S}

RdLo,RdHi,Rm,Rs64位有符号乘法(RdLo,RdHi)←Rm*RsSMLAL{cond}{S}

RdLo,RdHi,Rm,Rs64位有符号乘加(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)MUL R1,R2,R3 ;R1=R2×R3,结果的低32位保存MLAS R1,R2,R3,R0 ;R1=R2×R3+R0,影响标志位UMULL R0,R1,R5,R8 ;(R1、R0)=R5×R8UMLAL R0,R1,R5,R8 ;(R1、R0)=R5×R8+(R1、R0)SMULL R2,R3,R7,R6 ;(R3、R2)=R7×R6SMLAL R2,R3,R7,R6 ;(R3、R2)=R7×R6+(R3、R2)

注:R不能为R15且Rd≠Rm

可影响N、Z标志位;32位指令不影响V,C不确定;64位指令V和C不确定;27/95分支指令在ARM中有两种方式可以实现程序的跳转,一种则是直接向PC寄存器赋值实现跳转,另一种是使用分支指令直接跳转。

以下三种分支指令跳转范围限制在当前指令的±32M字节地址内,且ARM指令为字对齐,因此最低2位地址固定为0。指令格式说明操作B{cond}

label分支指令PC←labelBL{cond}

label带链接的分支指令LR←PC-4,PC←label适用于子程序调用BX{cond}

Rm带状态切换的分支指令PC←Rm根据跳转地址(Rm)的最低位来切换处理器状态yyyy-M-28/95BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC分支指令应用示例Addr1LabelAddr2Addr21.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC)2.程序跳转到目标地址Label继续执行,当子程序执行结束后,将LR寄存器内容存入PC,返回调用函数继续执行B WAITA

;跳转到WAITA标号处

B 0x1234

;跳转到绝对地址0x1234处BL Label ;调用子程序ADRLR0,ThumbFun+1

;将Thumb程序的入口地址加1存入R0BXR0 ;跳转到指定地址并切换到Thumb状态

29/95yyyy-M-程序状态寄存器访问指令指令格式说明操作MRS{cond}Rd,psr读PSRRd←psrMSR{cond}

psr_fields,Rd/#immed_8r写PSRpsr_fields←Rd/#immed_8r读CPSR可了解当前工作状态;读SPSR可以了解进入异常前的状态;MSR与MRS配合使用,可以切换处理器模式或允许/禁止中断等。(1)(2)(3)(4)应用示例1:;子程序:使能IRQ中断ENABLE_IRQMRSR0,CPSRBICR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR应用示例2:;子程序:禁能IRQ中断DISABLE_IRQMRSR0,CPSRORRR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR

1.将CPSR寄存器内容读出到R0;2.修改对应于CPSR中的I控制位;3.将修改后的值写回CPSR寄存器的对应控制域;4.返回上一层函数;yyyy-M-30/95加载存储指令指令格式说明操作LDR{cond}

Rd,addressing

加载字数据Rd←[addressing]注意addressing的寻址方式及索引方式LDR{cond}T

Rd,addressing以用户模式加载字数据LDR{cond}BTRd,addressing以用户模式加载无符号字节LDR{cond}B

Rd,addressing

加载无符号字节数据LDR{cond}H

Rd,addressing加载无符号半字数据LDR{cond}SBRd,addressing加载有符号字节数据LDR{cond}SHRd,addressing加载有符号半字数据LDR{cond}DRd,addressing加载双字数据STR{cond}Rd,addressing存储字数据[addressing]←Rd注意addressing的寻址方式及索引方式STR{cond}T

Rd,addressing

以用户模式存储字数据STR{cond}B

Rd,addressing

存储字节数据STR{cond}BT

Rd,addressing

以用户模式存储字节数据STR{cond}H

Rd,addressing

存储半字数据STR{cond}D

Rd,addressing

存储双字数据符号数加载时用符号扩展到32位,否则用零扩展到32位;半字读写的指定地址必须为偶数,否则将产生不可靠的结果;单寄存器存取指令的寻址方式基址寄存器(任一通用寄存器)+地址偏移量立即数:LDRR1,[R0,#0x12]

;R1<-[R0+0x12]寄存器:LDRR1,[R0,-R2] ;R1<-[R0-R2]寄存器移位:LDRR1,[R0,R2,LSL#2];R1<-[R0+R2*4]

地址索引的4种格式零偏移:

LDRRd,[Rn]

程序相对偏移:

LDRRd,labe1前索引偏移:

LDRRd,[Rn,#0x04]!后索引偏移:

LDRRd,[Rn],#-0x04必须是在当前指令的±4K字节范围内yyyy-M-32/95LDR R2,[R5]STR R1,[R0,#0x04]

LDRB R3,[R2],#-1

STRB R0,[R3,-R8,ASR#2]

LDRSBR1,[R0,R3]

LDRHR6,[R2],#2LDRDR6,[R11]STRDR4,[R9,#24]单寄存器存取指令应用示例双字存储时注意:Rd必须是偶数寄存器,且不是R14。除非指令为零偏移,或不带写回的前索引,否则Rn不允许与Rd和R(d+1)相同。;将R5指向的字数据存入R2;将R1的内容存储到[R0+0x04]字单元;将R2指向的无符号字节存入R3,R2=R2-1;R0最低有效字节->[R3-R8/4];将R0+R3指向的字节存入R1,高24位符号扩展;将R2指向的半字存入R6,高16位0扩展;R2=R2+2;双字装载,R6←[R11],R7←[R11+4]

;双字存储,R4→[R9+24],R5→[R9+28]33/95数据块存取指令指令格式说明操作LDM{cond}{mode}Rn{!},reglist{^}多寄存器加载reglist←[Rn...]STM{cond}{mode}Rn{!},reglist{^}多寄存器存储[Rn...]←reglist

reglist表示寄存器列表(由小到大),如{R1,R2,R6-R9};!表示在操作结束后,将最后的地址写回Rn中;^允许在用户模式或系统模式下使用。它有以下两个功能:1)异常模式下LDM指令中寄存器列表包含R15时,除正常多寄存器传送外,还将SPSR也复制到CPSR中。常用于异常处理返回。2)使用用户模式下的寄存器,而不是当前模式的寄存器。地址增长模式数据块传送操作说明地址增长模式堆栈操作说明IA传送后地址加4FD满递减堆栈IB传送前地址加4ED空递减堆栈DA传送后地址减4FA满递增堆栈DB传送前地址减4EA空递增堆栈34/95数据块存取指令应用示例R1:指令执行前的基址寄存器R1’:指令执行后的基址寄存器R1

R1’

指令STMIAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR1

R1’

指令STMDAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR1

R1’

指令STMIBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR1’

R1

指令STMDBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R5R6R7R5R6R7R5R6R735/95堆栈寻址---多寄存器寻址堆栈图例

满递减空递减满递增空递增数据块传送存储堆栈操作压栈说明数据块传送加载堆栈操作出栈说明STMDASTMED空递减LDMIBLDMED空递减STMIASTMEA空递增LDMDBLDMEA空递增STMDBSTMFD满递减LDMIALDMFD满递减STMIBSTMFA满递增LDMDALDMFA满递增;使用数据块传送指令进行堆栈操作STMDA R0!,{R5-R6}...LDMIB R0!,{R5-R6};使用堆栈指令进行堆栈操作STMED R13!,{R5-R6}...LDMED R13!,{R5-R6}两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。堆栈操作和数据块传送指令之间的关系如下表所示:注意:入栈和出栈的堆栈类型一定要相同。多寄存器寻址与堆栈寻址的比较堆栈寻址是多寄存器寻址的一种特殊方式。寻址方式指令基址寄存器指令选项多寄存器寻址LDM(读内存)STM(写内存)通用寄存器IA,IB,DA,DB堆栈寻址LDM(出栈)STM(入栈)固定为SPFD,ED

FA,EA(出栈)(入栈)(装载)(保存)寄存器和存储器交换指令指令格式说明操作SWP{cond}Rd,Rm,Rn

字数据交换Rd←[Rn],[Rn]←Rm

(Rn≠Rd或Rm)SWP{cond}BRd,Rm,Rn

字节数据交换若Rm与Rd相同,则为寄存器与存储器内容进行互换;

Rn为要进行数据交换的存储器地址,Rn不能与Rd和Rm相同。yyyy-M-40/95软中断指令主要用于用户程序调用操作系统的系统服务:切换到管理模式,并将CPSR保存到管理模式的SPSR中,然后程序跳转到SWI异常入口。不影响条件码标志。

根据SWI指令传递的参数SWI异常处理程序可以作出相应的处理。SWI指令传递参数有以下两种方法:

1.指令中的24位立即数指定服务类型,参数通过通用寄存器传递。

MOVR0,#34

;设置子功能号为34

SWI12

;调用12号软中断2.指令中的24位立即数被忽略,服务类型由R0的值决定,参数通过其它的通用寄存器传递。

MOVR0,#12

;调用12号软中断

MOVR1,#34

;设置子功能号为34

SWI0

yyyy-M-41/95在SWI异常中断处理程序中,取出SWI指令中立即数的步骤为:首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到;然后取得该SWI指令的地址,这可通过访问LR寄存器得到;接着读出该SWI指令,分解出立即数。SWI_HandlerSTMFDSP!,{R0-R3,R12,LR} ;现场保护

MRSR0,SPSR ;读取SPSRSTMFDSP!,{R0} ;保存SPSRTSTR0,#0x20 ;测试T标志位

LDRNEHR0,[LR,#-2] ;若是Thumb指令,读取指令码(16位)BICNER0,R0,#0xFF00 ;取得Thumb指令的8位立即数(低8位)

LDREQR0,[LR,#-4] ;若是ARM指令,读取指令码(32位)BICEQR0,R0,#0xFF000000 ;取得ARM指令的24位立即数(低23位)

...LDMFDSP!,{R0-R3,R12,PC}^ ;SWI异常中断返回yyyy-M-42/95伪指令在ARM汇编指令中,有一类特殊的指令没有对应的指令编码。在汇编时根据情况会解释为相应的ARM、Thumb-2或Thumb-2之前的Thumb指令的组合。这类指令被ARM公司称为“伪指令”。需要特别注意的是,这几条指令和第9章中介绍的伪指令虽然形式上类似,但作用却大不相同。第9章中介绍的伪指令用于指导汇编器完成相应的汇编工作,符合通常意义上对伪指令的定义

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论