SoC第三讲-ARM汇编指令与ARM编程_第1页
SoC第三讲-ARM汇编指令与ARM编程_第2页
SoC第三讲-ARM汇编指令与ARM编程_第3页
SoC第三讲-ARM汇编指令与ARM编程_第4页
SoC第三讲-ARM汇编指令与ARM编程_第5页
已阅读5页,还剩30页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

ARM指令与汇编指令

概述在我们开始之前...该模块是一个对ARM汇编编程总体介绍该模块不是可用指令的完整总结该模块涵盖了大部分的指令和汇编器操作欲了解更多信息,请参阅TheARMCompilertoolchain-AssemblerReferenceTheARMCompilertoolchain–UsingtheAssemblerAvailablefrom

TheARMArchitectureReferenceManualRequestformavailablefrom

为什么你需要知道汇编??对于大多数系统的设计来说一般集中在高级编程该指令集的知识不是必需的但是...嵌入式系统需要初始化代码和中断程序驱动程序编写要求最底层抽象程序的知识所有的系统都需要调试有时在指令级性能提升可以通过编写程序汇编此外,ARM架构的某些功能不能用高层次的语言表达ARM汇编文件语法

AREAarmex,CODE,READONLYENTRYabcEQU54 mainMOVr0,#10MOVr1,#abcADDr2,r0,r1 ;thisisacomment...DCD0xAB00321A ENDdefinesthestartofaread-onlyarea,called“armex”,containingcodelabelsstartsinthefirstcolumninstructionsmarksthesoftwareentrypointassignstheconstant‘54’tothesymbol‘abc’insertsa32-bitconstantintotheprogrammarkstheendofthesourcefile议程读取/存储指令

数据处理指令

流量控制指令

其他指令 DSP指令在一个或两个寄存器和存储器之间移动数据使用LDRD

STRD DoublewordLDR STR WordLDRB STRB ByteLDRH STRH HalfwordLDRSB Signedbyteload

LDRSH Signedhalfwordload

语法:LDR{<size>}{<cond>}Rd,<address>STR{<size>}{<cond>}Rd,<address>范例:LDRBr0,[r1]

;loadbottombyteofr0fromthe ;byteofmemoryataddressinr1单/双寄存器的数据传输Anyremainingspace

zerofilledorsignextendedMemoryRd310寻址内存由LDR/STR访问的地址由基寄存器指定一个可选偏移只有基址寄存器(非偏移)

LDRr0,[r1]Baseregisterplusconstant

LDRr0,[r1,#8]Baseregister,plusregister(optionallyshiftedbyanimmediatevalue)

LDRr0,[r1,r2]

LDRr0,[r1,r2,LSL#2]Theoffsetcanbeeitheraddedor

subtractedfromthebaseregister

LDRr0,[r1,#-8]

LDRr0,[r1,-r2]

LDRr0,[r1,-r2,LSL#2]+/-r1#8r0memoryaddressr2,LSL#2or预处理和后变址寻址后变址(在内存访问之后增加偏移)

LDRr0,[r1],#12前变址(在内存访问之前增加偏移)

LDRr0,[r1,#12]{!}+r1#12r0memoryaddressr1r0memoryaddress+r1#12r1如果目前是“!”,更新基址寄存器(r1)一直更新基址寄存器(r1)+r1#12r1这些指令移动多个寄存器和存储器之间的数据语法<LDM|STM>{<addressing_mode>}{<cond>}Rb{!},<registerlist>4寻址模式前/后增量前/后衰减同时PUSH/POP,相当于STMDB/LDMIA

与SP!

作为基址寄存器ExampleLDMr10,{r0,r1,r4} ;加载寄存器,使用R10基址PUSH{r4-r6,pc} ;储存寄存器,更新基址寄存器(r1)多个寄存器的数据传输(IA)r1增加地址r4r0r1r4r0r1r4r0r1r4r0r10IBDADB基址寄存器(Rb)议程

读取

/存储指令数据处理指令

流量控制指令

其他指令 DSP指令数据处理指令这些指令对寄存器值进行操作它们不会影响内存值语法:

<Operation>{S}{<cond>}{Rd,}Rn,Operand2范例:ADDr0,r1,r2

;r0=r1+r2 TEQr0,r1 ;ifr0=r1,ZflagwillbesetMOVr0,r1 ;copyr1tor0算法逻辑移动操作(有目标寄存器)ADDADCSUBSBCRSBRSCANDEORMOV对照(只设置标志)CMN(ADDS)CMP(SUBS)TST(ANDS)TEQ(EORS)ORRORNBICMVN这些也可以作为灵活的第二运算元...移动/循环操作registerCF0LSL

–逻辑左移乘以2的幂registerCFASR

-算术右移除以2的幂,

保留符号位registerCF...0LSR

–逻辑右移除以2的幂registerCFROR

–循环右移位循环从LSB再到MSBregisterRRX

-带扩展的循环右移单个位循环的从CF到MSBCF对于许多指令来说第二个运算元是灵活的可选移位的寄存器移值可以是5位无符号整数指定在另一个寄存器的底部字节(仅限ARM)可以被用于乘常数,例如ADDr0,r5,r5,LSL#1;r0=r5*3灵活的第二运算元也可以作为立即数8位数字,范围从0-255ARM–循环右移偶数个位置Thumb–左移任何数量Thumb也允许这种形式常数

0x00XY00XY,0xXY00XY00和

0xXYXYXYXY结果操作数

1Barrel

Shifter操作数

2ALU灵活的第二运算元范例:MLAr0,r1,r2,r3 ;r0=r3+(r1*r2)[U|S]MULLr4,r5,r2,r3 ;r5:r4=r2*r3除法:SDIVr0,r1,r2 ;signed:r0=r1/r2UDIVr0,r1,r2 ;unsigned:r0=r1/r2乘法/除法32-bit乘法64-bit乘法×RnRmRdHiRdLo+×RnRmRdRa+/-可选累积可选累积MULMLAMLSUMULLSMULLUMLALSMLAL位操作指令0310000000010101100010011100111010003100000000101011000001110100031000000000000000000000000010101103111000000000000000000000000000000BFIr0,r0,#9,#6;BitFieldInsertUBFXr1,r0,#18,#7;BitFieldExtractBFCr1,#3,#4 ;BitFieldClear0RBITr2,r1 ;ReverseBitOrder1101001010011101000Zeroextendr0r0r1r203100000000000000000000000000011000r1字节逆转V6andlater

REV r0,r0Pre-V6

EOR r1,r0,r0,ROR#16

BIC r1,r1,#0xFF0000

MOV r0,r0,ROR#8

EOR r0,r0,r1,LSR#8字节逆转指令REV{cond}Rd,Rm

逆转一个字的字节hebytesinawordREV16{cond}Rd,Rm

逆转每半个字的字节ReversesthebytesineachhalfwordREVSH{cond}Rd,Rm

逆转底部的两个字节,并将结果扩展到32位32010132REVr0,r0议程

读取

/存储指令

数据处理指令流量控制指令

其他指令 DSP指令分支指令分支指令的格式如下

B{<cond>}label可能不会导致管线溢出(分支预测)分支范围取决于指令集和宽度BL指令生成一个返回地址到r14(lr)返回是通过恢复从LR的程序计数器(PC)进行的

:BLfunc2::BXlrfunc1func2voidfunc1(void){

: func2(); :}交互工作交互通过使用分支交换指令进行

BXRnBLXRNBit0ofRn决定了交换行为Unset -更改为(或保持在)ARM状态Set -更改为(或保持在)Thumb

状态分支和链接交换用于分支到一个在相反指令集的子程序当转移到导入标签使用BL,链接器将在必要时代替BLXoffset

;ARM/Thumb指令将总是改变状态(并设置LR)所有改变PC的指令都会导致状态改变根据结果的0位改变对于数据处理指令,状态只有在S变体不用时改变0时比较和分支跟随一个分支取代但不改变条件码标志语法

CB{N}Z<Rn>,<label>CBZ -如果Rn等于0,分支到labelCBNZ -如果Rn不等于0,分支到label

只能向前分支到4和130字节之间

.CMPr0,#0BEQexit. exit

.CBZr0,exit.. exit参考:条件代码和标志可能的条件码列在下面注意AL是默认值,并不需要指定NotequalUnsignedhigherorsameUnsignedlowerMinusEqualOverflowNooverflowUnsignedhigherUnsignedlowerorsamePositiveorZeroLessthanGreaterthanLessthanorequalAlwaysGreaterorequalEQNECS/HSCC/LOPLVSHILSGELTGTLEALMIVCSuffixDescriptionZ=0C=1C=0Z=1FlagstestedN=1N=0V=1V=0C=1&Z=0C=0orZ=1N=VN!=VZ=0&N=VZ=1orN=!VStatusFlagMeaningNNegativeZZeroCCarryVOverflow默认情况下,数据处理指令不影响条件标志,但是这可以通过将一个“S”放置在指令和任何条件码之间实现参考资料ARMCompilertoolchain–AssemblerReferenceARMCompilertoolchain–UsingtheAssembler可获得于

包含所有到v6架构的可用指令ARMArchitectureReferenceManualARMDDI0406C包含v7-A和v7-R要求形式可获得与

QuickReferenceCard–QRC0001L可获得于

If-then只有Thumb使接下来的1-4个指令有语法

IT{T|E}{T|E}{T|E}<cond>可以使用任何条件码不影响条件标记IT块16位的指令不影响条件标记(除了

CMP,CMN&TST)32位指令影响条件标记32-bitinstructionsdoaffectconditionflags(正常规则)没有必要写这个指令:汇编器会将它插入你需要的地方当前“if-then状态”存储在CPSR条件块可以安全地中断并返回到不推荐分支进入到‘if-then’块;if(r0==0)

;r0=*r1+2;

;else

;r0=*r2+4;

;if

CMPr0,#0

ITTEEEQ;then

LDREQr0,[r1]

ADDEQr0,#2;else

LDRNEr0,[r2]

ADDNEr0,#4范例:条件执行if(r0==0){r1=r1+1;}else{r2=r2+1;}伪代码CMPr0,#0

ITNEBNEelseADDr1,r1,#1BendelseADDr2,r2,#1end

...汇编指令低效分支CMPr0,#0

ITEEQADDEQr1,r1,#1ADDNEr2,r2,#1...无分支管理访问(SVC)语法SVC{<cond>}<SVCnumber>导致SVC异常SVC处理程序可以检查SVC数字决定什么已请求的操作但是核心可以巫师SVC数字通过使用SVC机制,操作系统可以实现一组特权操作,应用程序在用户模式下也运行可以请求这些特权操作异常处理模块有更多细节议程

读取

/存储指令

数据处理指令

流量控制指令其他指令 DSP指令协处理器指令每个协处理器的指令占用ARM指令集的一个固定部分如果适当的协处理器不存在在系统中,便会发生一个例外未定义指令

有三种类型的协处理器指令数据处理CDP

-发起协处理器数据处理操作缓存器转移MRC -从协处理器寄存器转移到ARM寄存器MCR -从ARM寄存器转移到协处理器寄存器内存转移LDC -从内存中加载协处理器寄存器STC -从协处理器寄存器存储到内存多个寄存器以及这些指令的其他变异也可PSR访问MRS和MSR允许SPSR/CPSR的内容转移进/出到一个通用寄存器或取用一个立即值MSR允许整个状态寄存器,或它的一部分,被更新MRSr0,CPSR ;readCPSRintor0BICr0,r0,#0x80 ;clearbit7toenableIRQMSRCPSR_c,r0 ;writemodifiedvalueto‘c’byteonlyCPS可用于直接修改CPSR中的一些字节包括在异常处理模块SETEND

指令选择数据访问的字节序(BE8orLE)使用在混合字节序数据的系统中(e.g.peripherals)SETENDBE

LDRr0,[r7],#4;big-endian

SETENDLE

LDRr1,[r7],#4;little-endian

其它指令断点指令-

BKPT<bkptnumber>立即值被处理器忽略该指令的执行导致预取中止或导致处理器进入调试状态(依赖于核心设计和配置)通过调试代理使用等待中断-

WFI

将内核进入待机模式通过中断或调试事件唤醒作为CP15操作之前执行空操作-NOP

可以作为填充对准下面指令可能会或可能不会花时间来执行等候事件(WFE)&发送事件(SEV)包括在一个单独的模块议程

读取

/存储指令

数据处理指令

流量控制指令

其他指令DSP指令DSP指令概述这些DSP指令都是单指令多数据(SIMD)它们将8位或者16位数据封装为字它们允许对包装结构类型更有效的访问指令组数据打包/解包数据处理饱和数学加法/减法乘法绝对差分和饱和数学和CLZ对于饱和数学支持以DSP和控制应用为目标溢出设置Q标志(粘连)而不是V,并设置结果到+/-最大值

QSUB{cond}Rd,Rm,Rn ;Rd=saturate(Rm-Rn) QADD{cond}Rd,Rm,Rn

;Rd=saturate(Rm+Rn) QDSUB{cond}Rd,Rm,Rn

;Rd=saturate(Rm-saturate(Rn

2)) QDADD{cond}Rd,Rm,Rn

;Rd=saturate(Rm+saturate(Rn

2))前导零计数CLZ{cond}Rd,Rm返回最显著设置位之前未设置的位数0x00x7FFFFFFF0x80000000-ve+ve031000000000010110

温馨提示

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

评论

0/150

提交评论