ARM Cortex-A9嵌入式微处理器体系结构与接口技术 课件 第3章 ARM微处理器指令系统_第1页
ARM Cortex-A9嵌入式微处理器体系结构与接口技术 课件 第3章 ARM微处理器指令系统_第2页
ARM Cortex-A9嵌入式微处理器体系结构与接口技术 课件 第3章 ARM微处理器指令系统_第3页
ARM Cortex-A9嵌入式微处理器体系结构与接口技术 课件 第3章 ARM微处理器指令系统_第4页
ARM Cortex-A9嵌入式微处理器体系结构与接口技术 课件 第3章 ARM微处理器指令系统_第5页
已阅读5页,还剩134页未读 继续免费阅读

下载本文档

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

文档简介

第三章

ARM微处理器指令系统1思维导图2学习目标学习目标掌握ARM指令系统基础,掌握寻址方式和ARM指令集了解Thumb指令集及Thumb-2技术。4.熟悉扩展指令集5.深入理解ATPCS标准6.掌握汇编语言编程基础及C语言与汇编语言混合编程技巧。3技能目标技能目标具备指令解析能力、指令运用能力、Thumb技术优化能力;具备汇编语言编程实践与混合编程实现能力。4CONTENTS目录3.1ARM指令集概述3.2基本寻址方式3.3ARM指令集简介3.4Thumb指令集3.5Thumb-2技术3.6其他扩展指令3.7ARM汇编程序设计3.8ATPCS介绍3.9C、汇编语言混合编程5嵌入式开发的底层真相系统上电后的第一个程序嵌入式系统没有BIOS,上电后CPU从复位地址(通常是0x00000000)取第一条指令。这段启动代码(Bootloader)必须使用汇编编写,因为此时C语言运行环境尚未建立:栈未初始化、全局变量未拷贝、BSS段未清零。没有启动代码,C程序的main函数永远无法执行直接操作硬件寄存器汇编语言能够直接读写硬件寄存器,实现对CPU、中断控制器、时钟模块、GPIO等外设的精确控制。每个寄存器位都有特定含义,汇编可以按位操作,而C语言需要通过指针间接访问,增加了复杂度和不确定性。数十个通用寄存器100+特殊功能寄存器资源受限环境的精确控制嵌入式系统通常具有有限的RAM和ROM。汇编语言编写的代码体积小、执行效率高,能够精确控制每一字节内存的使用。在物联网设备、传感器节点等资源极度受限的场景下,汇编优化可以延长电池寿命数周甚至数月。代码体积优化-30%~50%实时性与确定性工业控制、汽车电子、医疗设备等场景对响应时间有严格要求。汇编语言可以精确控制每条指令的执行周期,消除C编译器优化带来的不确定性,确保系统在微秒级时间内做出响应。C语言响应~ms汇编优化~μs6C语言的局限性:为什么不够C语言无法直接完成的任务1中断向量表设置ARM处理器上电后需要在中断向量表的固定地址处放置跳转指令,C语言无法直接控制这些底层地址2处理器模式切换切换特权模式、修改CPSR寄存器、使能/禁用中断等操作需要直接操作特殊寄存器3精确时序控制某些硬件接口(如SPI、I2C)需要纳秒级的时序精度,C编译器无法保证指令执行周期的确定性4启动阶段初始化栈指针设置、全局变量拷贝、BSS段清零等必须在main函数之前完成C编译器生成的代码vs手工汇编C代码示例intadd(inta,intb){//编译器可能生成//10+条指令//包括栈操作等}汇编优化ADDr0,r0,r1;仅需1条指令;1个时钟周期;零额外开销性能对比数据执行效率汇编+40%代码体积汇编-35%响应时间汇编-60%关键洞察C语言是应用层开发的最佳选择汇编语言是底层控制的必备工具两者相辅相成,缺一不可7MOVR1,R2指令集:MOVADDSUBCMPBLLDR汇编器:

是一种将汇编语言代码翻译成机器代码的程序,这极大的提高了效率。机器码000000011010000000010000000000108汇编指令内核指令集ARM指令集ARM指令集所有指令长度都是32位,指令效率最高,代码密度较低;数据处理指令可以访问全部通用寄存器;指令支持第二操作数支持移位器,指令使用更加灵活。Thumb指令集Thumb是一个16位指令集,优化了C代码的代码密度(约为ARM代码大小的65%),但执行效率较低;ARM指令集功能的子集,可能需要几个Thumb指令来代替一个ARM指令;数据处理指令只能访问低端寄存器(R0-R7),常数范围小通常为0~255;无法使用协处理器;在内存较小的场景中提高性能。Thumb-2指令集Thumb-2支持16位指令和32位指令混合编程,代码密度高于ARM约26%,效率高于Thumb约25%;实现了大部分ARM指令集的功能。9ARM数据处理指令的基本语法格式如下:<opcode>{<cond>}{S},<Rd>,<Rn>,<shifter_operand>其中,“<>”内的项是必需的;“{}”内的项是可选的。opcode为指令助记符,如LDR、STR等;cond为指令执行条件,如EQ、NE等,是可选的,如果不写则使用默认条件AL(无条件执行);S为可选后缀,指令后加上S,指令执行成功完成后自动更新CPSR寄存器的条件标志位;Rd为目标寄存器;Rn为第1个操作数的寄存器;shift_operand为第2个操作数。在ARM指令中,灵活地使用第2个操作数能提高代码效率。指令格式举例:

ADDSR1,R1,#0x01

;加法指令,R1←R1+0x01,带有S,自动更新CPSR寄存器条件标志位3.1.1基本格式3.1ARM指令集概述10指令格式举例:

BEQDT1

;跳转指令,执行条件EQ,相等则跳转到DT13.1.2指令的条件码3.1ARM指令集概述表3-1ARM条件码113.2ARM指令寻址方式寻址方式是根据指令中给出的地址码字段实现寻找真实操作数地址的方式。ADDR0,R1,R2MOVR0,R3,LSL#02LDRR1,[R2,#0x04]LDRR0,[R1]LDMIAR0,{R0,R1,R3}LDRRd,[Rn],#-0x0412ARM指令系统支持如下几种常见的寻址方式:1.寄存器寻址2.立即寻址3.寄存器移位寻址4.寄存器间接寻址5.变址寻址6.多寄存器寻址7.块复制寻址8.堆栈寻址

9.相对寻址3.2ARM指令寻址方式13寄存器寻址是指操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,寄存器的内容是操作数,指令执行时直接取出寄存器值操作。这是各类微处理器常用的一种有较高执行效率的寻址方式。寄存器寻址原理MOVR1,R2SUBR0,R1,R2寄存器寻址示例1.寄存器寻址3.2ARM指令寻址方式14在立即寻址指令中,数据就包含在指令当中,立即寻址指令的操作码字段后面的地址码部分就是操作数本身,取出指令也就取出了可以立即使用的操作数(也称为立即数)。立即数要以“#”为前缀,表示十六进制数值时以“0x”表示。立即数寻址原理ADDR0,R0,#1MOVR0,#0xff00立即数寻址示例有效立即数问题2.立即寻址3.2ARM指令寻址方式指令中的立即数是由一个8bit的常数移动偶数位(0,2,4,···,26,28,30)得到的。因此,每一条指令都包含一个8bit的常数X(后占据指令二进制编码[7:0]位)和移位值Y(后占据指令二进制编码[7:0]位),得到的立即数等于8bit常数X循环右移偶数(2×Y)位。15有效立即数问题在ARM数据处理指令中,当参与操作的第二操作数为立即数型时,每个立即数都是采用一个8位的常数循环右移偶数位而间接得到。其中循环右移的位数由一个4位二进制的两倍表示。

在32位指令编码中存放32位立即数的方法是:

立即数构成(12位编码):8位常数+4位的循环右移值(rotate_imm)因此有效立即数immediate可以表示成:

<immediate>=immed_8循环右移(2×rotate_imm)位

循环右移10位0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常数2.立即寻址3.2ARM指令寻址方式16寄存器移位寻址是先对寄存器中的值进行移位操作,再将移位后的结果作为操作数。移位操作包括逻辑左移、逻辑右移、算术右移、循环右移等,通过不同的移位方式可实现不同的数值变换,满足多样化的运算需求。寄存器移位寻址原理MOVR0,R2,LSR#0x03ANDSR1,R2,R2,LSLR3寄存器移位寻址示例寄存器的值在被送到ALU之前,可以事先经过桶形移位寄存器的处理。预处理和移位发生在同一周期内,因此有效地使用移位寄存器,可以提高代码的执行效率。寄存器移位寻址优势3.寄存器移位寻址3.2ARM指令寻址方式17第二操作数<shifter_operand>移位方式如下:

LSL:逻辑左移,寄存器中空出的最低有效位用0填充。LSR:逻辑右移,寄存器中空出的最高有效位用0填充。ASR:算术右移,算术移位的对象是带符号数,移位过程中必须保持操作数的符号不变。如果源操作数是正数,空出的最高有效位用0填充,如果是负数用1填充。ROR:循环右移,移出的字的最低有效位依次填入空出的最高有效位。RRX:带扩展的循环右移。将寄存器的内容循环右移1位,空位用原来C标志位填充。3.寄存器移位寻址3.2ARM指令寻址方式18第2个操作数Rm,shift——寄存器移位方式LSL移位操作:0LSR移位操作:0ASR移位操作:ROR移位操作:RRX移位操作:C193.寄存器移位寻址3.2ARM指令寻址方式第二操作数的移位位数移位位数可以用立即数方式或者寄存器方式给出,如下所示:ADDR3,R2,R1,LSR#2 ;R3<—R2+R1÷4ADDR3,R2,R1,LSRR4 ;R3<—R2+R1÷2R43.寄存器移位寻址3.2ARM指令寻址方式20寄存器间接寻址原理寄存器间接寻址方式中,操作数的地址不是直接给出的,而是存储在一个寄存器中,即寄存器中的值不是操作数本身,而是指向操作数所在存储单元的地址。寄存器间接寻址优势这种方式使得程序可以更加灵活地访问内存中的数据,因为可以通过修改寄存器中的值来改变访问的内存地址。寄存器间接寻址主要使用在Load/Store指令中。这种寻址方式提高了程序的灵活性和效率,因为它允许程序在运行时动态地改变访问的内存地址,而不需要在编译时就确定所有的内存地址。4.寄存器间接寻址3.2ARM指令寻址方式21

寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:

LDR R1,[R2] /*R1←[R2]*/STR R1,[R2] /*[R2]←R1*/0x55R1R20x400000000xAA0x40000000LDRR1,[R2]0xAA4.寄存器间接寻址3.2ARM指令寻址方式22原理变址寻址是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。优势这种方式允许程序在运行时动态地计算内存地址,从而提高了访问内存的灵活性和效率。通过结合基址寄存器和偏移量,变址寻址可以方便地访问数组、表格等功能部件寄存器中的数据。5.变址寻址3.2ARM指令寻址方式23变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令又可以分为以下几种形式:前变址模式:LDRR0,[R1,#0x04] ;R0←[R1+0x04]自动变址模式:LDRR0,[R1,#0x04]! ;R0←[R1+4]、R1←R1+0x04后变址模式:LDRR0,[R1],#0x04 ;R0←[R1]、R1←R1+0x045.变址寻址3.2ARM指令寻址方式240x55R0R10x400000000xAA0x40000004LDRR0,[R1,#0x04]0xAA将R1+0x04作为地址01多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。连续的寄存器之间用“-”连接,不连续的中间用“,”分割。多寄存器导址原理02LDMIAR1!,{R2-R4,R7};R2←[R1];R3←[R1+4];R4←[R1+8];R7←[R1+12];R1←[R1+16]多寄存器导址示例256.多寄存器寻址3.2ARM指令寻址方式块复制寻址是多寄存器传送指令LDM/STM的寻址方式。LDM指令可以把存储器中的一个数据块加载到多个寄存器中。STM可以把多个寄存器中的内容保存到存储器中。寻址操作中的寄存器可以是R0-R15这16个寄存器的子集或是所有寄存器。LDM/STM指令依据其后缀名的不同其寻址的方式也有很大不同。267.块复制寻址3.2ARM指令寻址方式IA(IncrementAfter)操作完成后地址递增IB(IncrementBefore)地址先增而后完成操作DA(DecrementAfter)操作完成后地址递减DB(DecrementBefore)地址先减而后完成操作0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存储器LDMIAR1!,{R2-R4,R6}0x010x020x030x040x400000107.块复制寻址3.2ARM指令寻址方式27

根据基地址的增长方向是向上还是向下,以及地址的增减与指令操作的先后顺序(操作先进行还是地址先增减)的关系,有以下4种寻址方式:堆栈是按“先进后出”或“后进先出”方式进行存取的存储区。堆栈操作寻址方式和多寄存器Load/Store指令寻址方式十分类似。但对于堆栈的操作,数据写入内存和从内存中读出要使用不同的寻址模式。堆栈操作寻址原理8.堆栈寻址3.2ARM指令寻址方式28

堆栈是一种数据结构,按先进后出(FirstInLastOut,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。

根据不同的寻址方式,将堆栈分为以下4种:当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(FullStack)。当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(EmptyStack)。即访问存储器时,存储器的地址向高地址方向生长,称为递增堆栈(ascendingstack)。存储器的地址向低地址方向生长,称为递减堆栈(descendingstack)。8.堆栈寻址3.2ARM指令寻址方式29栈顶SP

栈顶SP

栈底空堆栈栈底满堆栈堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。0x123456780x12345678栈顶SP

0x12345678栈顶SP

压栈压栈8.堆栈寻址3.2ARM指令寻址方式30四种类型的堆栈工作方式满递增堆栈FA(FullAscending):堆栈指针指向最后压入的数据,且由低地址向高地址生成。满递减堆栈FD(FullDescending):堆栈指针指向最后压入的数据,且由高地址向低地址生成。空递增堆栈EA(EmptyAscending):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。空递减堆栈ED(EmptyDescending):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。318.堆栈寻址3.2ARM指令寻址方式栈底栈顶栈区SP

堆栈存储区栈顶栈底栈区

SP向下增长向上增长0x123456780x12345678堆栈压栈堆栈压栈满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。高地址低地址满递增堆栈满递减堆栈328.堆栈寻址3.2ARM指令寻址方式相对寻址是以程序计数器(PC)为基址寄存器,以指令中的地址标号为偏移量,两者相加形成操作数的有效地址。偏移量指出的是当前指令和地址标号之间的相对位置。子程序调用指令即是相对寻址方式。相对寻址原理01相对寻址常用于子程序调用和条件跳转操作,如在调用子程序时,可通过相对寻址快速跳转到子程序的入口地址,子程序执行完成后返回到主程序的相应位置,实现子程序的调用和返回。条件跳转中也广泛应用,如通过相对寻址实现条件满足时跳转到特定的代码段,条件不满足时继续执行后续代码,实现程序的条件控制和流程分支。相对寻址应用02相对寻址可有效减少指令中的地址信息量,提高指令的紧凑性和可读性。例如,相对寻址只需指定偏移量,无需给出完整的地址信息,可使指令更简洁,便于程序的编写和维护。相对寻址优势03339.相对寻址3.2ARM指令寻址方式相对寻址是变址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:

BL SUBR1 ;调用到SUBR1子程序

BEQ LOOP ;条件跳转到LOOP标号处

...LOOP:MOV R6,#1 ...SUBR1:...349.相对寻址3.2ARM指令寻址方式353.3ARM指令集简介1.存储器访问指令2.数据处理指令3.乘法指令4.ARM跳转指令5.程序状态寄存器处理指令6.协处理器指令7.ARM杂项指令363.3ARM指令集简介3.3.1存储器访问指令

加载/存储指令用于在寄存器和存储器之间传送数据。加载指令用于将存储器中的数据传送到寄存器,存储指令用于将寄存器中的数据保存到存储器。ARM指令中有3种基本的内存访问指令。

(1)单寄存器Load/Store指令:这些指令在可以在ARM寄存器和存储器之间灵活地进行单数据项数据交换。数据项可以是字节、16位半字或32位字。

(2)多寄存器Load/Store内存访问指令:这些指令的灵活性比单寄存器传送指令差,但可以进行批量的数据交换。它们用于进程的进入和退出、保存和恢复工作寄存器以及复制存储器中的一块数据。

(3)单寄存器交换指令:这个指令允许寄存器和存储器中的数值进行交换,在一条指令中有效地完成内存与寄存器之间的数据交换。它们在用户级编程中很少用到。它的主要用途是在多处理器系统中实现信号量(Semaphores)的操作,以保证不会同时访问公用的数据结构。373.3ARM指令集简介3.3.1存储器访问指令

(1)单寄存器Load/Store指令:这种指令用于把单一的数据传入或者传出一个寄存器。支持的数据类型有字节(8位)、半字(16位)和字(32位)。

1)LDR指令(loadsfrommemoryintoRd)

格式:LDR{<cond>}Rd,addr

功能:将存储器地址addr中的内容传输到Rd寄存器中。如果Rd寄存器是PC,从存储器中读出的数据将作为目的地址,以实现程序流程的跳转。

示例:LDRR1,[R0,#0x04];将存储器地址为R0+0x04的字数据读入寄存器R1LDRBR0,[R1];将存储器地址为R1的字节数据读入寄存器R0,将R0的高24位清零说明B:byteH:halfwordSB:signedbyteSH:signedhalfwordT:特权模式下使用3.3ARM指令集简介3.3.1存储器访问指令381)LDR指令(loadsfrommemoryintoRd)助记符说明操作条件码位置LDRRd,addressing加载字数据Rd←[addressing],addressing索引LDR{cond}LDRBRd,addressing加载无符号字节数据Rd←[addressing],addressing索引LDR{cond}BLDRTRd,addressing以用户模式加载字数据Rd←[addressing],addressing索引LDR{cond}TLDRBTRd,addressing以用户模式加载无符号字节数据Rd←[addressing],addressing索引LDR{cond}BTLDRHRd,addressing加载无符号半字数据Rd←[addressing],addressing索引LDR{cond}HLDRSBRd,addressing加载有符号字节数据Rd←[addressing],addressing索引LDR{cond}SBLDRSHRd,addressing加载有符号半字数据

Rd←[addressing],addressing索引

LDR{cond}SH393.3ARM指令集简介3.3.1存储器访问指令

(1)单寄存器Load/Store指令:这种指令用于把单一的数据传入或者传出一个寄存器。支持的数据类型有字节(8位)、半字(16位)和字(32位)。

2)STR指令(storesfromRdintomemory)

格式:STR{<cond>}Rd,addr

功能:将寄存器Rd的内容传输到存储器地址addr中。

示例:STRR1,[R0];将寄存器R1的数据保存到以R0数据为存储器地址中。STRBR0,[R0,#0x08];将寄存器R0的字节数据保存到存储器地址R0+0x08中。助记符说明操作条件码位置STRRd,addressing存储字数据[addressing]←Rd,addressing索引STR{cond}STRB

Rd,addressing

存储字节数据[addressing]←Rd,addressing索引STR{cond}BSTRT

Rd,addressing

以用户模式存储字数据[addressing]←Rd,

addressing索引STR{cond}TSTRBT

Rd,addressing

以用户模式存储字节数据[addressing]←Rd,addressing索引STR{cond}BTSTRH

Rd,addressing

存储半字数据[addressing]←Rd,addressing索引STR{cond}H说明B:byteH:halfwordT:特权模式下使用403.3ARM指令集简介3.3.1存储器访问指令2)STR指令(storesfromRdintomemory)413.3ARM指令集简介3.3.1存储器访问指令

(2)多寄存器Load/Store内存访问指令:多寄存器的Load/Store内存访问指令也叫批量加载/存储指令,它可以实现在一组寄存器和一块连续的内存单元之间传送数据。LDM用于加载多个寄存器,STM用于存储多个寄存器。多寄存器的Load/Store内存访问指令允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器的Load/Store内存访问指令主要用于现场保护、数据复制和参数传递等。

格式:LDM|STM{<cond>}<addressing_mode>Rn{!},registers{^}

功能:LDM和STM指令可实现一片连续的存储空间和一组寄存器之间的数据传输。LDM指令用于加载多个寄存器,STM指令用于存储多个寄存器。多寄存器load/store指令的8种模式如下表所示。右边四种为堆栈操作,左边四种为数据传送操作。模式说明说明模式说明说明IAIncrementafter每次传送后地址加4FDFulldescending满递减堆栈IBIncrementbefore每次传送前地址加4EDEmptydescending空递减堆栈DADecrementafter每次传送后地址减4FAFullascending满递增堆栈DBDecrementbefore每次传送前地址减4EAEmptyascending空递增堆栈数据块传送操作堆栈操作进行数据复制时,先设置好源数据指针和目标指针,然后使用块拷贝寻址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB进行读取和存储。进行堆栈操作操作时,要先设置堆栈指针(SP),然后使用堆栈寻址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA实现堆栈操作。423.3ARM指令集简介3.3.1存储器访问指令

(2)多寄存器Load/Store内存访问指令数据块传送指令操作过程如右图所示,其中R1为指令执行前的基址寄存器,假如R1=4008H,R1’则为指令执行后的基址寄存器。R5R6R7R1

R1’

指令STMIAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1

R1’

指令STMDAR1!,{R5-R7}4000H3FFCH3FF8H400CH4008H4004HR5R6R7R1

R1’

指令STMIBR1!,{R5-R7}400CH4008H4000H4018H4014H4010HR5R6R7R1’

R1

指令STMDBR1!,{R5-R7}3FFCH3FF8H3FF4H4008H4004H4000H举例:存储器访问指令——多寄存器存取3.3ARM指令集简介43443.3ARM指令集简介3.3.1存储器访问指令

(3)单寄存器交换指令:数据交换指令是Load/Store指令的一种特例,它把存储器单元的内容与寄存器内容交换。

1)字交换SWP指令SWP指令用于将内存中的一个字单元和一个指定寄存器的值相交换。

格式:SWP{<cond>}Rd,Rm,[Rn]

功能:寄存器Rn内容为某内存单元地址,指令将内存单元[Rn]中的数据读取到目标寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元[Rn]中。当Rd和Rm为同一个寄存器时,指令交换该寄存器和内存单元的内容。

示例:SWP R1,R1,[R0] ;将R1的内容与R0指向的存储单元的内容进行互换453.3ARM指令集简介3.3.1存储器访问指令

(3)单寄存器交换指令:数据交换指令是Load/Store指令的一种特例,它把存储器单元的内容与寄存器内容交换。

2)字节交换SWPB指令SWPB指令用于将内存中的一个字节单元和一个指定寄存器的低8位相交换。

格式:SWPB{<cond>}Rd,Rm,[Rn]

功能:寄存器Rn内容为某内存单元地址,指令将内存单元[Rn]中的数据读取到目标寄存器Rd中,目标寄存器Rd的高24位设为0,同时将另一个寄存器Rm的低8位内容写入到该内存字节单元中。

当Rd和Rm为同一个寄存器时,指令交换该寄存器低8位内容和内存字节单元的内容。

示例:SWPB R1,R2,[R0];将R0指向的存储单元低字节数据读取到R1中(高24位清零),

;并将R2的内容写入R0指向的存储单元中(最低字节有效)463.3ARM指令集简介3.3.2数据处理指令ARM数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。所有ARM数据处理指令(除了比较指令)均可选择使用S后缀,以影响CPSR标志位。数据传送指令用于将源操作数(寄存器、立即数或移位结果)复制到目的寄存器。算术逻辑运算指令完成常用的算术与逻辑的运算。比较指令不需要后缀S,其不保存运算结果,只更新CPSR中相应的条件标志位。格式:<opcode>{<cond>}{S}<Rd>,<Rn>,<shifter_operand>3.3ARM指令集简介3.3.2数据处理指令数据传送指令算术逻辑运算指令比较指令47483.3ARM指令集简介3.3.2数据处理指令1)数据传送指令MOV指令格式:MOV{<cond>}{S}Rd,operand2功能:将operand2表示的数据传送到目标寄存器Rd中,其中operand2可以是寄存器,也可以是立即数或者移位结果。后缀S表示指令操作是否影响CPSR标志位。

指令举例:MOVR0,#0x02MOVR0,R1MOVSR0,R1,LSL#2MOVPC,LR①MOV指令主要完成以下功能。①将数据从一个寄存器传送到另一个寄存器。②将一个常数值传送到寄存器中。③实现单纯的移位操作。④程序跳转。⑤从某些异常中断中返回。48493.3ARM指令集简介3.3.2数据处理指令1)数据传送指令MVN指令格式:MVN{<cond>}{S}Rd,operand2功能:将operand2表示的数据先按位求反,再传送到目标寄存器Rd中。后缀S表示指令操作是否影响标志位。

指令举例:MVNR0,#0x0FMVNR0,R1MVN指令主要完成以下功能。①向寄存器中传送一个负数。②生成位掩码(BitMask)。③求一个数的反码。②49503.3ARM指令集简介3.3.2数据处理指令2)算术逻辑运算指令ADD指令指令的格式:ADD{<cond>}{S}Rd,Rn,operand2ADD指令将Rn与operand2表示的数据相加,结果存入目标寄存器Rd,若有后缀S,根据操作结果影响标志位。

指令举例:ADDR0,R1,#1ADDR0,R1,R2ADDR0,R1,R2,LSL#3①513.3ARM指令集简介3.3.2数据处理指令

②SUB指令指令的格式:SUB{<cond>}{S}Rd,Rn,operand2SUB指令将Rn值减去operand2操作数,结果存入目标寄存器Rd,若有后缀S,根据操作结果影响标志位。

指令举例:SUBR0,R1,#1SUBR0,R1,R2SUBR0,R1,R2,LSL#32)算术逻辑运算指令523.3ARM指令集简介3.3.2数据处理指令RSB指令指令的格式:RSB{<cond>}{S}Rd,Rn,operand2RSB指令将operand2操作数减去寄存器Rn值,结果存入目标寄存器Rd,若有后缀S,根据操作结果影响标志位。

指令举例:RSBR0,R0,#0xFFFFRSBR0,R1,R2③2)算术逻辑运算指令533.3ARM指令集简介3.3.2数据处理指令ADC指令指令的格式:ADC{<cond>}{S}Rd,Rn,operand2ADC指令将Rn与operand2表示的数据相加后,再加上CPSR中C标志位的值,结果存入目标寄存器Rd,若有后缀S,根据操作结果影响标志位。

指令举例:;完成两个64位数据相加;第一个64位数据:R1、R0;第二个64位数据:R3、R2ADDSR0,R0,R2ADCR1,R1,R3④2)算术逻辑运算指令543.3ARM指令集简介3.3.2数据处理指令SBC指令指令的格式:SBC{<cond>}{S}Rd,Rn,operand2SBC指令将Rn值减去operand2操作数,再减去CPSR中C标志位值的反码,结果存入目标寄存器Rd,若有后缀S,根据操作结果影响标志位。

指令举例:;用于64位数据减法;第一个64位数据:R1、R0;第二个64位数据:R3、R2SUBSR0,R0,R2SBCR1,R1,R3⑤2)算术逻辑运算指令553.3ARM指令集简介3.3.2数据处理指令RSC指令指令的格式:RSC{<cond>}{S}Rd,Rn,operand2RSC指令将operand2操作数减去寄存器Rn值,再减去CPSR中C标志位的反码,结果存入目标寄存器Rd,若有后缀S,根据操作结果影响标志位。

指令举例:RSCR0,R1,R2;下面两条指令用于求64位数据的负数RSBSR2,R0,#0RSCR3,R1,#0⑥2)算术逻辑运算指令563.3ARM指令集简介3.3.2数据处理指令2)算术逻辑运算指令指令格式:AND/ORR/EOR/BIC{<cond>}{S}Rd,Rn,operand2AND指令AND指令对指定数值与寄存器值按位做”与”运算,结果保存到目标寄存器。EOR指令EOR指令对寄存器和指定值进行”异或”操作,结果存储到目标寄存器。ORR指令ORR指令是编程中的按位“或”操作,将源操作数与寄存器值按位做“或”操作,结果保存到指定寄存器中。BIC位清零指令BIC指令将寄存器Rn的值与第2个源操作数operand2的反码按位”与”操作,用于清除寄存器中的某些位,将结果保存到寄存器Rd。ANDR0,R0,#0x03;将R0的位0、位1保持不变,其余为0ORRR0,R0,#0x03;将R0的位0、位1置1EORR0,R0,#0x03;将R0的位0、位1取反BICR0,R0,#0x03;将R0中位0、1清零,其余位不变

57注:这些指令影响N,Z,C和V标志位。指令格式:CMP/CMN/TST/TEQ{<cond>}Rn,operand23.3ARM指令集简介3.3.2数据处理指令3)比较指令指令格式说明操作CMPRn,operand2比较指令标志位N、Z、C、V←Rn-operand2CMNRn,operand2负数比较指令标志位N、Z、C、V←Rn-(-operand2)TSTRn,operand2位测试指令标志位N、Z、C、V←Rn&operand2TEQRn,operand2相等测试指令标志位N、Z、C、V←Rn

异或operand2583.3ARM指令集简介3.3.2数据处理指令指令格式说明操作条件码位置MOVRd,operand2数据传送指令Rd←operand2MOV{cond}{S}MVNRd,operand2数据取反传送指令Rd←(~operand2)MVN(cond}(S)ADDRd,Rn,operand2加法运算指令Rd←Rn+operand2ADD{cond){S)SUBRd,Rn,operand2减法运算指令Rd←Rn-operand2SUB{cond}(SRSBRd,Rn,operand2逆向减法指令Rd←operand2-RnRSB(cond){SADCRd,Rn,operand2带进位加法指令Rd←Rn+operand2+CarryADC(cond}{S}SBCRd,Rn,operand2带进位减法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}(S}RSCRd,Rn,operand2带进位逆向减法指令Rd-operand2-Rn-(NOT)CarryRSC{cond}{S)ANDRd,Rn,operand2逻辑“与”操作指令Rd←Rn&operand2AND(cond}{S}ORRRd,Rn,operand2逻辑“或”操作指令Rd←Rn|operand2ORR{cond}{S)EORRd,Rn,operand2逻辑“异或”操作指令Rd←Rn⨁operand2EOR(cond}(S}BICRd,Rn,operand2位清除指令Rd←Rn&(~operand2)BIC{cond}(S)CMPRn,operand2比较指令标志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2负数比较指令标志N、Z、C,V←Rn+operand2CMN{cond}TSTRn,operand2位测试指令标志N、Z、C、V←Rn&operand2TST(cond)TEQRn,operand2相等测试指令标志N、Z、C、V←Rn⨁operand2TEQ{cond)593.3ARM指令集简介3.3.3乘法指令操作码[23:21]指令格式意义操作000MUL{<cond>}{S}<Rd>,<Rm>,<Rs>乘(保留32位结果)Rd=(Rm*Rs)[31:0]001MLA{<cond>}{S}<Rd>,<Rm>,<Rs>,<Rn>乘加(保留32位结果)Rd=(Rm*Rs+Rn)[31:0]100UMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>无符号数长乘RdHi:RdLo=Rm*Rs101UMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>无符号数长乘-累加RdHi:RdLo+=Rm*Rs110SMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>有符号数长乘RdHi:RdLo=Rm*Rs111SMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>有符号数长乘-累加RdHi:RdLo+=Rm*Rs603.3ARM指令集简介3.3.4ARM跳转指令在ARM中有两种方式可以实现程序的跳转:一种是使用分支指令直接跳转;另一种则是直接向PC寄存器赋值实现跳转。分支指令有以下四种:分支指令B;带链接的分支指令BL;带状态切换的分支指令BX;带链接和状态切换的分支指令BLX。613.3ARM指令集简介3.3.4ARM跳转指令(1)分支指令——B指令(Branch)

指令格式:

B{cond}

目标地址

该指令跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。应用示例:

B

func

;跳转到func标号处

B 0x1234 ;跳转到绝对地址0x1234处623.3ARM指令集简介3.3.4ARM跳转指令(2)带返回的分支指令——BL指令(Branchwithlink)

指令格式:

BL{cond}

目标地址

BL是另一个跳转指令,在跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14的内容重新加载到PC中来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。该指令跳转范围限制在当前指令的±32M字节地址内。应用示例:

BLLabel;当程序无条件跳转到标号Iabel处执行时,同时将当前的PC值保存到R14中633.3ARM指令集简介(3)带返回和状态切换的跳转指令——BLX指令(Branchwithlinkandexchange)

指令格式:

BLX目标地址BLX(BranchwithLinkandeXchange)是ARM架构中支持ARM/Thumb状态无缝切换的函数调用指令。它在单一操作中完成以下功能:将返回地址保存到链接寄存器R14(LR);跳转到目标地址;根据目标地址自动切换处理器状态。

BLX指令有两种格式。第1种格式记作BLX<label>。目标地址在链接时由编译器计算。跳转范围为当前地址±32MB范围内。常用于ARM主程序调用Thumb优化的子程序。

第2种格式记作BLX<Rm>,通过寄存器间接跳转。目标地址保存在ARM寄存器R0~R14。3.3.4ARM跳转指令643.3ARM指令集简介3.3.4ARM跳转指令(4)带状态切换的分支指令——BX指令(Branchandexchange)

指令格式:

BX{cond}Rm

该指令可以根据跳转地址(Rm)的最低位来切换处理器状态。其跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。Rm的位[0]不用作地址的一部分。若Rm的位[0]为1,则指令将CPSR中的标志T置位,且将目标地址的代码解释为Thumb代码;若Rm的位[0]为0,则Rm的位[1]就不能为1。应用示例:

ADRLR0,ThumbFun+1

;将Thumb程序的入口地址加1存入R0

BXR0

;跳转到R0指定的地址,

;并根据R0的最低位来切换处理器状态653.3ARM指令集简介3.3.5程序状态寄存器处理指令ARM微处理器支持程序状态寄存器访问指令,用于在程序状态寄存器和通用寄存器之间传送数据,程序状态寄存器访问指令包括MRS和MSR两条指令。1.MRS——程序状态寄存器到通用寄存器的数据传送指令2.MSR——通用寄存器到程序状态寄存器的数据传送指令在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可以了解到进入异常前的处理器状态。该指令不影响条件码。MRS{cond}Rd,psrMRS指令格式

应用示例:

MRSR1,CPSR;将CPSR状态寄存器读取,保存到R1中

MRSR2,SPSR_<mode>;将SPSR状态寄存器读取,保存到R2中3.3ARM指令集简介3.3.5程序状态寄存器处理指令1.MRS——程序状态寄存器到通用寄存器的数据传送指令66在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。3.3ARM指令集简介3.3.5程序状态寄存器处理指令2.MSR——通用寄存器到程序状态寄存器的数据传送指令67MSR{cond}psr_fields,#immed_8rMSR指令格式1MSR{cond}psr_fields,RmMSR指令格式2指令执行的条件码CPSR或SPSR指定传送的区域,可以为以下字母(必须小写)的一个或者组合:c控制域屏蔽字节(psr[7..0])x扩展域屏蔽字节(psr[15..8])s状态域屏蔽字节(psr[23..16])f标志域屏蔽字节(psr[31..24])保存要传送到状态寄存器指定域数据的源寄存器要传送到状态寄存器指定域的立即数3.3ARM指令集简介3.3.5程序状态寄存器处理指令2.MSR——通用寄存器到程序状态寄存器的数据传送指令68

(1)(2)(3)(4)

应用示例1:;子程序:使能IRQ中断ENABLE_IRQMRSR0,CPSRBICR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR3.3ARM指令集简介3.3.5程序状态寄存器处理指令691.将CPSR寄存器内容读出到R0;2.对R0寄存器的第7位清0,其对应于CPSR中的I控制位;3.将修改后的值写回CPSR寄存器的对应控制域,即CPSR中的I控制位为0,功能为:允许IRQ中断;4.返回上一层函数。

(1)(2)(3)(4)

应用示例2:;子程序:禁止IRQ中断DISABLE_IRQMRSR0,CPSRORRR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR

1.将CPSR寄存器内容读出到R0;2.对R0寄存器的第7位置1,其对应于CPSR中的I控制位;3.将修改后的值写回CPSR寄存器的对应控制域,即CPSR中的I控制位为1,功能为:禁止IRQ中断;4.返回上一层函数。3.3ARM指令集简介3.3.5程序状态寄存器处理指令70713.3ARM指令集简介3.3.6协处理器指令ARM协处理器指令分类包括数据操作、数据传送和寄存器传送三类,用于内部运算、数据交换及与ARM处理器间的数据传输,如CDP、LDC、STC、MCR、MRC等指令。723.3ARM指令集简介3.3.7ARM杂项指令中断指令SWI软件中断指令用于从用户模式切换到管理模式,处理中断并执行特定功能,常用于实现多级异常处理。断点中断指令BKPT断点中断指令常用于软件调试,当调试硬件存在时会被忽略,否则会引起预取异常。733.4Thumb指令集ARM与Thumb:性能与空间的权衡32位ARM指令集以执行效率为核心,功能完备,支持条件执行,适合性能关键代码。16位Thumb指令集ARM的压缩子集,代码体积节省约30%。核心优势:混合编程高性能+高密度两者共用寄存器资源,通过BX指令安全切换,实现空间与效率的最佳平衡。指令集差异:功能与格式的权衡Thumb为压缩空间,在指令功能和格式上进行了精简。ARM指令集条件执行:几乎所有指令都支持,减少分支,提升流水线效率。三地址格式:指令运算更灵活,支持两个独立源操作数。Thumb指令集无条件执行:仅跳转指令B支持条件执行,简化设计。二地址格式:目的寄存器兼任源寄存器,编码更紧凑。3.4Thumb指令集74被裁减的Thumb功能为实现16位编码,Thumb舍弃了部分高阶特性,需通过切换至ARM模式完成。协处理器指令信号量指令访问CPSR/SPSR乘加/64位乘法功能裁减第二操作数受限无状态访问指令部分运算指令缺失寻址模式简化Thumb专注于通用功能,高阶操作需借助完善的ARM指令集。3.4Thumb指令集75状态切换机制:BX/BLX与CODE伪指令ARMState(CODE32)指令格式:BX/BLX目标地址(目标地址最低位bit[0]为1)ThumbState(CODE16)3.4Thumb指令集76(目标地址最低位bit[0]为0)异常回归ARM安全与兼容的硬件保障确保功能完整性异常处理使用完整的32位指令集,可访问所有系统寄存器。简化系统开发操作系统与驱动开发者无需为异常处理编写两套代码。提升系统可靠性避免Thumb子程序因异常陷入无法处理的高级场景。自动切换(T=0)3.4Thumb指令集77关键取舍:三维平衡空间Thumb通过牺牲部分功能,换取16位编码密度,节省约30%存储。性能ARM保持全部硬件特性,承担性能关键任务与异常处理。功能BX指令与异常机制提供安全切换,保障系统功能完整与稳定。3.4Thumb指令集78793.4Thumb指令集存储器访问指令Thumb指令集的LDM和STM指令可以将任何范围为R0~R7的寄存器子集加载或存储。批量寄存器加载和存储指令只有LDMIA、STMIA指令,即每次传送先加载/存储数据,然后地址加4。对堆栈处理只能使用PUSH指令和POP指令。表3-5Thumb存储器访问指令803.4Thumb指令集数据处理指令Thumb数据处理指令如表3-6所示。大多数Thumb处理指令采用2地址格式,数据处理操作比ARM状态的更少,访问寄存器R8~R15受到一定限制。Thumb跳转指令有B、BL、BLX和BX这4条指令;注意:在Thumb状态下,BLX指令仅支持寄存器形式(如BLXRm),不支持立即数形式。Thumb杂项指令有SWI(软件中断指令)和BKPT(断点中断指令);Thumb伪指令有ADR、LDR和NOP。表3-6Thumb数据处理指令其他指令813.5Thumb-2技术Thumb-2是ARM架构的指令集扩展,首次于ARMv6T2版本中引入并在ARMv7版本中全面优化,旨在提升代码密度与执行效率的平衡。其核心设计为混合16/32位指令集,允许在单一操作模式下无缝执行不同长度的指令,彻底消除传统ARM/Thumb模式切换的开销。该技术广泛应用于嵌入式系统与移动设备,显著降低存储需求并提升性能。16位与32位混合指令架构823.5Thumb-2技术3.5.1Thumb-2指令集的组成指令集扩展Thumb-2指令集在传统16位Thumb指令基础上,新增了32位指令,使其能够执行更复杂的操作,如复杂的数据加载和存储、位操作等,提升了指令集的功能和灵活性。混合执行机制编译器根据代码逻辑静态选择16位或32位指令,处理器通过指令编码前缀自动识别,无需显式切换模式,实现了16位和32位指令的无缝切换,优化了代码执行效率。混合编码实践示例:MOVSR0,#0;16位:初始化累加和LDRR2,=0x12345678;32位:加载32位常数loop:CMPR1,#11;16位:比较BXR2;32位:函数指针跳转833.5Thumb-2技术3.5.2Thumb-2核心特性高密度与高性能兼得指令扩展新增32位指令,增强数据加载、内存访问、条件分支等复杂操作能力。混合指令集16位与32位指令可混编,处理器自动选择,灵活优化性能与密度。843.6其他扩展指令集NEON与FPU加速单元NEON高级SIMD用于加速多媒体和信号处理任务,通过128位向量并行计算,显著提速音视频编解码、图像处理等。单指令多数据流(SIMD)架构支持整数和单精度浮点向量运算高效处理并行数据流,如像素、音频采样浮点单元(FPU)提供高效的单双精度浮点运算能力,实现快速傅里叶变换、滤波与矩阵运算。符合IEEE754标准的浮点运算支持VFPv3指令集,包含丰富的浮点操作与主指令流无缝混编,上下文切换开销低这些扩展指令集进一步增强了Cortex-A9处理器在各种应用中的性能和功能。853.7ARM汇编程序设计

汇编语言,作为一种低级的编程语言,与机器语言指令直接对应,是计算机能够直接执行的指令集的符号化表达形式。本节内容将重点介绍GNU环境下的ARM伪指令集合。伪指令集合是为了辅助编译器而设计的,不同的编译器拥有各自的伪指令集合。例如,ARMC编译器具有其特定的伪指令集合,而GNU同样具备一套自己的伪指令集合。鉴于GNU的开源特性和其广泛的使用,本节将对GNU伪指令集合进行详细讲解。863.7ARM汇编程序设计3.7.1GNUARM汇编器的伪操作

所谓伪操作就是没有对应的机器码的指令,它是用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编程序如何进行。所有汇编伪操作的名称都是以“.”开始,余下的是字母,通常使用小写字母。符号定义伪操作数据定义伪操作汇编控制伪操作杂项伪操作873.7ARM汇编程序设计3.7.1GNUARM汇编器的伪操作1)全局标号定义伪操作.global和.globl

global用于声明一个ARM程序中的全局变量,使得被声明的符号对连接器(ld)可见,变为整个工程都可使用的全局变量。

以上两条伪操作用于定义全局变量,因此在整个程序范围内变量名必须唯一。(1)指令的语法格式.globalsymbol.globlsymbol(2)指令举例.global_start;定义了一个全局的符号_start1.符号定义伪操作883.7ARM汇编程序设计3.7.1GNUARM汇编器的伪操作2)局部标号定义伪操作.local

这个伪操作用于声明一个ARM程序中的局部变量,这样它对外部就是不可见的,作用域在本个文件内。

(1)指令的语法格式.localsymbol

(2)指令举例.localloop1.符号定义伪操作893.7ARM汇编程序设计3.7.1GNUARM汇编器的伪操作3)变量赋值伪操作.set

伪操作.set用于给一个全局变量或局部变量赋值。(1)指令的语法格式symbol.setexpr;为符号symbol赋值expr

(2)指令举例start.set0x40start.set0x50movr1,#start;寄存器r1的值为0x501.符号定义伪操作903.7ARM汇编程序设计3.7.1GNUARM汇编器的伪操作4)宏替换伪操作.equ

伪操作.equ用于给一个全局变量或局部变量赋值,类似于C语言中的宏定义。(1)指令的语法格式symbol.equexpr;为符号symbol赋值expr(2)指令举例start.equ0x40start.equ0x50movr1,#start;寄存器r1的值为0x501.符号定义伪操作913.7ARM汇编程序设计3.7.1GNUARM汇编器的伪操作

数据定义伪操作一般用于为特定的数据分配存储单元,同时对该内存单元中的数据进行初始化。常见的数据定义伪操作有.byte、short、word、long、quad、float、space、skip、string、asciz、ascii和.rept。2.数据定义伪操作923.7ARM汇编程序设计3.7.1GNUARM汇编器的伪操作2.数据定义伪操作1)byte.byte伪操作的功能是在存储器中分配1个字节的内存单元,用指定的数据对该存储单元进行初始化。

(1)指令的语法格式

label:.byteexprlabel:程序标号;expr可以是-128~255的数字,也可以是字符;(2)指令举例

a:.byte#1;类似于C语言中的chara=1933.7ARM汇编程序设计3.7.1GNUARM汇编器的伪操作2.数据定义伪操作2)short

.short伪操作的功能是在存储器中分配2字节的内存单元,并用指定的数据对该存储单元进行初始化。(1)指令的语法格式label:.shortexprlabel:程序标号;expr可以是-32768~65535的数字.

(2)指令举例a:.short0x1234;类似于C语言中的shorta=0x1234943.7ARM汇编程序设计3.7.1GNUARM汇编器的伪操作2.数据定义伪操作3)byte.byte伪操作的功能是在存储器中分配1个字节的内存单元,用指定的数据对该存储单元进行初始化。

(1)指令的语法格式

label:.byteexprlabel:程序标号;expr可以是-128~255的数字,也可以是字符;(2)指令举例

a:.byte#1;类似于C语言中的chara=1953.7ARM汇编程序设计3.7.1GNUARM汇编器的伪操作2.数据定义伪操作4)long

.long伪操作的功能是在存储器中分配4字节的内存单元,并用指定的数据对该存储单元进行初始化。(1)指令的语法格式label:.longexprlabel:程序标号;expr可以是-216~232-1的数字.(2)指令举例a:.long0x12345678;类似于C语言中的inta=0x12345678963.7ARM汇编程序设计3.7.1GNUARM汇编器的伪操作2.数据定义伪操作5)quad

温馨提示

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

评论

0/150

提交评论