第3章ARM指令集(2016年2月22日)_第1页
第3章ARM指令集(2016年2月22日)_第2页
第3章ARM指令集(2016年2月22日)_第3页
第3章ARM指令集(2016年2月22日)_第4页
第3章ARM指令集(2016年2月22日)_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

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

文档简介

共129页11第3章ARM指令集4学时本章主要内容1、ARM指令集简介;2、ARM指令的寻址方式;3、ARM指令集。共129页22本章教学要求掌握:ARM指令的寻址方式,ARM指令集。共129页333.1ARM指令集简介

ARM微处理器的指令集是加载/存储型的,具有效率高、代码密度低的特点,它的32位编码能够包含的信息量很大,每一条语句完成的功能很多。

在多寄存器操作指令中一次最多可以完成16个寄存器的数据传送,而这样的操作要是不在多寄存器操作的指令中,要执行16条语句才能实现。共129页4

一个简单的ARM汇编程序:

AREAExample,CODE,READONLY;声明代码段ExampleENTRY;标识程序入口

CODE32;声明32位ARM指令STARTMOVR0,#0;设置参数MOVR1,#10LOOPBLADD_SUB;调用子程序ADD_SUBBLOOPADD_SUBADDSR0,R0,R1;R0=R0+R1

MOVPC,LR;子程序返回

END;文件结束共129页53.1.1ARM指令的分类与格式(1)ARM指令的分类

ARM指令可以分为:跳转指令、数据处理指令、程序状态寄存器(PSR)传输指令、Load/Store指令、协处理器指令和异常中断产生指令六类。共129页6①跳转指令

跳转指令用于控制程序的执行流程、指令的特权等级和在ARM代码与Thumb代码之间进行切换。②状态寄存器传输指令

用于控制在存储器和寄存器之间的数据传输、交换、加载、存储。共129页7③数据处理指令

用于操作片上的ALU、桶型移位器、乘法器以完成在31个32位的通用寄存器之间的高速数据处理。④ARM协处理器指令

ARM协处理器指令用于控制外部的协处理器,这些指令已开发统一的方式用于片外功能指令集。ARM支持16个协处理器。共129页8⑤异常中断产生指令

ARM有两条异常中断产生指令,分别为软中断指令SWI和断点中断指令BKPT。⑥Load/Store内存访问指令

Load指令用于从内存中读取数据放入寄存器中,Store指令用于将寄存器中的数据保存到内存中。共129页9(1)ARM指令的格式

ARM指令的格式如下:<opcode>{<condition>}{s}<Rd>,<Rn>{,<operand2>}

指令格式举例:

LDRR3,[R6];读取R6地址上的存储单元内容,执行条件AL。

BEQNEXT;跳转指令,执行条件EQ即相等时跳转到NEXT执行。共129页10

ADDSR0,R1,#2;加法指令,R0=R1+2,影响CPSR寄存器。

SUBNESR0,R1,#0X03;条件执行减法运算(NE),R0=R1-0X03,影响CPSR寄存器。

在ARM指令中,灵活地使用第二个操作数(operand2)能够提高代码效率,第二个操作数的形式如下:共129页11①#immed_8r——8位常数表达式

但8位常数的使用是有限制的,具体如下:共129页12

合法常量:0X3FC(0XFF<<2)、0、0XF0000000(0XF0<<24)、200(0XC8)、0XF0000001(0X1F<<28)。

常数表达式应用举例:

非法常量:0X1FE、511、0XFFFF、0X1010、0XF0000010。

MOVR0,#1

ANDR1,R2,#0X0F共129页13②Rm——寄存器方式

LDRR0,[R2],#-1;读取R2

地址上的存储器单元内容存入R0,且R2=R2-1

寄存器方式举例:

SUBR1,R1,R2;R1=R1-R2

MOVPC,R0;PC=R0,程序跳转到指定地址共129页14

LDRR0,[R1],-R2;读取R1地址上的存储器单元内容存入R0,且R1=R1-R2③Rm,shift——寄存器移位方式ASR#n;算数右移n位(1≤n≤32)LSL#n;逻辑左移n位(0≤n≤31)LSR#n;逻辑右移n位(1≤n≤32)ROR#n;循环右移n位(1≤n≤31)共129页15RRX;带扩展的循环右移1位TypeRs;其中Type为ASR、LSL、LSR和ROR中的一种,Rs为偏移量寄存器,低8位有效。

寄存器偏移方式应用举例:ADDR2,R2,R2,LSL#3;R2=R2x9SUBR1,R1,R3,LSL#2;R1=R1-R3X4共129页163.1.2ARM指令的条件码域

当处理器工作在ARM状态时,几乎所有的指令均根据CPSR

中的条件码的状态和指令的条件域有条件执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。

ARM指令的条件码和助记符如下表所示:共129页17条件码条件码助记符CPSR中条件标志位值含义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=1且V=1或N=0且V=0带符号数大于或等于1011LTN=1且V=0或N=0且V=1带符号数小于共129页181100GTZ=0且N=V带符号数大于1101LEZ=1或N!=V带符号数小于或等于1110AL无条件执行1111NVARMV3之前该执行从不执行3.1.3ARM指令可选后缀(1)S后缀

使用S

后缀后,指令执行后程序状态寄存器的条件标志位将刷新。

有的指令不使用S后缀,也要刷新条件标志位,如CMP、CMN、TST等指令。共129页19(2)!后缀

在指令的地址表达式中含有!后缀时,指令执行后,基地址寄存器中的地址将会发生变化,变化的结果如下:①基址寄存器中的地址值(指令执行后)=指令执行前的值+地址偏移量;②如果指令不含!后缀,则地址值不会发生变化。共129页20LDMIAR3,[R0,#04];R3=[R0+#04],没有使用!后缀LDMIAR3,[R0,#04]!;R3=[R0+#04],使用!后缀R0=R0+#0X4(3)B后缀

B后缀的含义是:指令所涉及的数据是一个字节,不是一个字或半字。共129页21LDRR4,[R0,#12];R4=[R0+12],指令传送一个字LDRBR4,[R0,#12];R4=[R0+12],指令传送一个字节(4)T后缀

指令在特权模式下对存储器的访问,将被存储器看作是用户模式的访问。共129页22

T

后缀使用受很多限制,一般只用在字传送和无符号字节传送中。在用户模式下不可以选用,选用是没有意义的;不能与前变址一起使用。LDRTR4,[R5];R4=[R5]T模式共129页233.2ARM指令的寻址方式

寻址方式:就是处理器根据指令中给出的地址信息来寻找物理地址的方式。

ARM指令集支持有:立即数寻址、寄存器寻址、寄存器间接寻址、基址变址寻址、堆栈寻址、多寄存器寻址等。共129页243.2.1立即寻址

立即寻址也叫立即数寻址。操作数本身就在指令中给出,只要取出了指令也就取到了操作数。MOVR1,#0XFF;R1=0XFFSUBSR0,R0,#2;R0=R0-2,影响标志共129页253.2.2寄存器寻址

寄存器寻址方式把寄存器中的数值作为操作数。MOVR1,R2;R1=R2ADDR0,R1,R2;R0=R1+R23.2.3寄存器间接寻址

以寄存器中的值作为操作数的地址,而操作数本身放在存储器中。共129页26MOVR1,[R2];R1=[R2]错误指令LDRR1,[R2];R1=[R2]3.2.4基址变址寻址

就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。共129页27LDRR2,[R3,#0X0C];R2=[R3+0X0C]STRR1,[R0,#-4]!;R0=R0-4,R1=[R0]LDRR1,[R0,R3,LSL#1];R1=[R0+R3x2]

指令可以在系统存储器合理的范围内基址加上不超过4KB

的偏移量。

有前变址、自动变址、后变址。共129页28(1)前变址模式LDRR1,[R2,#0X5](2)自动变址模式LDRR0,[R1,#4]!

;R0=[R1+4],R1=R1+4(3)后变址模式LDRR0,[R1],#4;R0=[R1],R1=R1+4共129页29使用后变址寻址方式完成表复制程序:COPYADRR1,NEXT1;R1指向NEXT1

ADRR2,NEXT2;R2指向NEXT2LOOPLDRR0,[R1],#4;取一个数

STRR0,[R2],#4;复制一个数

……NEXT1;源数据……NEXT2;目标数据共129页303.2.5堆栈寻址(1)Full栈:堆栈指针指向栈顶元素;(2)Empty栈:堆栈指针指向第一个可用元素;(3)递减栈:堆栈向内存地址减少的方向生成;

根据不同的寻址方式,将堆栈分为以下4

种:共129页3131(4)递增栈:堆栈向内存地址增加的方向生成。根据堆栈的不同种类,将其寻址方式分为以下4

种:(1)满递减FD(FullDescending);(2)空递减ED(EmptyDescending);(3)满递增FA(FullAscending);(4)空递增FA(EmptyAscending)。共129页3232

在ARM指令中,堆栈寻址方式通过Load/Store

指令来实现。STMFDSP!,{R1-R7,LR};将R1~R7、LR入栈,满递减堆栈LDMFDSP!,{R1-R7,LR};数据出栈,放入R1~R7、LR寄存器共129页333.2.6多寄存器寻址LDMIAR1,{R2、R3、R4、R5}3.2.7相对寻址

相对寻址是基址的一种变通,与基址寻址方式基本类似。相对寻址以程序计数器PC

的当前值为基址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。共129页34

BLNEXT;跳转到子程序NEXT

处执行……NEXT……MOVPC,LR;从子程序返回共129页353.3ARM指令集

ARM指令集可以分为:跳转指令、数据处理指令、乘法指令与乘加指令、程序状态寄存器访问指令、加载/存储指令、批量数据加载/存储指令、数据交换指令、移位指令、协处理器指令、异常产生指令等10

大类。共129页36363.3.1跳转指令

执行流程的改变迫使程序计数器(PC)指向一个新的地址,指令集包含的跳转指令如下:助记符说明操作B跳转指令PC←labelBL带返回的连接跳转PC←label(LR←BL后面的第一条指令)BX跳转并切换状态PC←Rm&0xFFFFFFFE,T←Rm&1BLX带返回的跳转并切换状态PC←label,T←1;PC←Rm&0xFFFFFFFE,T←Rm&1;LR←BL后面的第一条指令共129页3737

另一种实现指令跳转的方式是通过直接向PC

寄存器中写入目标地址值,实现在4GB

地址空间中任意跳转,这种跳转又称为长跳转。

如果在长跳转指令之前使用“MOVLR”或“MOVPC”等指令,可以保存将来返回的地址值,也就实现了在4GB的地址空间中的子程序调用。共129页3838

B

指令与BL

指令的编码格式如下:(1)跳转指令B

及带连接的跳转指令BL共129页3939

从代码中看到L

控制了PC

与LR

寄存器之间的开关。当L=0

时,该开关断开,指令为B指令;当L=1

时,该开关接通,指令为BL

指令。B和

BL指令的助记符格式为:B{<cond>}<target>和BL{<cond>}<target>

跳转指令也叫程序转移指令。

可以跳转到一个绝对地址,如:B0X1234。共129页4040

B指令和BL

指令都是以一个24

位有符号数signed_immed_24

间接提供目标地址,真正的目标地址是由处理器根据这个有符号数和当前的PC

值计算出来的。

具体计算为:先将signed_immed_24

左移两位并扩展为32位有符号数,然后再将这32位有符号数与PC

的当前值相加并回送PC。共129页4141

BforwardADDR1,R2,#4

forwardSUBR1,R2,#56

B

和BL

指令转移的偏移量为26

位,即转移的跨度为前后32MB

地址空间。例:现已知寄存器R0

中存放了数据a,寄存器R1

中存放了数据b,编写一个程序段,求取a

和b

的最大公约数并将其存入寄存器R0

。共129页4242

gcbCMPR0,R1;比较a和b的大小

SUBGTR0,R0,R1;如果a>b,则a=a-bSUBLTR1,R1,R0;如果a<b,则b=b-a

BNEgcb;如果a!=b,则返回gcbMOVPC,LR;如果a=b,则返回主程序

B

和BL

的区别在于:BL

在跳转之前会把BL

指令的下一条指令地址(断点地址)保存到连接寄存器LR(R14),因此程序在必要的时候可以通过将LR

的内容进行计算并加载到PC

中使程序返回到跳转点。共129页4343

BL

指令经常被用来调用一个子程序。共129页4444(2)带状态切换的跳转指令BXBX指令的格式为:

BX{<cond>}Rm

BX指令的目标地址由Rm值与#0XFFFFFFFE进行“与”运算得到。根据Rm

最低位的值,目标地址处的指令既可以是ARM

指令,也可以是Thumb

指令。共129页4545共129页4646(3)带连接和状态切换的连接跳转指令BLX

BLX

指令的格式有两种:BLX<target>和

BLX{<cond>}Rm

以target

方式提供目标地址的BLX

指令的功能是:把程序跳转到指令中所指定的目标地址继续执行,并同时将处理器的工作状态从ARM

状态切换到Thumb

状态和将PC

的当前内容保存到寄存器LR

中。共129页4747

而以Rm

方式提供目标地址的BLX

指令,除了跳转和将PC

保存到LR之外,也可进行状态切换,但其切换的依据是Rm最低位的值。如果值为0

,则目标地址处应为ARM

指令,如果值为1

,则目标地址处应为Thumb

指令。共129页483.3.2数据处理指令

数据处理指令分为:算术操作指令、按位逻辑操作指令、寄存器移位指令、比较操作。3.3.2.1算数操作指令

包括:加法指令ADD、减法指令SUB、逆向减法指令RSB、带进位加法指令ADC、带进位减法指令SBC、带借位逆向减法指令RSC。共129页4949(1)ADD指令

加法指令ADD的格式为:ADD{<cond>}{S}<Rd>,<Rn>,<operand2>

ADD

指令把第1

源操作数Rn

和第2

源操作数operand2

相加后,将结果存放到目的操作数Rd。

Rn

为寄存器寻址;operand2

可以为:寄存器寻址、立即寻址、带移位预处理的寄存器寻址。共129页5050

ADD指令的执行如下:共129页5151ADDR0,R1,R2;R0←(R1)+(R2)ADDR0,R1,#255

;R0←(R1)+255ADDR0,R2,R3,LSL#1;R0←(R2)

+(R3<<1)受影响的CPSR标志位取值N寄存器Rd[31]被复制到NZ如果Rd为0,则Z=1,否则Z=0C运算结果有进位C=1,否则C=0V运算结果有溢出V=1,否则V=0改为OX256行吗?例子:共129页5252(2)SUB指令

SUB指令的格式为:SUB{<cond>}{S}<Rd>,<Rn>,<operand2>

SUB指令把Rn

作为被减数,operand2

作为减数进行减法运算,然后将结果存放在Rd。operand2可以是:寄存器寻址方式、立即寻址方式、带移位预处理的寄存器寻址方式。共129页5353

SUB的执行流程为:共129页5454SUBR0,R1,R2;R0←(R1)-(R2)SUBR0,R1,#256;R0←(R1)-256SUBR0,R2,R3,LSL#1;R0←(R2)-

(R3<<1)受影响的CPSR标志位取值N寄存器Rd[31]被复制到NZ如果Rd为0则Z=1,否则Z=0C运算结果有借位则C=0,否则C=1V运算结果有溢出则V=1,否则V=0例:共129页5555(3)ADC指令

ADC指令的格式为:ADC{<cond>}{S}<Rd>,<Rn>,<operand2>

ADC

指令把三个数进行加法运算。即把Rn

与operand2

相加,然后再加上CPRS中的C

标志位的值,最后将结果存放到目的操作数Rd

中。共129页5656

Rn

为寄存器寻址;operand2

可以为:寄存器寻址、立即数寻址、带移位预处理的寄存器寻址。共129页5757

ADC

通常用来实现字长大于32

位的加法运算。

标志位的修改同ADD、只修改N、Z、C、V。

例:有两个128位数,第一个数由高到低存放在寄存器R7~R4

中,第二个数由高到低存放在寄存器R11~R8

中,请编写程序把两个数相加,运算结果由高到低存放到寄存器R3~R0中。共129页58ADDSR0,R4,R8;加低位字,不带进位ADCSR1,R5,R9;加第二个字,带进位ADCSR2,R6,R10;加第三个字,带进位ADCSR3,R7,R11;加第四个字,带进位实现程序为:这段程序有缺陷吗?能否不要这些S

?共129页5959(4)SBC指令

SBC指令的格式为:SBC{<cond>}{S}<Rd>,<Rn>,<operand2>

SBC

指令把Rn

作为被减数,operand2作为减数进行减法运算,然后再减去CPSR

中C

条件标志位的反码,最后将结果存入Rd。共129页6060

SBC指令执行流程为:共129页6161SBCSR0,R1,R2;R0←(R1)-(R2)-!C

该指令主要用于字长大于32

位的数据的减法运算。

标志位的修改同SUB。例子:共129页6262(5)RSB指令

RSB指令的格式为:RSB{<cond>}{S}<Rd>,<Rn>,<operand2>

RSB

指令之所以被称为逆向减法指令,是因为该指令把operand2

作为被减数,而把Rn

作为减数来进行减法运算,运算结果仍然被存入Rd。共129页6363RSBR0,R1,R2;R0←(R2)-(R1)RSBR0,R1,#256;R0←256-(R1)RSBR0,R2,R3,LSL#1;R0←(R3<<1)-

(R2)例子:共129页6464(6)RSC指令

RSC指令的格式为:RSC{<cond>}{S}<Rd>,<Rn>,<operand2>

RSC

指令把operand2

作为被减数,而把Rn

作为减数,然后再减去CPSR中的C

条件标志位的反码,最后将结果存入Rd。

RSCR0,R1,R2共129页653.3.2.2按位逻辑操作指令按位逻辑操作指令包括:逻辑与操作指令AND、逻辑或操作指令ORR、逻辑异或操作指令EOR

以及位清除指令BIC。(1)AND指令AND指令的格式为:AND{<cond>}{S}<Rd>,<Rn>,<operand2>

AND

指令把Rn

和operand2

按位

进行逻辑“与”运算,并把结果存入Rd。共129页6666

AND指令执行流程:共129页6767例:ANDR0,R0,#3;该指令保持R0的0、1位,其余位清零受影响的CPSR标志位取值N寄存器Rd[31]被复制到NZ如果Rd为0则Z=1,否则Z=0CC=0共129页6868(2)ORR指令ORR指令的格式为:ORR{<cond>}{S}<Rd>,<Rn>,<operand2>

ORR

指令把Rn和operand2

按位进行逻辑“或”运算,并把结果存入Rd。ORRR0,R0,#3;该指令设置R0的0、1位,其余位不变例:请把寄存器R2中的高8位数据传送到寄存器R3的低8位。共129页6969MOVR0,R2,LSR#24;将R2右移24位,即将其高8位移至低8位送R0。ORRR3,R0,R3,LSL#8;将R3左移8位后将R0低8位送至R3。

标志位的影响同AND。注意:R2原来的内容没有变注意:R3原来的高24位内容变了共129页7070(3)EOR指令EOR指令的格式为:EOR{<cond>}{S}<Rd>,<Rn>,<operand2>

EOR指令把Rn

和operand2

按位进行逻辑“异或”运算,并把结果存入Rd。EORR0,R0,#3;该指令反转R0的0、1位,其余位保持不变。

标志位的修改同AND。共129页7171(4)BIC指令

BIC指令的格式为:BIC{<cond>}{S}<Rd>,<Rn>,<operand2>

BIC指令的功能是清除Rn

的某些位,并把结果存入Rd。共129页7272

Rn为寄存器寻址方式;operand2

可以是寄存器寻址方式,也可以是立即数寻址方式。Operand2

为32位掩码,如果在掩码中设置了某一位,则清除这一位,未设置的掩码位保持不变。BICR0,R0,#0xB;该指令清除R0中的0、1和3位,其余位保持不变。

标志位的修改同AND。共129页733.3.2.3寄存器移位操作指令

包括:数据传送指令MOV和数据非传送指令MVN。(1)MOV指令

MOV

指令将一个数N

送到目标寄存器Rd

,其中N

可以是寄存器,也可以是立即数。MOV指令的格式为:

MOV{<cond>}{S}<Rd>,<operand2>共129页74

MOV指令的执行流程:共129页7575例:MOVR2,#0x7E

;将立即数0x7E传送到寄存器R2中MOVR1,R0,LSL#3

;将寄存器R0*8传送到寄存器R1受影响的CPSR标志位取值N寄存器Rd[31]被复制到NZ如果Rd为0,则Z=1,否则Z=0CC=0共129页7676(2)MVN指令

MVN指令的格式为:MVN{<cond>}{S}<Rd>,<operand2>

MVN指令在进行数据传送之前,先把源操作数operand2按位取反,然后再传送到目的寄存器Rd。MVNR0,#0;将立即数0取反传送到寄存器R0中,完成后R0=-1。

标志修改同MOV指令,只修改N、Z、C。共129页773.3.2.4比较操作指令

包括:比较指令CMP、负数比较指令CMN、位测试指令TST以及相等测试指令TEQ。(1)CMP指令CMP指令的格式为:CMP{<cond>}<Rd>,<operand2>

CMP指令把Rd

作为被减数和operand2

进行一次减法运算操作,但不存储运算结果,只根据结果来更新CPSR

的相应条件标志位N、Z、C、V。共129页7878受影响的CPSR标志位取值N运算结果的第31位被复制到NZ运算结果为0则Z=1,否则Z=0C运算结果有借位则C=0,否则C=1V运算结果有溢出则V=1,否则V=0CMPR1,R0;(R1)-(R0);根据结果设置CPSR的标志位。CMPR1,#100;(R1)-100;根据结果设置CPSR的标志位。共129页7979

CMN指令把Rd

作为被减数与operand2

的反进行一次减法运算,但不存储结果,只更新CPSR

中条件标志位。(2)CMN指令

CMN指令的格式为:CMN{<cond>}<Rd>,<operand2>注意:比较类指令本身带有更新CPSR的功能,故在该指令中不能使用后缀S。共129页8080(3)TST测试指令TST指令的格式为:TST{<cond>}<Rd>,<operand2>

TST指令的功能是把Rd

和operand2

按位进行逻辑“与”运算,并根据运算结果更新CPSR

中的条件标志位的值。Rd

是要测试的数据,operand2

是一个掩码。该指令一般用来检测是否设置了特定的位。TSTR1,#0x5;测试寄存器R1中的第0位和第2位是否是1。共129页8181

TEQ指令的格式为:TEQ{<cond>}<Rd>,<operand2>

TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位“异或”运算,并根据运算结果更新CPSR

中条件标志位的值。该指令通常用于比较Rd

和Rn是否相等。TEQR1,R2;将R1的值与R2的值按位“异或”,并根据结果设置CPSR的标志位。(4)TEQ指令共129页823.3.3乘法指令与乘加指令

主要包括:乘法指令MUL、乘加指令MLA、无符号长乘法指令UMULL、长乘加指令UMLAL、带符号长乘法指令SMULL以及长乘加指令SMLAL。(1)MUL指令

MUL指令的格式为:MUL{<cond>}{S}<Rd>,<Rm>,<Rs>

MUL

指令把Rm

作为被乘数,Rs

作为乘数进行乘法运算,并把结果存入Rd。共129页8383

MUL的执行流程如下:共129页8484MULR0,R1,R2;R0←(R1)X(R2)MULSR0,R1,R2;R0←(R1)X(R2),同时更新CPSR相关标志位受影响的CPSR标志位取值N寄存器Rd[31]被复制到NZ如果Rd为0则Z=1,否则Z=0例子:共129页8585(2)MLA指令

MLA指令的格式为:MLA{<cond>}{S}<Rd>,<Rm>,<Rs>,<Rn>

MLA

指令把Rm

作为被乘数,Rs

作为乘数,然后再将乘积加上Rn,最后将结果存入Rd。MLAR0,R1,R2,R3;R0←(R1)X(R2)+(R3)MLASR0,R1,R2,R3;R0←(R1)X(R2)+(R3),并更新CPSR标志位

标志位的修改同MUL。共129页8686(3)SMULL指令

SMULL指令的格式为:SMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>

SMULL

指令把Rm

作为被乘数,Rs

作为乘数进行乘法运算,并把结果的低32位存入目的寄存器RdLo,结果的高32位存入目的寄存器RdHi。所有操作数均为寄存器寻址。共129页8787

SMULLR0,R1,R2,R3;R0←(R2)X(R3)的低32位,R1←(R2)X(R3)的高32位受影响的CPSR标志位取值N寄存器RdHi[31]被复制到NZ如果RdHi且Rdlo为0,则Z=1,否则Z=0共129页8888(4)SMLAL指令SMLAL指令格式为:SMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>

SMLAL

指令把Rm

作为被乘数,Rs

作为乘数进行乘法运算,并把结果的低32位同RdLo

原有的值相加后再存入目的寄存器RdLo

;同样结果的高32位同RdHi

原有的值相加后再存入目的寄存器RdHi。所有操作数均为寄存器寻址。共129页8989

SMLALR0,R1,R2,R3;R0←(R2)X(R3)的低32位+R0,R1←(R2)X(R3)的高32位+R1

标志的修改同SMULL。共129页9090(5)UMULL指令

UMULL指令的格式为:UMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>

UMULL指令把Rm

作为被乘数,Rs

作为乘数进行乘法运算,并把结果的低32位存入目的寄存器RdLo

;结果的高32位存入目的寄存器RdHi。所有操作数均为寄存器寻址,且两个源操作数应为无符号数。共129页9191

UMULLR0,R1,R2,R3;

R0←(R2)X(R3)的低32位,

R1←(R2)X(R3)的高32位

标志的修改同SMULL。共129页9292

UMLAL

指令把Rm

作为被乘数,Rs

作为乘数进行乘法运算,并把结果的低32位同RdLo

原有的值相加后再存入目的寄存器RdLo;同样结果的高32位同RdHi

原有的值相加后再存入目的寄存器RdHi。所有操作数均为寄存器寻址,且两个源操作数应为无符号数。(6)UMLAL指令

UMLAL指令格式为:UMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>共129页9393

UMLALR0,R1,R2,R3;

R0←(R2)X(R3)的低32位+(R0),R1←(R2)X(R3)的高32位+(R1)

标志的修改同SMULL。共129页9494

MRS指令的格式为:

MRS{<cond>}<Rd>,CPSR

MRS{<cond>}<Rd>,SPSR

MRS

指令的功能是将程序状态寄存器的内容传送到通用寄存器Rn。MRSR0,CPSR;传送CPSR的内容到R0MRSR0,SPSR;传送SPSR的内容到R0(1)MRS指令3.3.4程序状态寄存器访问指令共129页9595

32

位的程序状态寄存器可以分为4个域,这4个域在指令中可以分别用f、s、x、c

来表示。域在指令中的表示位域说明f[31:24]条件标志域s[23:16]状态位域x[15:8]扩展位域c[7:0]控制位域(2)MSR指令

程序状态寄存器常用的两个域为:条件标志位域和控制位域。共129页9696在ARMV5及以上版本的E系列处理器中,用Q标志位指示增强的DSP运算指令是否发生了溢出。在其他版本的处理器中,Q标志位无定义。共129页9797

MSR指令的格式为:MSR{<cond>}CPSR_<fields>,<operand2>MSR{<cond>}SPSR_<fields>,<operand2>

MSR指令可以把operand2

的内容传送到程序状态寄存器的特定域中。其中operand2可以为通用寄存器或立即数,fields

用于指定程序状态寄存器中需要操作的位域,为f、s、x、c。共129页9898MSRCPSR,R0;传送R0的内容到CPSRMSRSPSR,R0;传送R0的内容到SPSRMSRCPSR_c,R0;传送R0的内容到CPSR,但仅仅修改CPSR中的控制位域MSRCPSR_CFXS,R0;传送R0的内容到CPSR,修改所有域

C、F、X、S大小写都可以,顺序也可任意。共129页993.3.5加载/存储指令

包括字数据加载指令LDR

、字节数据加载指令LDRB

、半字数据加载指令LDRH

;字数据存储指令STR

、字节数据存储指令STRB

、半字数据存储指令STRH。(1)LDR指令

字加载指令LDR

的格式为:LDR{<cond>}<Rd>,<address_mode>

LDR指令的功能是把存储在存储器中的一个32位字数据传送到目的操作数Rd。共129页100100例:已知(R0)=0X00000000和(R1)=0X00009000,并已知在存储器中首地址为0X00009000

的区域中存放了数据0X01010101,在首地址为0X00009004

的区域存放了数据0X02020202。试写出执行了指令LDRR0,[R1,#4]后R0

和R1

中的数据。(R0)=0X02020202(R1)=0X00009000共129页101101例:条件如上题,试写出执行了指令LDRR0,[R1,#4]!后的R0

和R1

中的数据。(R0)=0X02020202(R1)=0X00009004例:条件如上题,试写出执行了指令LDRR0,[R1],#4后R0

和R1

中的数据。(R0)=0X01010101(R1)=0X00009004共129页102LDRR1,[R0,#0X12];将R0+12地址处的数据读出,保存到R1中(R0的值不变)LDRR1,[R0,R2,LSL#02];将R0+R*4地址处的数据读出,保存到R1中(R0、R2的值不变)LDRRd,label;label为程序标号,label必须是当前指令-4~4KB范围内共129页103103(2)LDRB指令

字节加载指令LDRB

的格式为:

LDR{cond}B<Rd>,<address_mode>

LDRB

指令的功能是从存储器中将一个8

位的字节数据传输到Rd,同时将寄存器的高24位清零。LDRBR0,[R1,#8];R0←((R1)+8),并将R0的高24位清零。共129页104104(3)LDRH指令

半字加载指令LDRH

的格式为:

LDR{cond}H<Rd>,<address_mode>

LDRH

指令的功能是把存储器中的16

位半字数据传送到Rd,同时将寄存器的高16位清零。LDRHR0,[R1,#8];R0←((R1)+8),并将

R0的高16位清零共129页105105

字存储指令STR

的格式如下:

STR<Rd>,<address_mode>(4)STR指令

STR指令的功能是把一个32

位源操作数传送到存储器中。STRR0,[R1,#8];(R0)→((R1)+8)共129页106106①变量访问NumCountequ0x4000300

LDRR0,=NumCount

LDRR1,[R0]

ADDR1,R1,#1

STRR1,[R0]

关于汇编有ARMASM和GNUASM,两者形式上有差异,ARMASM的伪代码前不要“.”,伪代码要顶格书写。共129页107②GPIO设置GPIO_BASEequ0xE0028000……

LDRR0,=GPIO_BASE

LDRR1,=0X00FFFF00

STRR1,[R0,#0X0C]……只能用下划线。共129页108③程序跳转……

MOVR2,R2,LSL#2LDRPC,[PC,R2]

NOPFUN_TABDCDFUN_SUB0

DCDFUN_SUB1DCDFUN_SUB2……

只能用下划线,ARMASM中没有WORD,该程序不好理解。共129页109109

字节存储指令STRB

的格式为:

STR{cond}B<Rd>,<address_mode>(5)STRB指令

STRB

指令的功能是把一个32

位源操作数的低8位传送到存储器中。STRBR0,[R1,#8];(R0)的低8位→((R1)+8)共129页110110

半字存储指令STRH

的格式为:STR{cond}H<Rd>,<address_mode>

STRH

指令的功能是把一个32

位源操作数的低16位传送到存储器中。STRHR0,[R1,#8];(R0)→((R1)+8)(6)STRH指令共129页111111

多寄存器的Load/Store

内存访问指令也叫批量加载/存储指令,它可以实现一组寄存器和一块连续的内存单元之间传送数据。

加载指令LDM用于将一片连续的存储器中的数据传送到多个寄存器;批量数据存储指令STM

则完成相反的功能。3.3.6批量数据加载/存储指令共129页112112

LDM和STM指令的格式分别为:LDM{<cond>}{mode}<Rd>{!},<reglist>{^}STM{<cond>}{mode}<Rd>{!},<reglist>{^}

Rd

为数据块的基地址寄存器,除R15

之外其他寄存器都可以作为基地址寄存器。

reglist

为存储数据块的寄存器列表,其中包含一个或多个序号从小到大排列的寄存器。当寄存器不连续时,中间使用“,”隔开。共129页113113

“!”为可选后缀。若选用该后缀,则当数据块传送完毕之后,基址寄存器Rd

会保存数据块最后地址;否则基地址寄存器Rd

的内容不变。

地址中的内容与寄存器列表的对应关系:小地址对应小寄存器编号,大地址对应大寄存器编号。共129页114114

“^”为可选后缀。当指令为LDM

且寄存器列表中包含R15(PC)时,选用该后缀表示除了正常的数据传送之外,还将SPSR复制到CPSR

;而当寄存器列表中不包含R15(PC)时,使用该后缀则表示在用户模式中进

温馨提示

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

评论

0/150

提交评论