1、嵌入式系统原理与开发嵌入式系统原理与开发第第9讲讲南京大学计算机系 俞建新主讲2008年春季2008年6月28日南京大学计算机系2第第5章章 ARM指令集指令集和汇编语言程序和汇编语言程序l本章主要介绍以下内容:lARM指令集的基本特点l与Thumb指令集的区别l与x86处理器的区别lARM指令格式lARM寻址方式lARM指令集分类详解lARM汇编语言的指示符lARM汇编语言语句格式lARM汇编语言程序格式lARM汇编语句格式和程序格式进阶lARM汇编语言程序举例2008年6月28日南京大学计算机系35.1 ARM指令集基本特点指令集基本特点l指令集的异同点lARM、Thumb、x86lARM
2、指令集的语法lARM指令集的编码格式l指令条件码表l第2操作数2008年6月28日南京大学计算机系4ARM指令集和指令集和Thumb指令集指令集的共同点的共同点lARM指令集和Thumb指令集具有以下共同点:较多的寄存器,可以用于多种用途。对存储器的访问只能通过Load/Store指令。l两种指令集的差异特征在下页给出2008年6月28日南京大学计算机系5ARM指令集和指令集和Thumb指令集指令集 的不同点的不同点项目项目ARM指令指令Thumb指令指令指令工作标志CPSR的T位=0CPSR的T位=1操作数寻址方式大多数指令为3地址大多数指令为2地址指令长度32位16位内核指令58条30条条
3、件执行大多数指令只有分支指令数据处理指令访问桶形移位器和ALU独立的桶形移位器和ALU指令寄存器使用15个通用寄存器+PC8个通用低寄存器+7个高寄存器+PC程序状态寄存器特权模式下可读可写不能直接访问异常处理能够全盘处理不能处理2008年6月28日南京大学计算机系6ARM指令集与指令集与x86指令集指令集的主要不同点的主要不同点lARM指令集l规整指令格式l即:正交指令格式l三地址指令l由指令的附加位决定运算完毕后是否改变状态标志l状态标志位只有4位l有两种指令密度l无整数除法指令l大多数ARM指令都可以条件执行l有适合DSP处理的乘加指令lLoad/Store访存体系结构lx86指令集l非
4、规整指令格式l即:非正交指令格式l二地址指令l指令隐含决定运算完毕后是否改变状态标志l状态标志位有6位l单一指令密度l有整数除法指令l专用条件判断指令进行程序分支l没有适合DSP处理的乘加指令l运算指令能够访问存储器2008年6月28日南京大学计算机系7ARM指令集的编码格式指令集的编码格式l参看ARM指令集编码格式PDF文件2008年6月28日南京大学计算机系8ARM指令集的语法指令集的语法l一条典型的ARM指令语法如下所示:S ,其中:是指令助记符,决定了指令的操作。例如:ADD表示算术加操作指令。是指令执行的条件,可选项。S 决定指令的操作是否影响CPSR的值,可选项。表示目标寄存器,必
5、有项。表示包含第1个操作数的寄存器,当仅需要一个源操作数时可省略。表示第2个操作数,可选项。第2操作数有两种格式:#immed_8r,Rm,Shift2008年6月28日南京大学计算机系9ARM数据处理指令中数据处理指令中第第2操作数的编码格式图解操作数的编码格式图解 2008年6月28日南京大学计算机系10灵活的第灵活的第2操作数操作数l立即数型立即数型l格式:格式:#l也写成#immed_8rl#是取值为数字常量的表达式,并不是所有的32位立即数都是有效的。l有效的立即数很少。它必须由一个8位的立即数循环右移偶数位得到。原因是32位ARM指令中条件码和操作码等占用了一些必要的指令码位,32
6、位立即数无法编码在指令中。l举例:lADD r3,r7,#1020 ;#immed_8r型第2操作数,;1020是0 xFF循环右移30位后生成的32位立即数;推导:1020=0 x3FC=0 x000003FC2008年6月28日南京大学计算机系11灵活的第灵活的第2操作数(续操作数(续1)l数据处理指令中留给Operand2操作数的编码空间只有12位,需要利用这12位产生32位的立即数。其方法是:把指令最低8位(bit7:0)立即数循环右移偶数次,循环右移次数由2*bit11:8(bit11:8是Operand2的高4位)指定。l例如:MOV R4,#0 x8000000A;其中的立即数#
7、0 x8000000A是由8位的0 xA8循环右移0 x4位得到。l又例如:MOV R4,#0 xA0000002;其中的立即数#0 xA0000002是由8位的0 xA8循环右移0 x6位得到。2008年6月28日南京大学计算机系12灵活的第灵活的第2操作数(续操作数(续2)l寄存器移位型寄存器移位型l格式:格式:Rm,lRm是第2操作数寄存器,可对它进行移位或循环移位。用来指定移位类型(LSL,LSR,ASR,ROR或RRX)和移位位数。其中移位位数有两种表示方式,一种是5位立即数(#shift),另外一种是位移量寄存器Rs的值。参看下面的例子。例子中的R1是Rm寄存器。lADD R5,R
8、3,R1,LSL#2;R5R3+R1*4lADD R5,R3,R1,LSL R4;R5R3+R1*2R4 ;R4是Rs寄存器,Rs用于计算右移次数2008年6月28日南京大学计算机系13详解第详解第2操作数操作数#immed_8rl该常数必须对应8位位图,即常数是由一个8位的常数循环右移位偶数位得到。例如:l合法常量:0 x3FC、0、0 xF0000000、200、0 xF0000001。l非法常量:0 x1FE、511、0 xFFFF、0 x1010、0 xF0000010。l常数表达式应用举例:lMOV R0,#1;R0=1lANDR1,R2,#0 x0F ;R2与0 x0F,结果保存在
9、R1lLDRR0,R1,#4lSUB R4,R2,#D4000002 ;该立即数是0 xBE循环右移6位 ;课堂练习此第2操作数2008年6月28日南京大学计算机系14详解第详解第2操作数的操作数的Rm寄存器(寄存器(1)lRM寄存器通常是存放第2操作数的寄存器S ,RM,shiftl举例:lSUBR1,R1,R2 ;R1R2R1lMOVPC,R0 ;PCR0,程序跳转到指定地址lLDRR0,R1,R2 ;读取R1地址上的存储器单元内容并存入R0,;且R1R1R2,后索引偏移lANDR0,R5,R2 ;R2中存放的是第2操作数 ;该数据属于寄存器方式的第2操作数2008年6月28日南京大学计算
10、机系15详解第详解第2操作数的操作数的Rm寄存器(寄存器(2)ADD R0,R0,R0,LSL#2;执行结果R0=5*R0ADD R5,R3,R1,LSL#2;R5R3+R1*4ADD R5,R3,R1,LSL R4;R5R3+R1*2R42008年6月28日南京大学计算机系16寄存器移位方式生成的第寄存器移位方式生成的第2操作数操作数Rm,shiftl将寄存器的移位结果作为操作数,但Rm值保存不变,移位方法如下:lASR#n ;算术右移n位(1n32)。lLSL#n ;逻辑左移n位(1n31)。lLSR#n ;逻辑右移n位(1n32)。lROR#n ;循环右移n位(1n31)。lRRX;带扩
11、展的循环右移1位。2008年6月28日南京大学计算机系17桶型移位器移位操作:桶型移位器移位操作:Type Rsl其中,Type为ASR、LSL、LSR和ROR中的一种;Rs为偏移量寄存器,最低8位有效。若其值大于或等于32,则第2个操作数的结果为0(ASR、LSR例外)。l例如MOVSR3,R1,LSL#7 ;R3R1*1282008年6月28日南京大学计算机系18寄存器位移方式生成第寄存器位移方式生成第2操作数操作数应用举例应用举例lADD R1,R1,R1,LSL#3 ;R1=R1*9,因为R1 R1+R1*8。lSUB R1,R1,R2,LSR#2;R1R1R24,;因为R2右移2位相
12、当于R2除以4。lEOR R11,R12,R3,ASR#5;R11=R12(R332);第2操作数是R3的内容除以322008年6月28日南京大学计算机系19寄存器位移方式生成第寄存器位移方式生成第2操作数操作数应用举例(续)应用举例(续)lMOVS R4,R4,LSR#32;C标志更新为R4的位31,R4清零。;参看本课程教材第119页lR15为处理器的程序计数器PC,一般不要对其进行操作,而且有些指令是不允许使用R15的,如UMULL指令。2008年6月28日南京大学计算机系20ARM处理器的处理器的CPSR寄存器和寄存器和SPSR寄存器的位定义格式图解寄存器的位定义格式图解l参看教材第4
13、.2.3节2008年6月28日南京大学计算机系21指令条件码表(指令条件码表(1)条件码助记符标志含义EQZ1相等NEZ0不相等CS/HSC1无符号数大于或等于CC/LOC0无符号数小于MIN1负数(minus)PLN0正数或零VSV1上溢出VCV0没有上溢出2008年6月28日南京大学计算机系22指令条件码表(指令条件码表(2)条件码助记符标志含义HIC1,Z0无符号数大于LSC0,Zl无符号数小于或等于GENV有符号数大于或等于LTN!V有符号数小于GTZ=0,N=V有符号数大于LEZ1,N!=V有符号数小于或等于AL任何无条件执行(指令默认条件)NVARMv3之前该指令从不执行2008年
14、6月28日南京大学计算机系235.2 ARM处理器寻址方式处理器寻址方式l寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。lARM处理器具有8种基本寻址方式,以下列出:寄存器寻址-立即寻址寄存器偏移寻址-寄存器间接寻址基址寻址-多寄存器寻址堆栈寻址-相对寻址2008年6月28日南京大学计算机系24寄存器寻址寄存器寻址l操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:lMOV R1,R2;读取R2的值送到R1lMOV R0,R0;R0=R0,相当于无操作lSUB R0,R1,R2;R0R1-R2;将R1的值
15、减去R2的值,结果保存到R0lADD R0,R1,R2 ;R0R1+R2;这条指令将两个寄存器(R1和R2)的内容相加,结果放入第3个寄存器R0中。必须注意写操作数的顺序:第1个是结果寄存器,然后是第一操作数寄存器,最后是第二操作数寄存器。2008年6月28日南京大学计算机系25立即寻址立即寻址l立即寻址指令中的操作码字段后面的地址码部分即是操作数本身。也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:lSUBS R0,R0,#1 ;R0减1,结果放入R0,并且影响标志位lMOV R0,#0 xFF000;将十六进制立即数0 x
16、FF000装入R0寄存器l立即数要以“#”号为前缀,16进制数值时以“0 x”表示。2008年6月28日南京大学计算机系26寄存器偏移寻址寄存器偏移寻址l寄存器偏移寻址是ARM指令集特有的寻址方式。当第2作数是寄存器偏移方式时,第2个寄存器操作数在与第1操作数结合之前,选择进行移位操作。l寄存器偏移寻址指令举例如下:lMOV R0,R2,LSL#3;R2的值左移3位,结果放入R0,即R0R28lANDS R1,R1,R2,LSL R3;R2的值左移R3位,然后与R1相“与”,结果放入R1,并且影响标志位。lSUB R11,R12,R3,ASR#5;R12R332,然后存入R11。2008年6月
17、28日南京大学计算机系27寄存器偏移寻址(续)寄存器偏移寻址(续)l可采用的移位操作如下:lLSL:逻辑左移(Logical Shift Left),低端空出位补0。lLSR:逻辑右移(Logical Shift Right),高端空出位补0。lASR:算术右移(Arithmetic Shift Right),移位过程中保持符号位不变,即若源操作数为正数,则字的高端空出的位补0;否则补1。lROR:循环右移(Rotate Right),由字低端移出的位填入字高端空出的位。lRRX:带扩展的循环右移(Rotate Right extended by l place),操作数右移1位,高端空出的位
18、用原C标志值填充。如果指定后缀“S”,则将Rm原值的位0移到进位标志。2008年6月28日南京大学计算机系28移位操作示意图移位操作示意图l各种移位操作如下图所示:(c)ASR移位操作(d)ROR移位操作00(e)RRX移位操作C(a)LSL移位操作(b)LSR移位操作2008年6月28日南京大学计算机系29寄存器间接寻址寄存器间接寻址l寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:lLDR R1,R2 将R2指向的存储单元的数据读出,保存在R1中。lSWP R1,R1,R2将寄存
19、器R1的值与R2指定的存储单元的内容交换2008年6月28日南京大学计算机系30SWP指令操作图解指令操作图解2008年6月28日南京大学计算机系31基址寻址基址寻址l基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:lLDR R2,R3,#0 x0C读取R30 x0C地址上的存储单元的内容,放入R2。lSTR R1,R0,#4!;R04R1,R0=R04,符号“!”表明指令在完成数据传送后应该更新基址寄存器,否则不更新;属前索引。2008年6月28日南京大学计算机
20、系32基址寻址指令举例基址寻址指令举例lLDR R1,R0,R3,LSL#1;将R0R32地址上的存储单元的内容读出,存入R1。lLDR R0,R1,R2,LSL#2!;将内存起始地址为R1+R2*4的字数据读取到R0中,;同时修改R1,使得:R1=R1+R2*4。lLDR R0,R1,R2!;以R1+R2值为地址,访问内存。将该位置的字数据读;取到R0中,同时修改R1,使得:R1=R1+R2。;属于前索引指令2008年6月28日南京大学计算机系33多寄存器寻址多寄存器寻址l多寄存器寻址即是一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:l
21、LDMIA R1!,R2R7,R12;将R1指向的单元中的数据读出到R2R7、R12中;(R1自动增加)lSTMIA R0!,R2R7,R12;将寄存器R2R7、R12的值保存到R0指向的存储单元中,;(R0自动增加)l使用多寄存器寻址指令时,寄存器子集的顺序是按由小到大的顺序排列,连续的寄存器可用“”连接;否则用“,”分隔书写。2008年6月28日南京大学计算机系34多寄存器寻址(续多寄存器寻址(续1)l多寄存器寻址指令举例lLDMIA R1!,R0,R2,R5;R0R1;R2R1+4;R5R1+8;R1保持自动增值;寄存器列表R0,R2,R5与R2,R0,R5等效l多寄存器指令的执行顺序与
22、寄存器列表次序无关,而与寄存器的序号保持一致。2008年6月28日南京大学计算机系35多寄存器指令的执行顺序举例多寄存器指令的执行顺序举例1l通过ADS集成开发环境的AXD调试器窗口观察2008年6月28日南京大学计算机系36多寄存器指令的执行顺序举例多寄存器指令的执行顺序举例2l通过ADS集成开发环境的AXD调试器窗口观察2008年6月28日南京大学计算机系37多寄存器寻址(续多寄存器寻址(续2)l下面是多寄存器传送指令STM举例如下:lSTMIA R0!,R1R7;将R1R7的数据保存到存储器中。存储指针在保存第一;个值之后后增加,增长方向为向上上增长lSTMIB R0!,R1R7;将R1
23、R7的数据保存到存储器中。存储指针在保存第一;个值之前前增加,增长方向为向上上增长lSTMDA R0!,R1R7;将R1R7的数据保存到存储器中。存储指针在保存第一;个值之后后增加,增长方向为向下下增长lSTMDB R0!,R1R7;将R1R7的数据保存到存储器中。存储指针在保存第一;个值之前前增加,增长方向为向下下增长2008年6月28日南京大学计算机系38堆栈寻址堆栈寻址l存储器堆栈可分为两种:l向上生长:向高地址方向生长,称为递增堆栈。l向下生长:向低地址方向生长,称为递减堆栈。l满堆栈l堆栈指针指向最后压入的堆栈的有效数据项l空堆栈l堆栈指针指向下一个待压入数据的空位置2008年6月2
24、8日南京大学计算机系39堆栈寻址(续堆栈寻址(续1)l有4种类型的堆栈组合l满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等。l空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等。l满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等。l空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED、STMED等。2008年6月28日南京大学计算机系40堆栈寻址(续堆栈寻址(续2)l堆栈寻址
25、指令举例如下:lSTMFD SP!,R1R7,LR;将R1R7、LR入栈(push),满递减堆栈。lLDMFD SP!,R1R7,LR;数据出栈(pop),放入R1R7、LR寄存器。;满递减堆栈2008年6月28日南京大学计算机系41多寄存器传送指令映射表多寄存器传送指令映射表lSTM=将寄存器内容存入内存单元(堆栈操作:入栈)lLDM=将内存单元内容存入寄存器(堆栈操作:出栈)2008年6月28日南京大学计算机系42多寄存器传送指令说明多寄存器传送指令说明l数据块传送:lI=向地址增大方向处理数据传送(Increment)lD=向地址减小方向处理数据传送(Decrement)lA=先传送数据
26、后改变地址(after)lB=先改变地址后传送数据(before)l堆栈操作:lF=满栈顶指针(full)lE=空栈顶指针(empty)lA=堆栈向高地址方向增长(ascending stack)lD=堆栈向低地址方向增长(decending stack)2008年6月28日南京大学计算机系43l相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。l相对寻址指令举例如下:lBL SUBR1 ;保存子程序返回地址;调用到SUBR1子程序 lBEQ LOOP;条件跳转到LOOP标号处 lLOOP MOV R6,#1lS
27、UBR1相对寻址相对寻址2008年6月28日南京大学计算机系44相对寻址举例相对寻址举例BL SUBR;转移到SUBR.SUBR.;子程序入口.MOV PC,R14;返回;R14也就是LR2008年6月28日南京大学计算机系455.3 ARM指令集分类详解指令集分类详解lARM指令集大致分为6类:分支指令、Load/Store指令、数据处理指令、程序状态寄存器指令、异常中断指令、协处理器指令。以下分别介绍其中的主要指令。2008年6月28日南京大学计算机系465.3.1 分支指令分支指令lARM有两种方法可以实现程序分支转移。l跳转指令l所谓的长跳转l直接向PC寄存器(R15)中写入目标地址。
28、lARM跳转指令有以下4种:l B 分支指令,语法Bcond labell BL 带链接分支指令语法:BLcond labell BX 分支并可选地交换指令集语法:BXcond Rml BLX 带链接分支并可选择地交换指令集。语法:BLXcond label|Rm2008年6月28日南京大学计算机系47BL指令举例指令举例lBL指令的意义:Branch and Linkl示例:.bl MyPro;调用子程序MyPro.MyPro;子程序MyPro本体.mov PC,LR;将R14的值送入R15,返回2008年6月28日南京大学计算机系48BX指令使用举例指令使用举例l通过使用BX指令可以让AR
29、M处理器内核工作状态在ARM状态和Thumb状态之间进行切换。l参看下例:;从ARM状态转变为Thumb状态LDRR0,=Sub_Routine+1BXR0;从Thumb 状态转变为ARM状态LDRR0,=Sub_RoutineBXR02008年6月28日南京大学计算机系49长跳转长跳转l直接向PC寄存器写入目标地址值,可以实现4GB地址空间中的任意跳转。l示例:l以下的两条指令实现了4GB地址空间中的子程序调用。lMOV LR,PC;保存返回地址lMOV R15,#0 x00110000;无条件转向绝对地址0 x110000;此32位立即数地址应满足单字节循环右移偶数次2008年6月28日南
30、京大学计算机系505.3.2 Load/Store指令指令lLoad/Store指令用于在存储器和处理器之间传输数据。Load用于把内存中的数据装载到寄存器,Store指令用于把寄存器中的数据存入内存。l共有3种类型的Load/Store指令:l单寄存器传输指令l多寄存器传输指令l交换指令2008年6月28日南京大学计算机系51单寄存器传送指令单寄存器传送指令助记码助记码操作操作指令描述指令描述LDR把一个字装入一个寄存器Rdmem32addressSTR从一个寄存器保存一个字Rdmem32addressLDRB把一个字节装入一个寄存器Rdmem8addressSTRB从一个寄存器保存一个字节
31、Rdmem8addressLDRH把一个半字装入一个寄存器Rdmem16addressSTRH从一个寄存器保存一个半字Rdmem16addressLDRSB把一个有符号字节装入寄存器Rd符号扩展(mem8address)LDRSH把一个有符号半字装入寄存器Rd符号扩展(mem16address)2008年6月28日南京大学计算机系52Load/Store指令变址模式指令变址模式l变址模式有四种:零偏移、前变址、后变址、变址模式有四种:零偏移、前变址、后变址、回写前变址回写前变址。变址模式变址模式数据数据基址寄存器基址寄存器指令举例指令举例零偏移membase直接基址寄存器寻址LDR r0,r1
32、回写前变址membase+offset 基址寄存器加偏移量LDR r0,r1,#4!前变址membase+offset 不变LDR r0,r1,#4后变址membase基址寄存器加偏移量LDR r0,r1,#42008年6月28日南京大学计算机系53单寄存器传送指令举例单寄存器传送指令举例lLDR R2,R3,#0 x0C读取R30 x0C地址上的一个字数据内容,放入R2。属前变址。lSTR R1,R0,#4!R04R1,R0=R04,符号“!”表明指令在完成数据传送后应该更新基址寄存器,否则不更新;属回写前变址。lLDR R1,R0,R3,LSL#1将R0R32地址上的存储单元的内容读出,存
33、入R1。2008年6月28日南京大学计算机系545.3.3 数据处理指令数据处理指令 lARM数据处理指令大致分为以下6种类型。l数据传送指令l算术运算指令l逻辑运算指令l比较指令l测试指令l乘法指令2008年6月28日南京大学计算机系55ARM数据处理指令数据处理指令lARM数据处理指令大致可分为3类:l数据传送指令(如MOV、MVN);l算术逻辑运算指令(如ADD、SUB、AND);l比较指令(如CMP、TST)。l参见下面的表格l数据处理指令只能对寄存器的内容进行操作。所有ARM数据处理指令均可选择使用S后缀,以影响状态标志。l比较指令CMP、CMN、TST和TEQ不需要后缀S,它们会直
34、接影响状态标志。2008年6月28日南京大学计算机系56ARM数据处理指令集数据处理指令集助记符 说 明 操 作 条件码位置 MOV Rd,operand2数据传送指令Rdoperand2MOVcondSMVN Rd,operand2数据非传送指令Rd(operand2)MVNcondSADD Rd,Rn,operand2加法运算指令RdRnoperand2ADDcondSSUB Rd,Rn,operand2减法运算指令RdRnoperand2SUBcondSRSB Rd,Rn,operand2逆向减法指令Rdoperand2RnRSBcondSADC Rd,Rn,operand2带进位加法指
35、令RdRnoperand2CarryADCcondSSBC Rd,Rn,operand2带进位减法指令RdRnoperand2(NOT)CarrySBCcondSRSC Rd,Rn,operand2 带进位逆向减法指令 Rdoperand2Rn(NOT)CarryRSCcondS 2008年6月28日南京大学计算机系57ARM数据处理指令集(续)数据处理指令集(续)助记符 说 明 操 作 条件码位置 AND Rd,Rn,operand2逻辑“与”操作指令RdRn&operand2ANDcondSORR Rd,Rn,operand2逻辑“或”操作指令RdRn|operand2ORRcondSEO
36、R Rd,Rn,operand2逻辑“异或”操作指令RdRnoperand2EORcondSBIC Rd,Rn,operand2位清除指令RdRn&(operand2)BICcondSCMP Rn,operand2比较指令标志N,Z,C,VRnoperand2CMPcondCMN Rn,operand2负数比较指令标志N,Z,C,V Rnoperand2CMNcondTST Rn,operand2位测试指令标志N,Z,C,V Rn&operand2TSTcondTEQ Rn,operand2相等测试指令标志N,Z,C,V Rnoperand2TEQcond2008年6月28日南京大学计算机系5
37、8乘法指令乘法指令lARM7TDMI(-S)具有3232乘法指令、3232乘加指令,3232结果为64位的乘/乘加指令。ARM乘法指令如下表所列。助记符说 明 操 作 条件码MUL Rd,Rm,Rs32位乘法指令RdRmRs(Rd!=(Rm)MULCondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRmRsRn (Rd!=Rm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)RmRsUMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位无符号乘加指令(RdLo,RdHiRmRs(RdLo,RdHi)UMLALcondSSM
38、ULL RdLo,RdHi,Rm,Rs64位有符号乘法指令(RdLo,RdHi)RmRsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符号乘加指令(RdLo,RdHiRmRs(RdLo,RdHi)SMLALcondS2008年6月28日南京大学计算机系595.3.4 程序状态寄存器指令程序状态寄存器指令 l读状态寄存器指令MRSl写状态寄存器指令MSRl指令举例l开中断与关中断2008年6月28日南京大学计算机系60读状态寄存器指令读状态寄存器指令MRSl在ARM处理器中,只有MRS指令可以将状态寄存器CPSR或SPSR读出到通用寄存器中。l指令格式如下:lMRScon
39、d Rd,psrl其中:lRd 目标寄存器。Rd不允许为R15。lpsr CPSR或SPSR。l指令举例如下:lMRS R1,CPSR ;将CPSR状态寄存器读取,保存到R1中。lMRS R2,SPSR ;将SPSR状态寄存器读取,保存到R2中。2008年6月28日南京大学计算机系61写状态寄存器指令写状态寄存器指令MSRl在ARM处理器中,只有MSR指令可以直接设置状态寄存器CPSR或SPSR。l指令格式如下:lMSRcond psr_fields,#immed_8rlMSRcond psr_fields,Rml其中:lpsr CPSR或SPSR。lfields指定传送的区域。2008年6月
40、28日南京大学计算机系62写状态寄存器指令写状态寄存器指令MSR(续)(续)lfields可以是以下的一种或多种;(字母必须为小写);c 控制域屏蔽字节(psr70);x 扩展域屏蔽字节(psr158);s 状态域屏蔽字节(psr2316);f 标志域屏蔽字节(psr3124)。limmed_8r要传送到状态寄存器指定域的立即数,8位。lRm 要传送到状态寄存器指定域的数据的源寄存器。2008年6月28日南京大学计算机系63MSR指令举例指令举例lMSR指令举例如下:MSR CPSR_c,#0 xD3 ;CPSR70=0 xD3,即切换到管理模式,0b11010011MSR CPSR_cxsf
41、,R3 ;CPSR=R32008年6月28日南京大学计算机系64使能使能IRQ中断(开中断)中断(开中断)ENABLE_IRQMRS R0,CPSRBIC R0,R0,#0 x80MSR CPSR_c,R0MOV PC,LRI位=0 开中断2008年6月28日南京大学计算机系65禁能禁能IRQ中断(关中断)中断(关中断)DISABLE_IRQ MRS R0 CPSRORR R0,R0,#0 x80MSR CPSR_c,R0MOV PC,LRI位=1 关中断2008年6月28日南京大学计算机系66MSR指令说明指令说明l程序中不能通过MSR指令直接修改CPSR中的T控制位来实现ARM状态/Thu
42、mb状态的切换,必须使用BX指令完成处理器状态的切换(因为BX指令属分支指令,它会打断流水线状态,实现处理器状态切换)。lMRS与MSR配合使用,实现CPSR或SPSR寄存器的读一修改一写操作,可用来进行处理器模式切换、允许/禁止IRQ/FIQ中断等设置,如下面的程序清单所示。2008年6月28日南京大学计算机系67堆栈指令初始化堆栈指令初始化INITSTACKMOV R0,LR ;保存返回地址MSR CPSR_c,#0 xD3LDR SP,StackSvc;设置管理模式堆栈,;设置管理模式堆栈,M4:0=0b10011MSR CPSR_c,#0 xD2LDR SP,StackIrq;设置中断
43、模式堆栈,M4:0=0b10010MOV PC,R02008年6月28日南京大学计算机系685.3.5 软中断指令软中断指令SWIlSWI指令用于产生软中断,从而实现从用户模式变换到管理模式,CPSR保存到管理模式的SPSR中,执行转移到SWI向量。在其它模式下也可使用SWI指令,处理器同样地切换到管理模式。l指令格式如下:lSWIcond immed_24 /Thumb指令是 immed_8 l其中:immed_24是24位立即数,值为016,777,215之间的整数。立即数用于指定指令请求的具体SWI服务。l指令举例如下:lSWI 0 ;软中断,中断立即数为0lSWI0 x123456;软
44、中断,中断立即数为0 x1234562008年6月28日南京大学计算机系69获得获得SWI指令的立即数指令的立即数l在SWI异常中断处理程序中,取出SWI立即数的步骤为:首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到;l然后取得该SWI指令的地址,这可通过访问LR寄存器得到;l接着读出指令,分解出立即数。l程序清单如下所示。2008年6月28日南京大学计算机系70获得获得SWI指令的立即数(续)指令的立即数(续)T_bit EQU0 x20SWI_HandlerSTMFD SP!,R0R3,R12,LR;现场保护MRS R0,SPSR;读取SPSRST
45、MFD SP!,R0 ;保存SPSRTST R0,#T_bit;测试T标志位,CPSR第M5位 ;T=1表明执行Thumb指令,参看讲义上集91页LDREQH R0,LR,#2 ;若是Thumb指令,则读取指令码(16位)BICEQ R0,R0,#0 xFF00 ;取得Thumb指令的8位立即数LDRNE R0,LR,#4 ;若是ARM指令,则读取指令码(32位)BICNE R0,R0,#0 xFF000000;取得ARM指令的24位立即数LDMFD SP!,R0R3,R12,PC ;SWI异常中断返回2008年6月28日南京大学计算机系715.3.6 ARM协处理器指令协处理器指令lARM支
46、持协处理器操作。协处理器控制通过协处理器命令实现。助记符 说 明 操 作 条件码 CDP coproc,opcode1,CRd,CRn,CRm,opcode2协处理器数据操作指令取决于协处理器CDPcondLDC1 coproc,CRd,协处理器数据读取指令取决于协处理器LDCcondLSTC1 coproc,CRd,协处理器数据写入指令取决于协处理器STCcondL2008年6月28日南京大学计算机系72ARM协处理器指令(续)协处理器指令(续)助记符 说 明 操 作 条件码MCR coproc,opcode1,Rd,CRn,CRm,opcode2ARM寄存器到协处理器寄存器的数据传送指令取
47、决于协处理器MCRcondMRC coproc,opcode1,Rd,CRn,CRm,opcode2)协处理器寄存器到ARM寄存器的数据传送指令取决于协处理器MRCcond2008年6月28日南京大学计算机系735.3.7 ARM伪指令伪指令lARM伪指令不是ARM指令集中的指令,只是为了编程方便编译器定义了伪指令。可以像其它ARM指令一样使用伪指令,但在编译时这些指令将被等效的ARM指令代替。lARM伪指令有4条,分别为ADR伪指令、ADRL伪指令、LDR伪指令和NOP伪指令。2008年6月28日南京大学计算机系74ADR伪指令伪指令l小范围的地址读取伪指令l该指令将基于PC的地址值或者基于
48、寄存器的地址值读取到寄存器中l语法:lADR register,expru其中,register为目标寄存器。expr为基于PC或者基于寄存器的地址表达式,其取值范围如下:u当地址值不是字对齐时,其取值范围为-255255。u当地址值是字对齐时,其取值范围为-10201020。u当地址值是16字节对齐时,其取值范围将更大。2008年6月28日南京大学计算机系75ADR伪指令使用举例伪指令使用举例l下面是一个使用ADR伪指令的例子:lstart MOV R0,#1000lADR R4,startl;案例ARM处理器是三级流水线,PC值为当前指令地址值加8字节l;因此本ADR伪指令将被编译器替换成
49、机器指令l;SUB R4,PC,#0 xC2008年6月28日南京大学计算机系76ADRL伪指令伪指令l中等范围的地址读取伪指令。该指令将基于PC或基于寄存器的地址值读取到寄存器中。ADRL伪指令比ADR伪指令可以读取更大范围的地址。lADRL伪指令在汇编时被编译器替换成两条指令。2008年6月28日南京大学计算机系77ADRL伪指令语法伪指令语法l语法:lADRL register,exprl其中,register为目标寄存器。expr为基于PC或者基于寄存器的地址表达式,其取值范围如下:l当地址值不是字对齐时l其取值范围为-64KB64KB。l当地址值是字对齐时l其取值范围为-256KB2
50、56KB。l当地址值是16字节对齐时l其取值范围将更大。2008年6月28日南京大学计算机系78ADRL指示符的代码范例指示符的代码范例2008年6月28日南京大学计算机系79空操作伪指令空操作伪指令NOPlNOP伪指令在汇编时将会被替代成ARM中的空操作,比如可能为“MOV R0,R0指令等。l伪指令格式如下:lNOP2008年6月28日南京大学计算机系80NOP指令的用法指令的用法lNOP可用于延时操作,如下面的程序清单所示。l软件延时程序清单DELAY1NOPNOPNOPSUBSR1,R1,#1BNE DELAY12008年6月28日南京大学计算机系81大范围地址读取伪指令大范围地址读取