微处理器系统结构与嵌入式系统-第八章-ARM汇编指令_第1页
微处理器系统结构与嵌入式系统-第八章-ARM汇编指令_第2页
微处理器系统结构与嵌入式系统-第八章-ARM汇编指令_第3页
微处理器系统结构与嵌入式系统-第八章-ARM汇编指令_第4页
微处理器系统结构与嵌入式系统-第八章-ARM汇编指令_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

微处理器系统结构与嵌入式系统设计第八章ARM汇编指令8.1ARM指令格式

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-ARM机器指令编码格式操作码条件助记符标志含义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指令条件码cond带条件码的指令C代码:If(a>b) a++;Else b++;对应的汇编代码:CMP R0,R1 ;比较R0(a)与R1(b)ADDHI

R0,R0,#1;若R0>R1,则R0=R0+1ADDLS

R1,R1,#1;若R0≤1,则R1=R1+1yyyy-M-ARM指令中的第2操作数0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常数循环右移10位常数#immed_8r由一个8位常数通过循环右移偶数位得到(P238):Rm,shift由Rm移位得到。移位不消耗额外时间,且Rm值不变。ALU桶形移位器Rd结果N预处理未预处理RmRnLSL0LSR0ASRRORRRXCyyyy-M-第二操作数编码格式ARM处理器寻址方式

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

2.寄存器寻址

3.寄存器间接寻址移位寻址、间接寻址、基址变址寻址、多寄存器寻址(块寻址)4.堆栈寻址5.相对寻址1.操作数包含在指令当中;2.指令地址码部分就是数据本身;3.取指时就取出了可立即使用的操作数;MOV R0,#0xFF;R0<=#0xFFSUBS R0,R0,#1;R0<=R0-10x55R0MOVR0,#0xFF立即寻址0xFF从代码中获得数据10进制数:#21,#0d572进制数:#0b0110016进制数:#0x3a001影响标志位寄存器寻址yyyy-M-立即数范围0x00~0xFF。例如,不能使用使用MOVR0,#0x32000001指令,需要转换为:LDRR0,=0x32000001(注意0x前没有“#”,有”=”)(对于不能被MOV和MVN指令所读取的立即数,可以将其转换为如下格式:

LDRR0,[0x00008040]

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

MOV R1,R2 ;

R1<=R2

SUB R0,R1,R2 ;R0<=R1-R20xAAyyyy-M-1.操作数存放在寄存器中;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]0x55R0R20x000004000xAA0x000004000xAA内存单元yyyy-M-基址变址寻址1.操作数存放在内存单元中;2.指令地址码字段给出[寄存器编号(名)]和偏移量;3.指令执行时将基址寄存器的内容与偏移量(<4K)相加/减,形成操作数的有效地址。4.常用于查表、数组操作、功能部件寄存器访问等。 LDR R2,[R3,#0x0C] ;R2<=[R3+0x0C]STR R1,[R0,#-4]! ;[R0-4]<=R1,R0<=R0-4LDR R0,[R1],#4 ;R0<=[R1],R1<=R1+4LDRR0,[R1,R2] ;R0<=[R1+R2]前索引后索引0x55R2R30x400000000xAA0x4000000C0xAA内存单元多寄存器寻址/块复制寻址1.操作数存放在内存单元中;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]<=R20x00000400R1R20x??0x010x000004000x??R3R40x??R60x??0x020x030x040x000004040x000004080x0000040C0x010x020x030x040x00000410内存单元IncreaseAfterDecreaseBefore相对寻址1.操作数为指令存放地址;2.指令地址码字段为地址偏移量;3.指令执行时同基址寻址,由PC提供基地址根据偏移量完成跳转;

BL SUBR1 ;调用SUBR1子程序

BEQLOOP ;条件跳转到LOOP处

...LOOPMOVR6,#1yyyy-M-堆栈寻址1.操作数存放在内存栈顶单元中;2.指令地址码字段固定使用栈顶指针SP;3.指令执行时同多寄存器/块寻址,可完成多个数据的入栈和出栈;满递增(FA):堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。空递增(EA):堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。满递减(FD):堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。空递减(ED):堆栈向下增长,堆栈指针向堆栈下的第一个空位置。ARM支持四种堆栈类型:堆栈的递增与递减递增堆栈:向高地址方向生长,即向上生长递减堆栈:向低地址方向生长,即向下生长栈底栈顶栈区SP

堆栈存储区栈顶栈底栈区

SP地址减少地址增加0xFF递增堆栈压栈递减堆栈压栈yyyy-M-0x000x000xFF栈顶SP

栈顶SP

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

0x12345678栈顶SP

满堆栈压栈空堆栈压栈yyyy-M-数据处理指令的编码格式指令条件码I=1:立即数寻址;I=0:寄存器移位寻址第二操作数Rd目标寄存器Rn第一操作数寄存器S=1:根据结果设置CPSR中的条件码S=0:不设置CPSR中的条件码带进位加法ADC0101带进位减法指令SBC0110带进位逆向减法指令RSC0111位测试指令TST1000相等测试指令TEQ1001比较指令CMP1010负数比较指令CMN1011逻辑或操作指令ORR1100数据传送MOV1101位清除指令BIC1110数据非传送MVN1111加法运算指令ADD0100逆向减法指令RSB0011减法运算指令SUB0010逻辑异或操作指令EOR0001逻辑与操作指令AND0000说明指令助记符操作码数据处理指令

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后缀,以使指令影响状态标志。

数据传送指令MOV R1,#0x3C ;R1=0x3CMOV R0,R1 ;R0=R1

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

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

MVN R1,R2 ;将R2按位取反,结果存到R1指令格式说明操作MOV{cond}{S}Rd,operand2数据传送Rd←operand2MVN{cond}{S}Rd,operand2数据非传送Rd←(~operand2)当有后缀S时指令将根据结果更新标志N和Z,在计算 operand2(8位立即数或寄存器)时更新标志C,不影响标志V。算术运算指令指令格式说明操作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

,并影响标志位RSBR3,R1,#0xFF00 ;R3=0xFF00-R1

RSC R3,R1,#0 ;R3=0-R1-!C逻辑运算指令指令格式说明操作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#24 ;R3中原来的低8位数据移到高8位比较指令指令格式说明操作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+1TST R1,#0x0F ;判断R1的低4位是否为0TEQ R0,R1 ;较R0与R1是否相等(不影响V位和C位)TST指令的下一条指令常与EQ、NE条件码配合使用:当所有测试位均为0时,EQ有效(Z=1),否则NE有效(Z=0);TEQ指令的下一条指令常与EQ、NE条件码配合使用:当两个数据相等时,EQ有效(Z=1),否则NE有效(Z=0);yyyy-M-乘法指令的编码格式Rm被乘数寄存器Rn:MLA指令相加的寄存器RdHi:64位乘法指令目标寄

存器的高32位Rd:目标寄存器RdLo:64位乘法指令目标寄存器的低32位Rs为乘数寄存器64位有符号乘加指令SMLAL11164位有符号乘法指令SMULL11064位无符号乘加指令UMLAL10164位无符号乘法指令UMULL10032位乘加指令MLA00132位乘法指令MUL000说明指令助记符操作码yyyy-M-乘(加)法指令指令格式说明操作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不确定;存储器访问指令

ARM处理器是典型的RISC处理器,对存储器的访问只能使用加载/存储指令实现。ARM的存储空间及I/O空间统一编址,因此对外围I/O及程序数据的访问均需通过加载/存储指令进行。一、单寄存器操作指令LDR/STR用于访问内存变量、内存缓冲区数据、查表、控制外围部件等。若使用LDR指令加载数据到PC寄存器,则实现程序跳转。又分为“字和无符号字节加载存储指令”及“半字和有符号字节加载存储指令”两类。二、多寄存器操作指令LDM/STM

主要用于现场保护、数据复制、常数传递等。三、数据交换指令SWP单寄存器存取指令的编码格式字和无符号字节存取指令LDR/STRP表示前/后变址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/STRI=1立即数I=0寄存器移位单寄存器存取指令指令格式说明操作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-LDR R2,[R5]STR R1,[R0,#0x04]

LDRB R3,[R2],#-1

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

LDRSBR1,[R0,R3]

LDRHR6,[R2],#2LDRDR6,[R11]STRDR4,[R9,#24]单寄存器存取指令应用示例双字存储时注意:Rd必须是偶数寄存器,且不是R14。;将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]数据块(多寄存器)存取指令的编码格式数据块(多寄存器)存取指令编码LDM/STMS对应于指令中的”^”符号:在恢复PC时也同时恢复SPSRP表示前/后变址U表示加/减W表示回写(!)寄存器列表Rn为基址寄存器L=1:加载L=0:存储yyyy-M-多寄存器存取指令指令格式说明操作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空递增堆栈多寄存器存取指令应用示例R1:指令执行前的基址寄存器R1’:指令执行后的基址寄存器R1

R1’

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

R1’

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

R1’

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

R1

指令STMDBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R5R6R7R5R6R7R5R6R7堆栈图例

满递减空递减满递增空递增堆栈操作数据块传送存储堆栈操作压栈说明数据块传送加载堆栈操作出栈说明STMDASTMED空递减LDMDALDMFA满递减STMIASTMEA空递增LDMIALDMFD满递增STMDBSTMFD满递减LDMDBLDMEA空递减STMIBSTMFA满递增LDMIBLDMED空递增;使用数据块传送指令进行堆栈操作STMDA R0!,{R5-R6}...LDMIB R0!,{R5-R6};使用堆栈指令进行堆栈操作STMED R13!,{R5-R6}...LDMED R13!,{R5-R6}两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。堆栈操作和数据块传送指令之间的关系如下表所示:寄存器/存储器交换指令的编码格式B用于区别无符号字节(B为1)或字(B为0)Rm源寄存器Rd目标寄存器Rn为基址寄存器SWP R1,R1,[R0] ;

R1[R0]SWPB R1,R2,[R0] ;将R0指向的存储单元低字节数据读

;取到R1中(高24位清零),并将R2的

;内容写入到该内存单元中的最低字节yyyy-M-寄存器和存储器交换指令指令格式说明操作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-分支指令的编码格式分支指令B/BL指令编码格式L=0:B指令,跳转L=1:

BL指令,保存PC并跳转,可返回24位有符号立即数(偏移量)分支指令BX指令编码格式Rm目标地址寄存器,该寄存器装载31位跳转地址,最低位为1时切换到Thumb状态yyyy-M-分支指令在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-BWAITA

;跳转到WAITA标号处

B 0x1234

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

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

BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC分支指令应用示例Addr1LabelAddr2Addr21.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC)2.程序跳转到目标地址Label继续执行,当子程序执行结束后,将LR寄存器内容存入PC,返回调用函数继续执行yyyy-M-PSR访问指令(P257)指令格式说明操作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-软中断指令的编码格式SWI{cond}immed_24指令执行的条件码指令传递的参数(24位立即数,其值 为0~224-1);yyyy-M-软中断指令主要用于用户程序调用操作系统的系统服务:实现用户模式变换到管理模式,并将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-在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位立即数(低24位)

...LDMFDSP!,{R0-R3,R12,PC}^ ;SWI异常中断返回yyyy-M-伪指令在ARM汇编指令中,有一类特殊的指令没有对应的指令编码。在汇编时根据情况会解释为相应的ARM、Thumb-2或Thumb-2之前的Thumb指令的组合。这类指令被ARM公司称为“伪指令”。需要特别注意的是,这几条指令和第9章中介绍的伪指令虽然形式上类似,但作用却大不相同。第9章中介绍的伪指令用于指导汇编器完成相应的汇编工作,符合通常意义上对伪指令的定义,而本节所介绍的这几条伪指令的作用和正常的ARM汇编指令类似,设计这几条伪指令的目的主要是使用一条指令替代多条指令的组合,方便程序员完成汇编程序设计工作,其作用类似于80x86处理器的宏指令。伪指令ADR/ADRL将相对于程序或相对于寄存器的地址载入寄存器中(中等范围,与位置无关)。指令书写格式:ADR(ADRL)[<cond>]<Rd>,<label>……MOVR0,#0x18;给R0赋值用于查表ADRR3,JumpTable

;装载跳转表的首地址LDRPC,[R3,R0,LSL#2];查表,将查到的地址赋给PCJumpTable……ADRR3JumpTableLDRPC,[R3,R0,LSL#2]xxxJumpTablexxxxxxJumpTable

温馨提示

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

评论

0/150

提交评论