ARM微处理器的指令系统教学PPT.ppt_第1页
ARM微处理器的指令系统教学PPT.ppt_第2页
ARM微处理器的指令系统教学PPT.ppt_第3页
ARM微处理器的指令系统教学PPT.ppt_第4页
ARM微处理器的指令系统教学PPT.ppt_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.3 arm微处理器的指令系统,3.3.1 指令集概述 3.3.2 寻址方式 3.3.3 指令集,3.3.1 指令集概述,指令长度 指令集可以是以下任一种 32 bits 长 (arm状态) 16 bits 长 (thumb 状态) arm7tdmi 支持3种数据类型 字节 (8-bit) 半字 (16-bit) 字 (32-bit) 字必须被排成4个字节边界对齐,半字必须被排列成2个字节边界对齐,arm指令集的特点,向后兼容:新版本增加指令,并保持指令向后兼容; load-store 结构* load/store 从存储器中读某个值,操作完后再将其放回存储器中 只对存放在寄存器的数据进行处理; 对于存储器中的数据,只能使用load/store指令进行存取,指令格式,指令格式 在arm状态中使用,指令编码格式,cond 指令执行的条件编码 opcode 指令操作符编码 s 决定指令的操作是否影响cpsr的值 rd 操作目标寄存器编码 rn 包含第一操作数的寄存器编码 shifter_operand 表示第二操作数,条件码标志,任何数据处理指令都可以设置条件码 (n, z, v, and c) 适用于除比较操作外的所有数据处理指令 特殊的请求必须在汇编语言中实现,这种请求是通过把”s”增加到选择代码中指定的 算术操作设置所有的标志位 (n, z, c, and v) 逻辑和移位操作设置 n and z,条件码标志,下表为所有可能的条件码: 注意:al为默认状态,不需要单独指出,条件执行示例,一系列的指令都使用条件指令 if (a=0) func(1); cmp r0,#0 moveq r0,#1;把func()函数的参数赋给r0 bleq func 置标志位,再使用不同的条件码 if (a=0) x=0 ;r0:a,r1:x if (a0) x=1; cmp r0,#0 moveq r1,#0 movgt r1,#1 使用条件比较指令 if (a=4 | a=10) x=0; cmp r0,#4 cmpne r0,#10 moveq r1,#0,桶形移位器,桶形移位器的使用: 支持第二操作数的移位,逻辑移位:空位以零补充 lsl:逻辑左移:字的最小位空位清零 lsr:逻辑右移:字的最大位空位清零.,算术移位: asr: = lsr asl: 算术左移,算术移位的对象是带符号数,在移位过程中必须保持操作数的符号不变。若源操作数为正数,则字的高端空出的位补0。若源操作数为负数,则字的高端空出的位补1。,循环移位: ror:循环右移(rotate right)。从字的最低端移出的位填入字的高端空出的位。 rrx:扩展为1的循环右移(rotate right extended by 1 place)。操作数右移一位,空位(位31)用原c标志填充。,数据处理指令,立即数操作: 移位寄存器操作数 第二个操作数在与第一个操作数合成之前,是服从于移位操作的.,arm指令分类,存储器访问指令 把存储器的值拷贝到寄存器中 (load) or 把寄存器中的值拷贝到存储器中(store) 数据处理指令 使用和改变寄存器的值 控制流指令 分支 分支和链接, 保存返回的地址,以恢复最先的次序 软件中断指令 程序状态寄存器指令 协处理器指令,3.3.2 寻址方式,寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。arm处理器具有9种基本寻址方式。 寻址方式分类: 1.寄存器寻址; 2.立即数寻址; 3.寄存器移位寻址; 4.寄存器间接寻址; 5.基址寻址; 6.多寄存器寻址; 7.堆栈寻址; 8.块拷贝寻址; 9.相对寻址。,操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下: mov r1,r2 ;将r2的值存入r1 sub r0,r1,r2 ;将r1的值减去r2的值,结果保存到r0,mov r1,r2,0xaa,寻址方式分类寄存器寻址,立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下: subs r0,r0,#1 ;r0减1,结果放入r0,并且影响标志位 mov r0,#0xff000 ;将立即数0xff000装入r0寄存器,寻址方式分类立即寻址,mov r0,#0xff00,0xff00,从代码中获得数据,寄存器移位寻址是arm指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下: mov r0,r2,lsl #3 ;r2的值左移3位,结果放入r0, ;即是r0=r28 ands r1,r1,r2,lsl r3 ;r2的值左移r3位,然后和r1相 ;“与”操作,结果放入r1,寻址方式分类寄存器移位寻址,mov r0,r2,lsl #3,0x08,0x08,逻辑左移3位,寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下: ldr r1,r2 ;将r2指向的存储单元的数据读出 ;保存在r1中 swp r1,r1,r2 ;将寄存器r1的值和r2指定的存储 ;单元的内容交换,寻址方式分类寄存器间接寻址,ldr r0,r2,0xaa,基址寻址就是将基址寄存器的内容与指令中给出的偏移量(4k)相加/减,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。寄存器间接寻址是偏移量为0的基址加偏移寻址。 基址寻址指令举例如下(前索引寻址): ldr r2,r3,#0x0c ;读取r3+0x0c地址上的存储单元 ;的内容,放入r2 str r1,r0,#-4! ;先r0=r0-4,然后把r0的值寄存 ;到保存到r1指定的存储单元,寻址方式分类基址寻址,ldr r2,r3,#0x0c,0xaa,将r3+0x0c作为地址装载数据,基址寻址指令举例如下: ldr r0,r1 ,#4 ;r0=r1,r1r14 ;后索引基址寻址 ;arm这种自动索引机制不消耗额外的时间 ldr r0,r1,r2 ;r0=r1+r2,寻址方式分类基址寻址,多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下: ldmia r1!,r2-r7,r12 ;将r1指向的单元中的数据读出到 ;r2r7、r12中(r1自动加4) stmia r0!,r2-r7,r12 ;将寄存器r2r7、r12的值保 ;存到r0指向的存储; 单元中 ;(r0自动加4),寻址方式分类多寄存器寻址,ldr r1!,r2-r4,r6,0x40000000,堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出” 。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈 向下生长:向低地址方向生长,称为递减堆栈,寻址方式分类堆栈寻址,寻址方式分类堆栈寻址,0x12345678,0x12345678,堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。,寻址方式分类堆栈寻址,0x12345678,所以可以组合出四种类型的堆栈方式: 满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如ldmfa、stmfa等; 空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如ldmea、stmea等; 满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如ldmfd、stmfd等; 空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如ldmed、stmed等。,寻址方式分类堆栈寻址,多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。 如: stmia r0!,r1-r7 ;将r1r7的数据保存到存储器中。 ;存储指针r0在保存第一个值之后增加, ;增长方向为向上增长。 stmib r0!,r1-r7 ;将r1r7的数据保存到存储器中。 ;存储指针r0在保存第一个值之前增加, ;增长方向为向上增长。,寻址方式分类块拷贝寻址,相对寻址是基址寻址的一种变通。由程序计数器pc提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下: bl subr1 ;调用到subr1子程序 beq loop ;条件跳转到loop标号处 . loop: mov r6,#1 . subr1 : .,寻址方式分类相对寻址,3.3.3 指令集,指令分类 (1)存储器访问指令 把存储器的值拷贝到寄存器中 (load) or 把寄存器中的值拷贝到存储器中(store) (2)数据处理指令 使用和改变寄存器的值 (3)控制流指令 分支 分支和链接, 保存返回的地址,以恢复最先的次序 (4)软件中断指令 (5)程序状态寄存器指令 (6)协处理器指令 (7)伪指令,(1)存储器访问指令,1)单寄存器数据传送(ldr、str) 2)多寄存器数据传送(ldm、stm) 3)寄存器和存储器交换指令swp,单字(32bit), 半字(6 bit) 以及字节(8 bit) 传送 寻址 寄存器偏移 地址 =基址 寄存器偏移 立即数偏移 地址 = 基址 立即数常数 后变址post-indexing: modify address after use 前变址pre-indexing: modify address before use 回写 如果可能,更新基址寄存器,1)单指令传送 (ldr, str),单寄存器传送指令,寻址方式,例子,pre r0=0x00000000, r1=0x00009000, mem320x00009000=0x01010101 mem320x00009004=0x02020202 回写型前变址寻址: ldr r0, r1, #0x4! post r0=0x02020202, r1=0x00009004 前变址寻址: ldr r0, r1,#0x4 post r0=0x02020202, r1=0x00009000 后变址寻址: ldr r0, r1 ,#0x4 post r0=0x01010101, r1=0x00009004,数据传送指令 - 5,2)多寄存器数据传送指令 ldm,stm,load (ldm) 或 store (stm) 当前可访问寄存器的任意子集 使用 堆栈: maintaining full or empty stacks which can grow up or down memory 上下文切换: 保存或重新存储工作寄存器 块拷贝:在主存储器中移动大数据块 寻址 pre/post indexing auto increment or decrement 回写到基址寄存器write back the base register,多寄存器数据传送指令的要点,多寄存器load/store指令会增加中断的延迟,因为arm不会打断正在执行的指令去响应中断,而必须等到指令执行完成; 一般编译器将提供一个选项以控制load/store指令可以传送的最大寄存器数目,以限制最大中断延迟。,多寄存器传送指令的寻址模式,注:!决定rn的值是否随着传送而改变,例子,要求:保存r1r3到内存地址0x90000x900c,并且更新基址寄存器r4 pre: r1=0x00000001, r2=0x00000002, r3=0x00000003, r4=0x9000 执行操作: stmia r4!, r1, r2, r3(执行后增加) post: mem320x9000=0x00000001 mem320x9004=0x00000002 mem320x9008=0x00000003 r4=0x900c,多寄存器传送寻址模式,例:将存储器中的连续数据装载到寄存器,pre: mem320x80018=0x03, mem320x80014=0x02, mem320x80010=0x01, r0=0x00080010, r1=0x00000000, r2=0x00000000, r3=0x00000000 执行指令: ldmia r0!, r1-r3 post: r0=0x0008001c, r1=0x00000001, r2=0x00000002, r3=0x00000003,例:完成一个存储器数据块拷贝,注:r9存放源数据的起始地址 r10存放目标起始地址 r11存放源结束地址 loop: ldmia r9!, r0-r7 ;装载32字节并更新r9指针 stmia r10!, r0-r7 ;存储32字节并更新r10指针 cmp r9, r11 ;是否到达结束地址 bne loop ;不相等跳转,堆栈操作,arm使用多寄存器load/store指令来完成堆栈操作; 使用堆栈时,需要确定堆栈在存储空间中是向上生长(递增的“a”)还是向下生长(递减的“d”); 满堆栈(“f”)是指堆栈指针指向堆栈的最后一个已使用的地址或满位置;相反,空堆栈(“e”)是指sp指向堆栈的第一个没有使用的地址或空位置;,堆栈操作寻址方式,堆栈,arm堆栈操作通过块传送指令来完成: stmfd (push) 块存储- full descending stack stmdb ldmfd (pop) 块装载- full descending stack ldmia,stmfd sp!,r4-r7,lr,8034,例:把寄存器内容放入堆栈,更新sp,pre : r1=0x00000002, r4=0x00000003, sp=0x00080014 执行指令: stmfd sp!, r1,r4 post: r1=0x00000002, r4=0x00000003, sp=0x0008000c,在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。 语法: swpb rd, rm, rn,3)单数据交换指令 - swap,swap指令的用法,pre mem320x9000=0x12345678, r0=0x00000000, r1=0x11112222, r2=0x00009000 执行操作: swp r0, r1, r2 post: mem320x9000=0x11112222, r0=0x12345678, r1=0x11112222, r2=0x00009000 交换指令多用于实现操作系统中的信号量和互斥操作,该指令有修饰符b,即有字交换和字节交换两种形式;,(2)数据处理指令,1)数据传送指令 - mov,mov指令是把一个数n送到目标寄存器中,n可以是寄存器,也可以是立即数。 mov指令语法: 指令cond s rd, n,pre: r0=8, r2=5 mov r0 ,r2, lsl #2(逻辑左移两位:r22=5*4) post: r0=20, r2=5,例:pre: r0= 5 , r2=6 mov r0, r2 post: r0=6 ,r2=6,2)数据处理指令,立即数操作: 移位寄存器操作数 第二个操作数在与第一个操作数合成之前,是服从于移位操作的.,任何数据处理指令都可以设置条件码 (n, z, v, and c) 适用于除比较操作外的所有数据处理指令 特殊的请求必须在汇编语言中实现,这种请求是通过把”s”增加到选择代码中指定的 算术操作设置所有的标志位 (n, z, c, and v) 逻辑和移位操作设置 n and z,3)乘法指令集,在寄存器产生32位值,例子 (乘法, 乘法累加器) 注意 最低 32-bits 置于结果寄存器中,其余被忽略 不支持第二立即操作数 结果寄存器与源寄存器必须不同,(4)控制和分支指令,在arm中有两种方式可以实现程序的跳转,一种是使用分支指令直接跳转,另一种则是直接向pc寄存器赋值实现跳转。 分支指令有以下三种: 1)分支指令b; 2)带链接的分支指令bl; 3)带状态切换的分支指令bx。,arm分支指令指令编码,分支指令b/bl指令编码格式,指令执行的条件码,l区别b指令(l为0)和bl指令(l为1),24位有符号立即数(偏移量),分支指令bx指令编码格式,指令执行的条件码,rm目标地址寄存器,该寄存器装载跳转地址,arm指令分支指令,1)分支指令b,分支指令b指令,该指令跳转范围限制在当前指令的32m字节地址内(arm指令为字对齐,最低2位地址固定为0)。指令格式如下: bcond label 应用示例: b waita ; 跳转到waita标号处 b 0x1234 ; 跳转到绝对地址0x1234处,2)带链接的分支指令bl,带链接的分支指令bl指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到r14(即lr) 连接寄存器中,然后跳转到指定地址运行程序。跳转范围限制在当前指令的32m字节地址内。指令格式如下: blcond label,1.当程序执行到bl跳转指令时,硬件将下一条指令的地址addr2装入lr寄存器,并把跳转地址装入程序计数器(pc),程序跳转到目标地址label继续执行,当子程序执行结束后,将lr寄存器内容存入pc,返回调用函数继续执行,应用示例(调用子程序): bl label,3)带状态切换的分支指令,带状态切换的分支指令bx指令,该指令可以根据跳转地址(rm)的最低位来切换处理器状态。指令格式如下: bxcond rm,arm指令分支指令,带状态切换的分支指令bx指令,该指令可以根据跳转地址(rm)的最低位来切换处理器状态。rm的位0不用作地址的一部分。若rm的位0为1,则指令将cpsr中的标志t置位,且将目标地址的代码解释为thumb代码;若rm的位0为0,则rm的位1就不能为1 。指令格式如下: bxcond rm,应用示例: adrl r0,thumbfun+1 ;将thumb程序的入口地址加1存入r0 bx r0 ; 跳转到r0指定的地址, ;并根据r0的最低位来切换处理器状态,分支和链接指令,分支子程序 (r14 serves as a link register) 嵌套子程序,full descending,(4)软件中断 (swi),产生一个异常陷阱,跳转到swi 硬件向量。 swi 处理程序可以检测swi号,从而决定采取何种操作。 通过swi机制,运行在用户模式下的应用程序,可请求操作系统执行一系列特权操作。 语法: swi ,软件中断 (swi)执行的操作,swi中断处理程序,处理软件中断的代码段称为中断处理程序(swi handler),中断处理程序是通过执行指令的地址获取软件中断号,指令地址是从lr计算出来的; swi号的确定方法: swi_number=and not(0xff000000),0,swi处理程序应用示例,swi_handler ;保存寄存器r0r12和lr stmfd sp!, r0-r12,lr ;read the swi instruction ldr r10,lr,#-4 ;make off top 8 bits bic r10,r10, #0xff000000 ; r10-contains the swi number bl service_routine ;return from swi handler ldmfd sp!, r0-r12,pc,在swi异常中断处理程序中,取出swi指令中立即数的步骤为: 首先确定引起软中断的swi指令是arm指令还是thumb指令,这可通过对spsr访问得到; 然后取得该swi指令的地址,这可通过访问lr寄存器得到; 接着读出该swi指令,分解出立即数。,swi_handler stmfd sp!, r0-r3, r12, lr ; 现场保护 mrs r0, spsr ; 读取spsr stmfd sp!, r0 ; 保存spsr tst r0, #0x20 ; 测试t标志位 ldrneh r0, lr,#-2 ; 若是thumb指令,读取指令码(16位) bicne r0, r0, #0xff00 ; 取得thumb指令的8位立即数(低8位) ldreq r0, lr,#-4 ; 若是arm指令,读取指令码(32位) biceq r0, r0, #0xff000000 ; 取得arm指令的24位立即数(低23位) . ldmfd sp!, r0-r3, r12, pc ; swi异常中断返回,ne:z=0 eq:z=1,(5)程序状态寄存器访问指令,程序状态寄存器访问指令(mrs, msr) mrs 程序状态寄存器到通用寄存器的数据传送指令 msr 通用寄存器到程序状态寄存器的数据传送指令,psr 传送指令,mrs和msr允许传送cpsr / spsr中的内容到/从一个通用寄存器中。 语法: mrs rd, ; rd = msr ,rm ; = rm 在这里: = cpsr or spsr _fields = fsxc的任意组合 也允许送一个立即数到 psr_fields msr ,#immediate 用户模式下,所有位均可以被读取,但只有条件标志位 (_)可被写。,状态寄存器访问指令示例,在arm处理器中,只有msr指令可以对状态寄存器cpsr和spsr进行写操作。与mrs配合使用,可以实现对cpsr或spsr寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止irq/fiq中断等。,(6)协处理器指令 - 1,协处理器 一般原理是通过增加核扩展指令集 example : 如 mmu & cache. fpu等系统控制器 寄存器 协处理器专用 arm 控制数据流 协处理器只包含数据处理和存贮器传送操作 协处理器数据操作 (cdp) 这类指令是用来告诉协处理器执行某些内部操作 无结果返回arm,arm并不等待操作完成,(6)协处理器指令-2,arm体系支持16个协处理器 针对每个协处理器的指令占用 arm指令集中的固定部分 如果相应的协处理器不存在, 将发生一个未定义指令异常。 这有三种协处理器指令 协处理器数据处理指令 cdp:初始化协处理器数据处理操作 协处理器寄存器传送指令 mcr: 从 arm 寄存器移到协处理器寄存器 mrc:从协处理器寄存器移到arm 寄存器 协处理器存储器传送指令 ldc:从存储器装载到协处理器寄存器 stc:从协处理器寄存器存储到存储器,(7)arm伪指令,arm伪指令不属于arm指令集中的指令,但是可以像其它arm指令一样使用; 伪指令为了编程方便而定义的。在编译时这些指令将被等效的一条或多条arm指令所代替。 arm伪指令有四条,分别: adr伪指令 adrl伪指令 ldr伪指令 nop伪指令。,地址表达式expr的取指范围: 当地址值是字节对齐时,其取指范围为-255255; 当地址值是字对齐时,其取指范围为-10201020;,1)arm伪指令小范围的地址读取,adr伪指令将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。 编译源程序时,通常,编译器用一条add指令或sub指令来实现该adr伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,1)arm伪指令小范围的地址读取,adr伪指令将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。 编译源程序时,通常,编译器用一条add指令或sub指令来实现该adr伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,应用示例(源程序):,使用伪指令将程序标号delay的地址存入r0,. adr r0,delay . delay mov r0,r14 .,. 0x20 add r0,pc,#0x3c . . 0x64 mov r0,r14 .,adr伪指令将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。 编译源程序时,通常,编译器用一条add指令或sub指令来实现该adr伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,. adr r0,delay . delay mov r0,r14 .,应用示例(源程序):,编译后的反汇编代码:,使用伪指令将程序标号delay的地址存入r0,地址,程序代码,1)arm伪指令小范围的地址读取,adr伪指令将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。 编译源程序时,编译器用一条add指令或sub指令来实现该adr伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,. adr r0,delay . delay mov r0,r14 .,应用示例(源程序):,. 0x20 add r0,pc,#0x3c . . 0x64 mov r0,r14 .,编译后的反汇编代码:,使用伪指令将程序标号delay的地址存入r0,adr伪指令被汇编成一条指令,1)arm伪指令小范围的地址读取-3,应用示例2(查表): adr r0,disp_tab ; 加载转换表地址 ldrb r1,r0,r2 ; 使用r2作为参数,进行查表 disp_tab: dcb 0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,2)arm伪指令中等范围的地址读取,adrl伪指令将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比adr伪指令可以读取更大范围的地址 。 编译源程序时,adrl伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,地址表达式expr的取指范围: 当地址值是字节对齐时,其取指范围为-64k64k; 当地址值是字对齐时,其取指范围为-256k256k;,. adrl r0,delay . delay mov r0,r14 .,应用示例(源程序):,使用伪指令将程序标号delay的地址存入r0,adrl伪指令将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比adr伪指令可以读取更大范围的地址 。 编译源程序时,adrl伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,2)arm伪指令中等范围的地址读取,. adrl r0,delay . delay mov r0,r14 .,应用示例(源程序):,. 0x20 add r0,pc,#40 0x24 add r0,r0,#ff00 . 0xff68 mov r0,r14 .,编译后的反汇编代码:,使用伪指令将程序标号delay的地址存入r0,地址,程序代码,adrl伪指令将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比adr伪指令可以读取更大范围的地址 。 编译源程序时,adrl伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,2)arm伪指令中等范围的地址读取,. adrl r0,delay . delay mov r0,r14 .,应用示例(源程序):,. 0x20 add r0,pc,#40 0x24 add r0,r0,#ff00 . 0xff68 mov r0,r14 .,编译后的反汇编代码:,使用伪指令将程序标号delay的地址存入r0,adrl伪指令被汇编成两条指令,adrl伪指令将基于pc相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比adr伪指令可以读取更大范围的地址 。 编译源程序时,adrl伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,2)arm伪指令中等范围的地址读取,3)arm伪指令大范围的地址读取,ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。 在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。 若加载的常数未超出mov或mvn的范围,则使用mov或mvn指令代替该ldr伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读出常量。,注意: 1.从指令位置到文字池的偏移量必须小于4kb; 2.与arm指令的ldr相比,伪指令的ldr的参数有“=”号。,应用示例(加载常量):,ldr r2, =0xff0 ;mov r2, #0xff0 ldr r0, =0xff000000 ;mov r0, #0xff000000 ldr r1, =0xfffffffe ;mvn r1, #0x1,ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。 在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。 若加载的常数未超出mov或mvn的范围,则使用mov或mvn指令代替该ldr伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读出常量。,3)arm伪指令大范围的地址读取,应用示例(加载地址):,. ldr r1,=initstack . initstack mov r0, lr .,使用伪指令将程序标号initstack的地址存入r1,ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。 在汇编编译源程序时,ldr伪指令被编译

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论