《嵌入式系统原理与开发》第9讲南京大学计算机系俞建新主讲2008年春季2008年6月28日南京大学计算机系2第5章ARM指令集和汇编语言程序本章主要介绍以下内容:ARM指令集的基本特点与Thumb指令集的区别与x86处理器的区别ARM指令格式ARM寻址方式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个高寄存器+PC程序状态寄存器特权模式下可读可写不能直接访问异常处理能够全盘处理不能处理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操作数的编码格式图解cond00opcodeSRnRdOperand2312827262524212019161512110#目的寄存器第1操作数寄存器是否修改CPSR条件标志位算术/逻辑功能#rotate#shift8位立即数118702512508位立即数循环右移长度11870Sh0Rm34056Rs11870Sh0Rm34056立即数移位长度移位类型第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位立即数;推导:1020=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、0xF0000010。常数表达式应用举例: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,程序跳转到指定地址LDRR0,[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*2R42008年6月28日南京大学计算机系16寄存器移位方式生成的第2操作数Rm{,shift}将寄存器的移位结果作为操作数,但Rm值保存不变,移位方法如下:ASR#n;算术右移n位(1≤n≤32)。LSL#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和ROR中的一种;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标志运行Thumb指令集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,AS