【文档说明】《嵌入式系统基础教程》第09讲_第5章ARM指令集特点、寻址方式和指令课件.ppt,共(88)页,986.523 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-76371.html
以下为本文档部分文字说明:
《嵌入式系统原理与开发》第9讲南京大学计算机系俞建新主讲2008年春季2008年6月28日南京大学计算机系2第5章ARM指令集和汇编语言程序本章主要介绍以下内容:ARM指令集的基本特点与Thumb指令集的区别与x86处理器的区别ARM指令格式A
RM寻址方式ARM指令集分类详解ARM汇编语言的指示符ARM汇编语言语句格式ARM汇编语言程序格式ARM汇编语句格式和程序格式进阶ARM汇编语言程序举例2008年6月28日南京大学计算机系35.1ARM指令
集基本特点指令集的异同点ARM、Thumb、x86ARM指令集的语法ARM指令集的编码格式指令条件码表第2操作数2008年6月28日南京大学计算机系4ARM指令集和Thumb指令集的共同点ARM指令集和Thumb指令集具有以下共同点:⒈较多的寄存器
,可以用于多种用途。⒉对存储器的访问只能通过Load/Store指令。两种指令集的差异特征在下页给出2008年6月28日南京大学计算机系5ARM指令集和Thumb指令集的不同点项目ARM指令Thumb指令
指令工作标志CPSR的T位=0CPSR的T位=1操作数寻址方式大多数指令为3地址大多数指令为2地址指令长度32位16位内核指令58条30条条件执行大多数指令只有分支指令数据处理指令访问桶形移位器和ALU独立的桶形移位器和ALU指令寄存器使用15个通用寄存器+PC8个通用低寄存器+7个高寄存器+P
C程序状态寄存器特权模式下可读可写不能直接访问异常处理能够全盘处理不能处理2008年6月28日南京大学计算机系6ARM指令集与x86指令集的主要不同点ARM指令集规整指令格式即:正交指令格式三地址指令由指令的附加位决定运算完毕后是否
改变状态标志状态标志位只有4位有两种指令密度无整数除法指令大多数ARM指令都可以条件执行有适合DSP处理的乘加指令Load/Store访存体系结构x86指令集非规整指令格式即:非正交指令格式二地址指令指令
隐含决定运算完毕后是否改变状态标志状态标志位有6位单一指令密度有整数除法指令专用条件判断指令进行程序分支没有适合DSP处理的乘加指令运算指令能够访问存储器2008年6月28日南京大学计算机系7ARM指令
集的编码格式参看ARM指令集编码格式PDF文件2008年6月28日南京大学计算机系8ARM指令集的语法一条典型的ARM指令语法如下所示:<opcode>{<cond>}{S}<Rd>,<Rn>{,<Operand2>}其中:<opcode>是指令助记
符,决定了指令的操作。例如:ADD表示算术加操作指令。{<cond>}是指令执行的条件,可选项。{S}决定指令的操作是否影响CPSR的值,可选项。<Rd>表示目标寄存器,必有项。<Rn>表示包含第1个操
作数的寄存器,当仅需要一个源操作数时可省略。<Operand2>表示第2个操作数,可选项。第2操作数有两种格式:#immed_8r,Rm{,Shift}2008年6月28日南京大学计算机系9ARM数据处理指令中第2操作数的编码格式图解cond00opcodeSRn
RdOperand2312827262524212019161512110#目的寄存器第1操作数寄存器是否修改CPSR条件标志位算术/逻辑功能#rotate#shift8位立即数118702512508位立即数循环右移长度11870Sh0Rm34056Rs1
1870Sh0Rm34056立即数移位长度移位类型第2操作数寄存器移位长度寄存器第一种第2操作数格式#immed_8r第二种第2操作数格式Rm{,shift}2008年6月28日南京大学计算机系10灵活的第2操作数立即数型
格式:#<32位立即数>也写成#immed_8r#<32位立即数>是取值为数字常量的表达式,并不是所有的32位立即数都是有效的。有效的立即数很少。它必须由一个8位的立即数循环右移偶数位得到。原因是32位ARM指令中条件码
和操作码等占用了一些必要的指令码位,32位立即数无法编码在指令中。举例:ADDr3,r7,#1020;#immed_8r型第2操作数,;1020是0xFF循环右移30位后生成的32位立即数;推导:1
020=0x3FC=0x000003FC2008年6月28日南京大学计算机系11灵活的第2操作数(续1)数据处理指令中留给Operand2操作数的编码空间只有12位,需要利用这12位产生32位的立即数。其方法是:把指令最低8位(bit[7:0])立即数循
环右移偶数次,循环右移次数由2*bit[11:8](bit[11:8]是Operand2的高4位)指定。例如:MOVR4,#0x8000000A;其中的立即数#0x8000000A是由8位的0xA8
循环右移0x4位得到。又例如:MOVR4,#0xA0000002;其中的立即数#0xA0000002是由8位的0xA8循环右移0x6位得到。2008年6月28日南京大学计算机系12灵活的第2操作数(续2)寄存
器移位型格式:Rm{,<shift>}Rm是第2操作数寄存器,可对它进行移位或循环移位。<shift>用来指定移位类型(LSL,LSR,ASR,ROR或RRX)和移位位数。其中移位位数有两种表示方式,一种是5位立即数(#shift),另外一种是位移量寄存器Rs的值。参看下面的
例子。例子中的R1是Rm寄存器。ADDR5,R3,R1,LSL#2;R5←R3+R1*4ADDR5,R3,R1,LSLR4;R5←R3+R1*2R4;R4是Rs寄存器,Rs用于计算右移次数2008年6月28日南京大学计算机系13详解第2操作数#immed_8r该常数必
须对应8位位图,即常数是由一个8位的常数循环右移位偶数位得到。例如:合法常量:0x3FC、0、0xF0000000、200、0xF0000001。非法常量:0x1FE、511、0xFFFF、0x1010、0xF00000
10。常数表达式应用举例:MOVR0,#1;R0=1ANDR1,R2,#0x0F;R2与0x0F,结果保存在R1LDRR0,[R1],#-4SUBR4,R2,#D4000002;该立即数是0xBE循环右移6位;课堂练习此第2操作数2008年6月28日南京大学计算机系14详解第2操作
数的Rm寄存器(1)RM寄存器通常是存放第2操作数的寄存器<opcode>{<cond>}{S}<Rd>,<Rn>{,RM{,shift}}举例:SUBR1,R1,R2;R1-R2→R1MOVPC,R0;PC←R0,程序跳转到指定地址LDRR
0,[R1],-R2;读取R1地址上的存储器单元内容并存入R0,;且R1=R1-R2,后索引偏移ANDR0,R5,R2;R2中存放的是第2操作数;该数据属于寄存器方式的第2操作数2008年6月28日
南京大学计算机系15详解第2操作数的Rm寄存器(2)ADDR0,R0,R0,LSL#2;执行结果R0=5*R0ADDR5,R3,R1,LSL#2;R5←R3+R1*4ADDR5,R3,R1,LSLR4;R5←R3+R1*2
R42008年6月28日南京大学计算机系16寄存器移位方式生成的第2操作数Rm{,shift}将寄存器的移位结果作为操作数,但Rm值保存不变,移位方法如下:ASR#n;算术右移n位(1≤n≤32)。L
SL#n;逻辑左移n位(1≤n≤31)。LSR#n;逻辑右移n位(1≤n≤32)。ROR#n;循环右移n位(1≤n≤31)。RRX;带扩展的循环右移1位。2008年6月28日南京大学计算机系17桶型移位器移位操作:TypeRs其中,Type为ASR、LSL、LSR和RO
R中的一种;Rs为偏移量寄存器,最低8位有效。若其值大于或等于32,则第2个操作数的结果为0(ASR、LSR例外)。例如MOVSR3,R1,LSL#7;R3←R1*1282008年6月28日南京大学计算机系18寄存器位移方式生成第2操作数应用举例ADDR1,R1,R1,LSL#3;R1=R1
*9,因为R1←R1+R1*8。SUBR1,R1,R2,LSR#2;R1=R1-R2÷4,;因为R2右移2位相当于R2除以4。EORR11,R12,R3,ASR#5;R11=R12⊕(R3÷32);第2操作数是R3的内容除以322008年6月28日南京大学计算机系19寄存器位移方式生成第2操作
数应用举例(续)MOVSR4,R4,LSR#32;C标志更新为R4的位[31],R4清零。;参看本课程教材第119页R15为处理器的程序计数器PC,一般不要对其进行操作,而且有些指令是不允许使用R15的,如UMULL指令
。2008年6月28日南京大学计算机系20ARM处理器的CPSR寄存器和SPSR寄存器的位定义格式图解参看教材第4.2.3节NM1M0M3M2TM4IFZCVQDNM(RAZ)012345672627282930318条件码标志DSP指令运算结果出现饱和或者溢出控制标志位F=1标志运行Thu
mb指令集DNM(DoNotModify)位,将来扩展预留位;初始化时为零。RAZ(AppearasZerowhenRead)。I=1普通中断关闭F=1快速中断关闭2008年6月28日南京大学计算机系21指令条件码表(1)条件码助记符标志含义EQZ=1相等NEZ=0不相等CS
/HSC=1无符号数大于或等于CC/LOC=0无符号数小于MIN=1负数(minus)PLN=0正数或零VSV=1上溢出VCV=0没有上溢出2008年6月28日南京大学计算机系22指令条件码表(2)条件码助记符标志含
义HIC=1,Z=0无符号数大于LSC=0,Z=l无符号数小于或等于GEN=V有符号数大于或等于LTN!=V有符号数小于GTZ=0,N=V有符号数大于LEZ=1,N!=V有符号数小于或等于AL任何无条件执行(指令
默认条件)NVARMv3之前该指令从不执行2008年6月28日南京大学计算机系235.2ARM处理器寻址方式寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有8种基本寻址方式,以下列出:–寄存器寻址-立即寻址–寄存器偏移寻址-寄存器间接寻址–基址寻址-
多寄存器寻址–堆栈寻址-相对寻址2008年6月28日南京大学计算机系24寄存器寻址操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:MOVR1,R2;读取R2的值送到R1MOVR0,R0;R0=R0,相当于无
操作SUBR0,R1,R2;R0←R1-R2;将R1的值减去R2的值,结果保存到R0ADDR0,R1,R2;R0←R1+R2;这条指令将两个寄存器(R1和R2)的内容相加,结果放入第3个寄存器R0中。必须注意写操作数的顺序:第1个是结果寄存器,然后是第一操作数寄存器,最后是第二操作数寄
存器。2008年6月28日南京大学计算机系25立即寻址立即寻址指令中的操作码字段后面的地址码部分即是操作数本身。也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:SUBSR0,R0,#1;R0减1,结果放入R0,并且影响
标志位MOVR0,#0xFF000;将十六进制立即数0xFF000装入R0寄存器立即数要以“#”号为前缀,16进制数值时以“0x”表示。2008年6月28日南京大学计算机系26寄存器偏移寻址寄存器偏移寻址是ARM指令集特有的寻址方式。当第
2作数是寄存器偏移方式时,第2个寄存器操作数在与第1操作数结合之前,选择进行移位操作。寄存器偏移寻址指令举例如下:MOVR0,R2,LSL#3;R2的值左移3位,结果放入R0,即R0=R2×8ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然后与R1相“与
”,结果放入R1,并且影响标志位。SUBR11,R12,R3,ASR#5;R12―R3÷32,然后存入R11。2008年6月28日南京大学计算机系27寄存器偏移寻址(续)可采用的移位操作如下:LSL:逻辑左移(LogicalShiftLeft),低端空出位补0。L
SR:逻辑右移(LogicalShiftRight),高端空出位补0。ASR:算术右移(ArithmeticShiftRight),移位过程中保持符号位不变,即若源操作数为正数,则字的高端空出的位补0;否则补1。ROR:循环右移(Rotat
eRight),由字低端移出的位填入字高端空出的位。RRX:带扩展的循环右移(RotateRightextendedbylplace),操作数右移1位,高端空出的位用原C标志值填充。如果指定后缀“S”,则将Rm原值的位[0]移到进位标志。2008年
6月28日南京大学计算机系28移位操作示意图各种移位操作如下图所示:(c)ASR移位操作(d)ROR移位操作00(e)RRX移位操作C(a)LSL移位操作(b)LSR移位操作2008年6月28日南京大学计算机系29寄存器间接寻址寄存器间接
寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDRR1,[R2]将R2指向的存储单元的数据读
出,保存在R1中。SWPR1,R1,[R2]将寄存器R1的值与R2指定的存储单元的内容交换2008年6月28日南京大学计算机系30SWP指令操作图解(a)SWP指令的一般性操作(b)当Rm等同Rd时,SWP指令的操作tempRdRmRn存储器复制操作1复制操作3寄存器tempRdRn存储
器复制操作1复制操作2复制操作3寄存器指针指针复制操作22008年6月28日南京大学计算机系31基址寻址基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:LDRR2
,[R3,#0x0C]读取R3+0x0C地址上的存储单元的内容,放入R2。STRR1,[R0,#-4]!;[R0-4]←[R1],R0=R0-4,符号“!”表明指令在完成数据传送后应该更新基址寄存器,否则不更新;属前索
引。2008年6月28日南京大学计算机系32基址寻址指令举例LDRR1,[R0,R3,LSL#1];将R0+R3×2地址上的存储单元的内容读出,存入R1。LDRR0,[R1,R2,LSL#2]!;将内存起始地址为R1+R2*4的字数据读取到R0中,;同时修改R1,使得:R1=R1+R2*
4。LDRR0,[R1,R2]!;以R1+R2值为地址,访问内存。将该位置的字数据读;取到R0中,同时修改R1,使得:R1=R1+R2。;属于前索引指令2008年6月28日南京大学计算机系33多寄存器寻址多寄
存器寻址即是一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:LDMIAR1!,{R2-R7,R12};将R1指向的单元中的数据读出到R2~R7、R12中;(R1自动增加)STMIAR0!,{R2-R7,R12}
;将寄存器R2~R7、R12的值保存到R0指向的存储单元中,;(R0自动增加)使用多寄存器寻址指令时,寄存器子集的顺序是按由小到大的顺序排列,连续的寄存器可用“-”连接;否则用“,”分隔书写。2008年6月28日
南京大学计算机系34多寄存器寻址(续1)多寄存器寻址指令举例LDMIAR1!,{R0,R2,R5};;R0←[R1];R2←[R1+4];R5←[R1+8];R1保持自动增值;寄存器列表{R0,R2,R5}与{R2,R0,R5}等效
多寄存器指令的执行顺序与寄存器列表次序无关,而与寄存器的序号保持一致。2008年6月28日南京大学计算机系35多寄存器指令的执行顺序举例1通过ADS集成开发环境的AXD调试器窗口观察2008年6月28日南京大学计算机系36多寄
存器指令的执行顺序举例2通过ADS集成开发环境的AXD调试器窗口观察2008年6月28日南京大学计算机系37多寄存器寻址(续2)下面是多寄存器传送指令STM举例如下:STMIAR0!,{R1—R7};将R1~R7的数据保存到存储器中。存储指针在保存第一;个值之后增加,增
长方向为向上增长STMIBR0!,{R1—R7};将R1~R7的数据保存到存储器中。存储指针在保存第一;个值之前增加,增长方向为向上增长STMDAR0!,{R1—R7};将R1~R7的数据保存到存储器中。存储指针在保存第一;个值
之后增加,增长方向为向下增长STMDBR0!,{R1—R7};将R1~R7的数据保存到存储器中。存储指针在保存第一;个值之前增加,增长方向为向下增长2008年6月28日南京大学计算机系38堆栈寻址存储器堆栈
可分为两种:向上生长:向高地址方向生长,称为递增堆栈。向下生长:向低地址方向生长,称为递减堆栈。满堆栈堆栈指针指向最后压入的堆栈的有效数据项空堆栈堆栈指针指向下一个待压入数据的空位置2008年6月28日南京
大学计算机系39堆栈寻址(续1)有4种类型的堆栈组合满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等。空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STM
EA等。满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等。空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED、STMED等。2008年6月28日南京大学计算机系40堆栈寻址(续2)堆栈寻址
指令举例如下:STMFDSP!,{R1—R7,LR};将R1~R7、LR入栈(push),满递减堆栈。LDMFDSP!,{R1—R7,LR};数据出栈(pop),放入R1~R7、LR寄存器。;满递减堆栈2008年6月28日南京大学计算机系41多寄存器传送指令映
射表STM=将寄存器内容存入内存单元(堆栈操作:入栈)LDM=将内存单元内容存入寄存器(堆栈操作:出栈)向上生长向下生长指针满指针满指针空指针空LDMIBLDMEDSTMIBSTMFASTMIASTMEALDMIALDMFDLDMDBLDMEASTMDBSTMFDSTMDASTMEDLD
MDALDMFA地址增加在传送之后地址增加在传送之前地址减小在传送之前地址减小在传送之后地址变化的方向地址变化的关系传送与2008年6月28日南京大学计算机系42多寄存器传送指令说明数据块传送:I=向地址增大方向处理数据传送(Increment)D=向地址减小方向处理数据传送(Dec
rement)A=先传送数据后改变地址(after)B=先改变地址后传送数据(before)堆栈操作:F=满栈顶指针(full)E=空栈顶指针(empty)A=堆栈向高地址方向增长(ascendingstack)D=堆栈向低地址方向增长(decendingstac
k)2008年6月28日南京大学计算机系43相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:BLSUBR1;保存子程序返回地址;调用到
SUBR1子程序BEQLOOP;条件跳转到LOOP标号处…LOOPMOVR6,#1…SUBR1…相对寻址2008年6月28日南京大学计算机系44相对寻址举例BLSUBR;转移到SUBR……………...SUBR…..;子程序入口…..MOVPC,R14;返
回;R14也就是LR2008年6月28日南京大学计算机系455.3ARM指令集分类详解ARM指令集大致分为6类:分支指令、Load/Store指令、数据处理指令、程序状态寄存器指令、异常中断指令、协处理器指令。以下分别介绍其中的主要指令。2008年
6月28日南京大学计算机系465.3.1分支指令ARM有两种方法可以实现程序分支转移。跳转指令所谓的长跳转直接向PC寄存器(R15)中写入目标地址。ARM跳转指令有以下4种:①B分支指令,语法B{
cond}label②BL带链接分支指令语法:BL{cond}label③BX分支并可选地交换指令集语法:BX{cond}Rm④BLX带链接分支并可选择地交换指令集。语法:BLX{cond}label|Rm2008年6月2
8日南京大学计算机系47BL指令举例BL指令的意义:BranchandLink示例:……..……..blMyPro;调用子程序MyPro………..MyPro;子程序MyPro本体………..………..movPC,LR;将R14的值送入R15,返回2008年6月28日南京大学计算机系48BX指令
使用举例通过使用BX指令可以让ARM处理器内核工作状态在ARM状态和Thumb状态之间进行切换。参看下例:;从ARM状态转变为Thumb状态LDRR0,=Sub_Routine+1BXR0;从Thumb状态转变为ARM状态LDRR0,=Sub_RoutineBXR02008年6月
28日南京大学计算机系49长跳转直接向PC寄存器写入目标地址值,可以实现4GB地址空间中的任意跳转。示例:以下的两条指令实现了4GB地址空间中的子程序调用。MOVLR,PC;保存返回地址MOVR15,#0x00110000
;无条件转向绝对地址0x110000;此32位立即数地址应满足单字节循环右移偶数次2008年6月28日南京大学计算机系505.3.2Load/Store指令Load/Store指令用于在存储器和处理器之间传输数据。Load用于把内存
中的数据装载到寄存器,Store指令用于把寄存器中的数据存入内存。共有3种类型的Load/Store指令:单寄存器传输指令多寄存器传输指令交换指令2008年6月28日南京大学计算机系51单寄存器传送指令助
记码操作指令描述LDR把一个字装入一个寄存器Rd←mem32[address]STR从一个寄存器保存一个字Rd→mem32[address]LDRB把一个字节装入一个寄存器Rd←mem8[address]ST
RB从一个寄存器保存一个字节Rd→mem8[address]LDRH把一个半字装入一个寄存器Rd←mem16[address]STRH从一个寄存器保存一个半字Rd→mem16[address]LDRSB把一个有符号字节装入寄存器Rd←符号扩展(mem8[address])LD
RSH把一个有符号半字装入寄存器Rd←符号扩展(mem16[address])2008年6月28日南京大学计算机系52Load/Store指令变址模式变址模式有四种:零偏移、前变址、后变址、回写前变址。变址模式数据基址寄存器指令举例零
偏移mem[base]直接基址寄存器寻址LDRr0,[r1]回写前变址mem[base+offset]基址寄存器加偏移量LDRr0,[r1,#4]!前变址mem[base+offset]不变LDRr0,[r1,#4]后变址mem[base]基址寄存器加偏移量LDRr0,[r1],#42
008年6月28日南京大学计算机系53单寄存器传送指令举例LDRR2,[R3,#0x0C]读取R3+0x0C地址上的一个字数据内容,放入R2。属前变址。STRR1,[R0,#-4]![R0-4]←[R1],R0=R0-4,符号“!”表明指令在完成数据传送后应该更新基址寄存
器,否则不更新;属回写前变址。LDRR1,[R0,R3,LSL#1]将R0+R3×2地址上的存储单元的内容读出,存入R1。2008年6月28日南京大学计算机系545.3.3数据处理指令ARM数据处理指令大致分为以下6种类型。数据传送指令算术运算指令逻辑运算指令比较指令测试指令乘法
指令2008年6月28日南京大学计算机系55ARM数据处理指令ARM数据处理指令大致可分为3类:数据传送指令(如MOV、MVN);算术逻辑运算指令(如ADD、SUB、AND);比较指令(如CMP、TST)。参见下面的表
格数据处理指令只能对寄存器的内容进行操作。所有ARM数据处理指令均可选择使用S后缀,以影响状态标志。比较指令CMP、CMN、TST和TEQ不需要后缀S,它们会直接影响状态标志。2008年6月28日南京大学计算机系56ARM数据处理
指令集助记符说明操作条件码位置MOVRd,operand2数据传送指令Rd←operand2MOV{cond}{S}MVNRd,operand2数据非传送指令Rd←(~operand2)MVN{cond}{S}ADDRd,Rn,operand2加法运算指令Rd←Rn+operand2ADD{
cond}{S}SUBRd,Rn,operand2减法运算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向减法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,o
perand2带进位加法指令Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2带进位减法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2带进位
逆向减法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}2008年6月28日南京大学计算机系57ARM数据处理指令集(续)助记符说明操作条件码位置ANDRd,Rn,operand2逻辑“与”操作指令Rd←Rn&operand2AND{cond}{
S}ORRRd,Rn,operand2逻辑“或”操作指令Rd←Rn|operand2ORR{cond}{S}EORRd,Rn,operand2逻辑“异或”操作指令Rd←Rn^operand2EOR{cond}{S}BICRd,Rn,operand2
位清除指令Rd←Rn&(~operand2)BIC{cond}{S}CMPRn,operand2比较指令标志N,Z,C,V←Rn-operand2CMP{cond}CMNRn,operand2负数比较指令标志N,Z,C,V←Rn+operand2CMN{cond}TSTRn,operand
2位测试指令标志N,Z,C,V←Rn&operand2TST{cond}TEQRn,operand2相等测试指令标志N,Z,C,V←Rn^operand2TEQ{cond}2008年6月28日南京大学计算机系58乘
法指令ARM7TDMI(-S)具有32×32乘法指令、32×32乘加指令,32×32结果为64位的乘/乘加指令。ARM乘法指令如下表所列。助记符说明操作条件码MULRd,Rm,Rs32位乘法指令Rd+Rm×Rs(Rd!=(Rm)MUL{Cond}{S}MLARd,Rm,Rs
,Rn32位乘加指令Rd←Rm×Rs+Rn(Rd!=Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)←Rm×RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位无符号
乘加指令(RdLo,RdHi←Rm×Rs+(RdLo,RdHi)UMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符号乘法指令(RdLo,RdHi)←Rm×RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符号乘加指令(RdLo,R
dHi←Rm×Rs+(RdLo,RdHi)SMLAL{cond}{S}2008年6月28日南京大学计算机系595.3.4程序状态寄存器指令读状态寄存器指令MRS写状态寄存器指令MSR指令举例开中断与关中断2008年6月28日南京大学计算机系60读状态寄存器指令MRS在ARM
处理器中,只有MRS指令可以将状态寄存器CPSR或SPSR读出到通用寄存器中。指令格式如下:MRS{cond}Rd,psr其中:Rd目标寄存器。Rd不允许为R15。psrCPSR或SPSR。指令举例如下:MRSR1,CPSR
;将CPSR状态寄存器读取,保存到R1中。MRSR2,SPSR;将SPSR状态寄存器读取,保存到R2中。2008年6月28日南京大学计算机系61写状态寄存器指令MSR在ARM处理器中,只有MSR指令可以直接设置状态寄存器CPSR或SP
SR。指令格式如下:MSR{cond}psr_fields,#immed_8rMSR{cond}psr_fields,Rm其中:psrCPSR或SPSR。fields指定传送的区域。2008年6月28日南京大学计算机系62写
状态寄存器指令MSR(续)fields可以是以下的一种或多种;(字母必须为小写);c控制域屏蔽字节(psr[7…0]);x扩展域屏蔽字节(psr[15…8]);s状态域屏蔽字节(psr[23…16]);f标志域屏蔽字节(psr[31…24])。immed_8
r要传送到状态寄存器指定域的立即数,8位。Rm要传送到状态寄存器指定域的数据的源寄存器。2008年6月28日南京大学计算机系63MSR指令举例MSR指令举例如下:MSRCPSR_c,#0xD3;CPSR[7…0]=0xD3,即切换到管理模式,0b11010011MSRCPSR_c
xsf,R3;CPSR=R32008年6月28日南京大学计算机系64使能IRQ中断(开中断)ENABLE_IRQMRSR0,CPSRBICR0,R0,#0x80MSRCPSR_c,R0MOVPC,LRI位=0开中断2008年6月28日南京大学计算机系65禁能IRQ中断(关中
断)DISABLE_IRQMRSR0CPSRORRR0,R0,#0x80MSRCPSR_c,R0MOVPC,LRI位=1关中断2008年6月28日南京大学计算机系66MSR指令说明程序中不能通过MSR指令直接修改CPSR中的T控
制位来实现ARM状态/Thumb状态的切换,必须使用BX指令完成处理器状态的切换(因为BX指令属分支指令,它会打断流水线状态,实现处理器状态切换)。MRS与MSR配合使用,实现CPSR或SPSR寄存器的读一修改一写操作,可用来进行处理器模式切换、允许/禁止IRQ/FIQ中断等
设置,如下面的程序清单所示。2008年6月28日南京大学计算机系67堆栈指令初始化INITSTACKMOVR0,LR;保存返回地址MSRCPSR_c,#0xD3LDRSP,StackSvc;设置管理模式堆栈,M[4:0]=0b
10011MSRCPSR_c,#0xD2LDRSP,StackIrq;设置中断模式堆栈,M[4:0]=0b10010MOVPC,R02008年6月28日南京大学计算机系685.3.5软中断指令SWISWI指令用于产生软中断,
从而实现从用户模式变换到管理模式,CPSR保存到管理模式的SPSR中,执行转移到SWI向量。在其它模式下也可使用SWI指令,处理器同样地切换到管理模式。指令格式如下:SWI{cond}immed_24//Thumb指令是im
med_8其中:immed_24是24位立即数,值为0~16,777,215之间的整数。立即数用于指定指令请求的具体SWI服务。指令举例如下:SWI0;软中断,中断立即数为0SWI0x123456;软中断,中断立即数为0x123
4562008年6月28日南京大学计算机系69获得SWI指令的立即数在SWI异常中断处理程序中,取出SWI立即数的步骤为:首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到;然后取得该SWI指令的
地址,这可通过访问LR寄存器得到;接着读出指令,分解出立即数。程序清单如下所示。2008年6月28日南京大学计算机系70获得SWI指令的立即数(续)T_bitEQU0x20SWI_HandlerSTMFDSP!,{R0-R3,R12,L
R};现场保护MRSR0,SPSR;读取SPSRSTMFDSP!,{R0};保存SPSRTSTR0,#T_bit;测试T标志位,CPSR第M5位;T=1表明执行Thumb指令,参看讲义上集91页LDREQHR0,[LR,#-2];若是Th
umb指令,则读取指令码(16位)BICEQR0,R0,#0xFF00;取得Thumb指令的8位立即数LDRNER0,[LR,#-4];若是ARM指令,则读取指令码(32位)BICNER0,R0,#0xFF000000;取得ARM指令的24位立即数…LDMFDSP!,{R0-R3,R
12,PC};SWI异常中断返回2008年6月28日南京大学计算机系715.3.6ARM协处理器指令ARM支持协处理器操作。协处理器控制通过协处理器命令实现。助记符说明操作条件码CDPcoproc,opco
de1,CRd,CRn,CRm{,opcode2}协处理器数据操作指令取决于协处理器CDP{cond}LDC{1}coproc,CRd,<地址>协处理器数据读取指令取决于协处理器LDC{cond}{L
}STC{1}coproc,CRd,<地址>协处理器数据写入指令取决于协处理器STC{cond}{L}2008年6月28日南京大学计算机系72ARM协处理器指令(续)助记符说明操作条件码MCRcoproc,opcode1,Rd,CRn,CRm{,opcode2}ARM寄存器到协处理器寄存器的数据
传送指令取决于协处理器MCR{cond}MRCcoproc,opcode1,Rd,CRn,CRm{,opcode2)协处理器寄存器到ARM寄存器的数据传送指令取决于协处理器MRC{cond}2008年6月28日南京大学计算机系735.3.7ARM伪指令ARM伪指令不是ARM指令集中的指令,只
是为了编程方便编译器定义了伪指令。可以像其它ARM指令一样使用伪指令,但在编译时这些指令将被等效的ARM指令代替。ARM伪指令有4条,分别为ADR伪指令、ADRL伪指令、LDR伪指令和NOP伪指令。2008年6
月28日南京大学计算机系74ADR伪指令小范围的地址读取伪指令该指令将基于PC的地址值或者基于寄存器的地址值读取到寄存器中语法:ADR{<cond>}register,expr其中,register为目标寄存器。expr为基于PC或者基于寄存器的地址表达式,其取值范围如下:当地址值
不是字对齐时,其取值范围为-255~255。当地址值是字对齐时,其取值范围为-1020~1020。当地址值是16字节对齐时,其取值范围将更大。2008年6月28日南京大学计算机系75ADR伪指令使用举例
下面是一个使用ADR伪指令的例子:startMOVR0,#1000ADRR4,start;案例ARM处理器是三级流水线,PC值为当前指令地址值加8字节;因此本ADR伪指令将被编译器替换成机器指令;SUBR4,PC,#0xC2008年6月28日南京大学计算机系76A
DRL伪指令中等范围的地址读取伪指令。该指令将基于PC或基于寄存器的地址值读取到寄存器中。ADRL伪指令比ADR伪指令可以读取更大范围的地址。ADRL伪指令在汇编时被编译器替换成两条指令。2008年6月28日南京大学计算机系77ADRL伪指令语法
语法:ADRL{<cond>}register,expr其中,register为目标寄存器。expr为基于PC或者基于寄存器的地址表达式,其取值范围如下:当地址值不是字对齐时其取值范围为-64KB~64KB。当地址值是字对齐时其取值
范围为-256KB~256KB。当地址值是16字节对齐时其取值范围将更大。2008年6月28日南京大学计算机系78ADRL指示符的代码范例2008年6月28日南京大学计算机系79空操作伪指令NOPNOP伪指令在汇编时将会被替代成ARM中的空操作,比如可能为“MOVR
0,R0"指令等。伪指令格式如下:NOP2008年6月28日南京大学计算机系80NOP指令的用法NOP可用于延时操作,如下面的程序清单所示。软件延时程序清单…DELAY1NOPNOPNOPSUBSR1,R1,#1BNEDELAY1…2008年6月28日
南京大学计算机系81大范围地址读取伪指令LDRLDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或
MVN指令代替该LDR伪指令;否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。与ARM存储器访问指令的LDR相比,伪指令的LDR的参数有“=”符号。2008年6月28日南京大学计算机系82伪指令LDR格式伪指令格式如下:LDR{cond}r
egister,=expr/label-expr其中:register加载的目标寄存器。expr32位立即数。Label-expr基于PC的地址表达式或外部表达式。2008年6月28日南京大学计算机系83伪指令LDR举
例LDR伪指令举例如下:LDRR0,=0x12345678;加载32位立即数0x12345678LDRR0,=DATA_BUF+60;加载DATA_BUF地址+60…LTORG;声明文字池…2008年6月28日南京大学计算机系84加载32位立即数程序举例
伪指令LDR常用于加载芯片外围功能部件的寄存器地址(32位立即数),以实现各种控制操作,如下面的程序清单所示。…LDRR0,=IOPIN;加载寄存器IOPIN的地址LDRR1,[R0];读取IOPIN寄存器的值…LDRR0,=IOSET
LDRR1,=0x00500500STRR1,[R0];IOSET=0x005005002008年6月28日南京大学计算机系85第9讲重点ARM指令集与x86指令集的主要不同之处ARM指令的基本格式第2操作数ARM处理器的8种寻址方式
ARM存储器访问指令加载/存储指令的4种地址计算方式多寄存器加载/存储指令ARM数据处理指令软中断指令SWIARM伪指令2008年6月28日南京大学计算机系86第9讲复习题与思考题除了本课件列出的ARM指令集与x86指令集不同点外,请你试列出更多的不同点。就ARM处理器
而言,相对寻址时的基准地址是什么?数据块传送指令与堆栈指令有何不同?为什么讲ARM的SWP指令并非简单地执行SWAP(数据交换)操作。请说明ARM指令第2个操作数是如何定义的?如何区别前索引偏移和后索引偏移?使用LDR指令时需要
特别注意的是什么?如何编写开中断和关中断的汇编指令段?如何让中断服务子程序获得SWI指令带有的立即数?2008年6月28日南京大学计算机系87第4次习题布置题1,使用两种类型的第2操作数,分别编写3条ARM指令,并且说明这些指令中的第2操作数的形成方法。题2,如何辨别LDR指令是AR
M机器指令,还是伪指令。请你各举出3条数据传送LDR指令的例子和3条LDR伪指令的例子。题3,LDR和STR指令有前变址、后变址和惠写前变址三种变址模式,请你举例说明之。2008年6月28日南京大学计算机系88第9讲结束谢谢
大家的使用!欢迎大家提出宝贵意见和建议!