资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,4.1 ARM,指令概述,4.2,处理器寻址方式,4.3 ARM,指令集,4.4 Thumb,指令集,第,4,章,ARM7TDMI(-S),指令系统,4.1 ARM,指令系统概述,指令系统,是指特定计算机处理器上可执行的指令集合。,ARM,处理器是基于精简指令集计算机,(RISC),原理设计的,指令集和相关译码机制较为简单。,ARM7TDMI(-S),具有,32,位,ARM,指令集,和,16,位,Thumb,指令集。,*,ARM,指令集效率高,但是代码密度低,;,*Thumb,指令集具有较高的代码密度,却仍然保持,ARM,的大多数性能上的优势,它是,ARM,指令集的子集;,*所有的,ARM,指令都是可以有条件执行的,而,Thumb,指令仅有一条指令具备条件执行功能;,*,ARM,程序和,Thumb,程序可相互调用,相互之间的状态切换开销几乎为零。,ARM,指令集与,Thumb,指令集的关系,Thumb,指令集具有灵活、小巧的特点,ARM,指令集支持,ARM,核所有的特性,具有高效、快速的特点,4.2 ARM,处理器寻址方式,寻址方式分类,寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。,ARM,处理器具有,9,种基本寻址,方式。,1.,寄存器寻址;,2.,立即寻址;,3.,寄存器移位寻址;,4.,寄存器间接寻址;,5.,基址寻址;,6.,多寄存器寻址;,7.,堆栈寻址;,8.,块拷贝寻址;,9.,相对寻址。,操作数的值在寄存器中,指令中的,地址码字段,指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:,MOV R1,R2,;,将,R2,的值存入,R1,SUB R0,R1,R2,;,将,R1,的值减去,R2,的值,结果保存到,R0,0 xAA,0 x55,R2,R1,4.2.1,寄存器寻址,MOV R1,R2,0 xAA,立即寻址指令中的操作码字段,后面的地址码,部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数,(,这样的数称为立即数,),。立即寻址指令举例如下:,SUBSR0,R0,#1,;R0,减,1,,结果放入,R0,,并且影响标志位,MOVR0,#0 xFF000,;,将立即数,0 xFF000,装入,R0,寄存器,0 x55,R0,MOV R0,#0 xFF00,程序存储,4.2.2,立即寻址,MOV R0,#0 xFF00,0 xFF00,从代码中获得数据,寄存器移位寻址是,ARM,指令集特有的寻址方式。当第,2,个操作数是寄存器移位方式时,第,2,个寄存器操作数在与第,1,个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:,MOV R0,R2,LSL#3,;R2,的值左移,3,位,结果放入,R0,,,;,即是,R0=R28,ANDS R1,R1,R2,LSL R3,;R2,的值左移,R3,位,然后和,R1,相,;“,与”操作,结果放入,R1,0 x55,R0,R2,0 x01,4.2.3,寄存器移位寻址,MOV R0,R2,LSL#3,0 x08,0 x08,逻辑左移,3,位,寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:,LDRR1,R2,;,将,R2,指向的存储单元的数据读出,;,保存在,R1,中,SWPR1,R1,R2,;,将寄存器,R1,的值和,R2,指定的存储,;,单元的内容交换,0 x55,R0,R2,0 x40000000,0 xAA,0 x40000000,4.2.4,寄存器间接寻址,LDR R0,R2,0 xAA,基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:,LDRR2,R3,#0 x0C,;,读取,R3+0 x0C,地址上的存储单元,;,的内容,放入,R2,STRR1,R0,#-4!,;,先,R0=R0-4,,然后把,R1,的值寄存,;,到保存到,R0,指定的存储单元,4.2.5,基址寻址,0 x55,R2,R3,0 x40000000,0 xAA,0 x4000000C,LDR R2,R3,#0 x0C,0 xAA,将,R3+0 x0C,作为地址装载数据,多寄存器寻址一次可传送几个寄存器值,允许一条指令传送,16,个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:,LDMIAR1!,R2-R7,R12,;,将,R1,指向的单元中的数据读出到,;R2,R7,、,R12,中,(R1,自动加,1),STMIAR0!,R2-R7,R12,;,将寄存器,R2,R7,、,R12,的值保,;,存到,R0,指向的存储,;,单元中,;(R0,自动加,1),0 x40000000,R1,R2,0 x?,0 x01,0 x40000000,0 x?,R3,R4,0 x?,R6,0 x?,0 x02,0 x03,0 x04,0 x40000004,0 x40000008,0 x4000000C,存储器,4.2.6,多寄存器寻址,LDMIA R1!,R2-R4,R6,0 x01,0 x02,0 x03,0 x04,0 x40000000,堆栈是一个按特定顺序进行存取的存储区,操作顺序为,“,后进先出,”,。堆栈寻址是隐含的,它使用一个专门的寄存器,(,堆栈指针,),指向一块存储区域,(,堆栈,),,指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:,向上生长:向高地址方向生长,称为递增堆栈,向下生长:向低地址方向生长,称为递减堆栈,4.2.7,堆栈寻址,堆栈寻址,栈底,栈顶,栈区,SP,堆栈存储区,栈顶,栈底,栈区,SP,向下增长,向上增长,0 x12345678,0 x12345678,堆栈压栈,堆栈压栈,0 x00000000,0 xffffffff,栈顶,SP,栈顶,SP,栈底,空堆栈,栈底,满堆栈,堆栈指针指向最后压入的堆栈的有效数据项,称为,满堆栈,;堆栈指针指向下一个待压入数据的空位置,称为,空堆栈,。,堆栈寻址,0 x12345678,0 x12345678,栈顶,SP,0 x12345678,栈顶,SP,压栈,压栈,所以可以组合出四种类型的堆栈方式:,满递增,:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如,LDMFA,、,STMFA,等;,空递增,:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如,LDMEA,、,STMEA,等;,满递减,:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如,LDMFD,、,STMFD,等;,空递减,:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如,LDMED,、,STMED,等。,堆栈寻址,多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。如:,STMIAR0!,R1-R7,;,将,R1,R7,的数据保存到存储器中。,;,存储指针在保存第一个值之后增加,,;,增长方向为向上增长。,STMIBR0!,R1-R7;,将,R1,R7,的数据保存到存储器中。,;,存储指针在保存第一个值之前增加,,;,增长方向为向上增长。,4.2.8,块拷贝寻址,相对寻址是基址寻址的一种变通。由程序计数器,PC,提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:,BL,SUBR1,;,调用到,SUBR1,子程序,BEQ,LOOP,;,条件跳转到,LOOP,标号处,.,LOOP,MOVR6,#1,.,SUBR1,.,4.2.9,相对寻址,
展开阅读全文