嵌入式系统第三章ARM指令系统.ppt
《嵌入式系统第三章ARM指令系统.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统第三章ARM指令系统.ppt(57页珍藏版)》请在三一文库上搜索。
1、第三章 ARM指令系统,3.1 数据处理指令 3.2 数据传送指令 3.3 控制流指令 3.4 汇编语言程序,汇编语言的源语句行的一般格式是:,label instruction | directive|pseudoinstruction ;comment 注意: 即使没有标号,指令、伪指令和命令前面也必须有一个空白,例如一个空格或制表符。 源语句行的所有三部分都是可选的。可以使用空行来使代码更具可读性 大小写规则 指令记忆码、命令和符号寄存器名称可以用大写或小写编写,但不能混合使用大小写。,标号: 标号是表示地址的符号。在汇编时计算由标号指定的地址。汇编器计算标号的地址,该地址是相对于所定义
2、标号所在段的原点的。引用相同段内的一个标号时,可以使用程序计数器加上或减去一个偏移量。这被称为相对程序的寻址。 其它段中的标号地址是在链接时计算的,此时链接程序已在存储器中为每个段分配了具体的位置。 注释: 一行中的第一个分号用于标记注释的开始,但不包括出现在一个字符串常数内的分号。行的末尾就是注释的结束。一个注释本身就是一个有效的行。汇编程序将忽略所有注释。,常数: 常数可以数值、布尔值、字符或字符串。 数字 可以接受下列形式的数字常数: 十进制数,如 123 十六进制数,如, 0x7B 布尔值 布尔常数 TRUE和 FALSE 必须书写为 TRUE 和 FALSE。 字符 字符常数由左、右
3、单引号组成,中间括住单个字符或一个转义字符,采用标准的 C 转义字符。 字符串 字符串由左、右双引号括住多个字符或空格而组成。如果在一个字符串内使用了双引号或美元字符作为文字文本字符,则必须用一对适当的字符来表示它们。例如,如果需要在字符串内使用单个 $,则必须使用 $。在字符串常数内可以使用标准的 C 转义序列。,ARM 汇编语言模块的示例 AREA ARMex, CODE, READONLY ; Name this block of code ARMex ENTRY ; Mark first instruction to execute start MOV r0, #10 ; Set up
4、 parameters MOV r1, #3 ADD r0, r0, r1 ; r0 = r0 + r1 stop MOV r0, #0x18 ; angel_SWIreason_ReportException LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SVC #0x123456 ; ARM semihosting (formerly SWI) END ; Mark end of file,3.1 数据处理指令,ARM的数据处理指令使得程序员能够完成寄存器中数据的算术和逻辑操作。 其他指令只是传送数据和控制程序的顺序。 数据处理指令的典型特征
5、是需要两个操作数,产生单个结果。 所有的操作数是32位,或来自寄存器、或是指令中定义的立即数。 如果有结果,则结果为32位宽并只能在寄存器中。 每一个操作数寄存器和结果寄存器都在指令中独立指定,也即ARM指令使用3地址模式。,ADD r0, r1, r2 ; r0 := r1 + r2,注意指令中操作数的顺序,r0是结果寄存器,然后是第一操作数(r1),最后是第二操作数(r2)。 当指令执行后,对系统状态而言唯一的变化是目的寄存器r0的值。 CPSR中的标志位(N、Z、C、V)也可有选择地变化。,1、算术操作,这类指令对两个32位操作数进行二进制算术操作。 ADD r0 , r1 , r2 ;
6、 r0 := r1 + r2 ADC r0 , r1 , r2 ; r0 := r1 + r2 + C SUB r0 , r1 , r2 ; r0 := r1 - r2 SBC r0 , r1 , r2 ; r0 := r1 - r2 + C - 1,2、逻辑操作,这类指令对输入操作数的对应位进行指定的布尔逻辑操作。 AND r0 , r1 , r2 ;r0 i := r1 i and r2 i ORR r0 , r1 , r2 ;r0 := r1 or r2 EOR r0 , r1 , r2 ;r0 := r1 xor r2 BIC r0 , r1 , r2 ;r0 := r1 and no
7、t r2,3、寄存器传送操作,这些指令无第一操作数(省略),只是简单的将第二操作数传送到结果寄存器。 MOV r0 , r2 ;r0 := r2 MVN r0 , r2 ;r0 := not r2,4、比较操作,这类指令不产生结果(省略结果寄存器),仅影响CPSR中的相应位(N、Z、C、V)。 CMP r1 , r2 ;r1 - r2 cc CMN r1 , r2 ;r1 + r2 cc TST r1 , r2 ;r1 and r2 cc TEQ r1 , r2 ;r1 xor r2 cc,5、立即数操作,因为立即数是在32位指令中编码,所以不可能将32位都作为立即数,只能是一个8位数并按两位
8、数为边界进行的调整。 立即数=(0-255)x 22n 0=n=12 ADD r3 , r3 , #1 ;r3 := r3 + 1 AND r8 , r7 , #r8 := r7 7:0,6、寄存器移位操作,这类指令允许第二个操作数(寄存器)在同第一个操作数(寄存器)运算之前完成移位操作。 ADD r3 , r2 , r1 , LSL #3 ;r3 := r2 + r1 x 8 这是一条在单个时钟周期内执行的ARM指令,许多处理器采用独立的移位操作指令。 LSL(逻辑左移)、LSR(逻辑右移) ASL(算术左移)、ASR(算术右移) ROR(循环右移),7、设置条件码,如果程序员需要,任何数据
9、处理指令都能设置条件码,但必须在指令中显示的提出来(比较指令除外)。 ADDS r2 , r2 , r0 ;r1r0 64位数1,r3r2 64位数2 ADC r3 , r3 , r1 ;结果在r3r2中,3.2 数据传送指令,指在ARM寄存器和存储器、I/O设备之间传送数据。 常用的有2种数据传送指令: 1、单寄存器的Load和Store指令:LDR、STR 2、多寄存器的Load和Store指令:LDRM、STRM ARM的数据传送指令都是基于寄存器间接寻址及各种变化,如基址偏移寻址、基址变址寻址等(没有直接寻址)。 寄存器间接寻址:LDR r0 , r1、STR r0 , r1,LDR
10、r0 , r1 STR r0 , r1 ,在任何情况下都需要有一个ARM寄存器来寄存地址,其他形式的寻址都是建立在这种形式之上的。 寄存器间接寻址利用一个寄存器的值(基址寄存器)作为存储器地址;或在此基础上加上立即数构成基址偏移寻址: LDR r0 , r1 , #4 或加上另一个寄存器偏移量构成基址变址寻址: LDR r0 , r1 , r2 初始化寄存器地址指针,初始化寄存器地址指针,要访问一个特定的存储器单元(因ARM是寄存器间接寻址的),必须把一个寄存器初始化,使之包含存储器单元的地址。 ADR伪指令 COPY ADR r1 , TABLE1 ADR r2 , TABLE2 TABLE
11、1 TABLE2 ,1、单寄存器的Load和Store指令:LDR、STR,这些指令提供最灵活的单数据项传送方式,数据项可以是字节、字、半字。 COPY ADR r1 , TABLE1 ADR r2 , TABLE2 LDR r0 , r1 STR r0 , r2 TABLE1 TABLE2 ,使用数据处理指令为下一次传送修改基址寄存器,即 COPY ADR r1 , TABLE1 ADR r2 , TABLE2 LDR r0 , r1 STR r0 , r2 ADD r1 , r1 , #4 ADD r2 , r2 , #4 TABLE1 TABLE2 ,所有Load和Store指令只能使用
12、这种寄存器间接寻址的简单形式,其他形式均在此基础上变化,其目的是使代码更高效。 基址偏移寻址(修改指针) LDR r0 , r1 , #4 ;r0 := mem r1 + 4 这是一个前变址寻址模式,这种模式可以使用一个基址寄存器来访问位于同一区域的多个存储单元。 可以使用带有自动变址的前变址寻址来实现对基址寄存器的修改,这样可以让程序追踪一个数据表。 LDR r0 , r1 , #4 ! ;r0 := mem r1 + 4 ;r1 := r1 + 4,上面程序中的惊叹号表示在开始传送数据后,基址寄存器将更新。在ARM中自动变址并不花费额外的时间,但它严格的等效于先执行一条简单的寄存器间接Lo
13、ad指令,再执行一条数据处理指令,避免了额外的指令时间和代码空间开销。 LDR r0 , r1+4 ADD r1 , r1 + 4 后变址寻址: LDR r0 , r1 , #4 ;r0 := mem r1 ;r1 := r1 + 4 这是一个后变址寻址模式,它允许基址不加偏移即作为传送地址使用,而后再自动变址。它等同于两条指令,但其速度快且占用较少的代码空间。,COPY ADR r1 , TABLE1 ADR r2 , TABLE2 LOOP LDR r0 , r1 , #4 STR r0 , r2 , #4 ? TABLE1 TABLE2 ,比较: COPY ADR r1 , TABLE1
14、 ADR r2 , TABLE2 LDR r0 , r1 STR r0 , r2 ADD r1 , r1 , #4 ADD r2 , r2 , #4 TABLE1 TABLE2 ,2、多寄存器的Load和Store指令:,为保存和恢复处理器状态以及在存储器中移动数据块提供了一种有效方式。 它节省代码空间,使操作速度比顺序执行等效的单寄存器Load、Store指令快达4倍。 举例: LDMIA r1 , r0 , r2 , r5 ;r0 := r1 ;r2 := r1+4 ;r5 := r1+8 注意:该指令执行完后r1内容不变。 LDMIA r1! , r0 , r2 , r5 ;r0 :=
15、r1 ;r2 := r1+4 ;r5 := r1+8 注意:该指令执行完后r1改变。,堆栈寻址:,堆栈经常作为一个线性的数据结构来实现,当加入数据时它就向下增大存贮空间(递减);而数据移走时,它又缩回来。 堆栈指针总是保持在当前栈顶的地址,它指向最后压入堆栈的有效数据(满栈),或指向一个数据空位(空栈)。 满递减:堆栈随着减小存储器地址而向下增长,基址寄存器指向存储有效数据的最低地址。 STMFD r13! , r2 r9 ;将寄存器压入堆栈 LDMFD r13! , r2 r9 ;从堆栈中恢复 注意:在堆栈操作中几乎总是要指定自动变址,以便保证堆栈指针具有一致的行为。,ARM体系结构中使用多
16、寄存器指令完成堆栈操作。进栈使用STM指令,出栈使用LDM指令。 在使用堆栈时,需要确定堆栈在存储器空间是向上生长还是向下生长的,向上称为递增(Ascending),向下称为(Descending)。 满堆栈是指SP指向最后一个进栈的有效数据。 空堆栈是指SP指向最后一个进栈的有效数据的下一个空地址。 LDM和STM指令往往结合下面一些参数实现堆栈操作。 FD满递减堆栈。 ED空递减堆栈。 FA满递增堆栈。 EA空递增堆栈。,ARM制定了ARM-Thumb过程调用标准(ATPCS),在标准中,堆栈被定义为满递减式。因此,LDMFD和STMFD指令分别用来支持出栈和进栈操作。,块拷贝(多寄存器数
17、据传送寻址模式):,块拷贝概念基于数据被存储到基址寄存器的地址(指针)以上还是以下,以及地址的增(I)减(D)开始于存储了第一个数据之前(B)还是之后(A)。 对于Load、Store操作,这两种概念的映射是不同的(见8086方向标志)。,例如:把8个字从r0指向的位置拷贝到r1指向的位置,即 LDMIA r0 ! , r2 r9 STMIA r1 , r2 r9 执行后,r0增加了32。这是由于“!”使其自动变址8个字节,而r1没有改变。 如果r2-r9含有有用的数据,则可以先把它们压入堆栈,即 STMFD r13 ! , r2 - r9 ; 将寄存器压栈 LDMIA r0 ! , r2 r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 第三 ARM 指令系统
链接地址:https://www.31doc.com/p-2899784.html