《四ARM指令集ppt课件.ppt》由会员分享,可在线阅读,更多相关《四ARM指令集ppt课件.ppt(106页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1四ARM指令集ppt课件 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望2指令长度l指令集可以是以下任一种指令集可以是以下任一种l32 bits 32 bits 长长 (ARM(ARM状态状态)l16 bits 16 bits 长长 (Thumb(Thumb 状态状态)lARM7TDMI ARM7TDMI 支持支持3 3种数据类型种数据类型l字节字节 (8-bit)(8-bit)l半字半字(16-bit)(16-bit)l字字(32-bit)(32-bit)l字
2、必须被排成字必须被排成4 4个字节边界对齐个字节边界对齐,半字必须被排列成半字必须被排列成2 2个字节边界对个字节边界对齐齐 3ARM 指令集的特点l向后兼容:新版本增加指令,并保持指令向后兼容;向后兼容:新版本增加指令,并保持指令向后兼容;lLoad-store Load-store 结构结构*uload/store load/store 从存储器中读某个值从存储器中读某个值,操作完后再将其放回存储操作完后再将其放回存储器中器中u只对存放在寄存器的数据进行处理;只对存放在寄存器的数据进行处理;u对于存储器中的数据,只能使用对于存储器中的数据,只能使用load/storeload/store指
3、令进行存取指令进行存取4指令格式l指令格式指令格式u3 3 地址指令格式地址指令格式 在在ARMARM状态中使用状态中使用u例例指令语法目标寄存器(Rd)源寄存器1(Rn)源寄存器2(Rm)ADD r3,r1,r2r3r1r25ARM 指令分类l数据处理指令数据处理指令 使用和改变寄存器的值使用和改变寄存器的值l数据传送指令数据传送指令 把存储器的值拷贝到寄存器中把存储器的值拷贝到寄存器中 (load)or(load)or 把寄存器中的值拷贝到存储器中把寄存器中的值拷贝到存储器中(store)(store)l控制流指令控制流指令 分支分支分支和链接分支和链接,保存返回的地址保存返回的地址,以恢
4、复最先的次序以恢复最先的次序l软件中断指令软件中断指令l程序状态寄存器指令程序状态寄存器指令l协处理器指令协处理器指令6ARM指令编码格式l说明说明lCondl指令执行的条件编码指令执行的条件编码lOpcodel指令操作符编码指令操作符编码lSl决定指令的操作是否影响决定指令的操作是否影响CPSR的值的值lRdl操作目标寄存器编码操作目标寄存器编码lRnl包含第一操作数的寄存器编码包含第一操作数的寄存器编码lShifter_operandl表示第二操作数表示第二操作数cond001opcodesRnRdShifter_operand 31 28 27 25 24 21 20 19 16 15
5、12 11 8 7 07ARM指令集8数据处理指令-1l数据处理指令的类别数据处理指令的类别u算术操作算术操作u按位逻辑操作按位逻辑操作u寄存器移位操作寄存器移位操作u比较操作比较操作l操作数操作数:32-bits:32-bits 宽宽;有有3 3种指定操作数的方式种指定操作数的方式u来自寄存器来自寄存器u第二操作数可以是常数第二操作数可以是常数(立即数立即数)u移位寄存器操作数移位寄存器操作数l结果结果:32-bits:32-bits 宽宽,放在寄存器中放在寄存器中u长乘法产生长乘法产生6464位结果位结果9数据处理指令 2*cond0 0operand 2#opcodeSRnRd3128
6、27 26 25 2421 20 1916 1512 110目的寄存器第一操作寄存器设置操作码算术/逻辑功能8-bit 立即数125118 70#rotRm11765 430#shiftRm025118 765 430RsSh010Shimmediate alignmentimmediate shift lengthshift typesecond operand register移位寄存器长度10数据处理指令-311数据处理指令-4ADD r0,r1,r2r0:=r1+r2ADC r0,r1,r2r0:=r1+r2+CSUB r0,r1,r2r0:=r1-r2SBC r0,r1,r2r0:=
7、r1-r2+C-1RSB r0,r1,r2r0:=r2 r1RSC r0,r1,r2r0:=r2 r1+C-1算术操作算术操作按位逻辑操作按位逻辑操作AND r0,r1,r2r0:=r1 and r2ORR r0,r1,r2r0:=r1 or r2EOR r0,r1,r2r0:=r1 xor r2BIC r0,r1,r2r0:=r1 and(not)r2寄存器移位寄存器移位MOV r0,r2r0:=r2MVN r0,r2r0:=not r2比较操作比较操作CMP r1,r2set cc on r1-r2CMN r1,r2set cc on r1+r2TST r1,r2set cc on r1
8、and r2TEQ r1,r2set cc on r1 xor r212数据处理指令-MOVlMOV指令是把一个数指令是把一个数N送到目标寄存器中,送到目标寄存器中,N可以是寄存器,也可以是寄存器,也可以是立即数。可以是立即数。lMOV指令语法:指令语法:指令指令cond S Rd,N例:例:PRE r0=5,r2=6 MOV r0,r2 POST r0=6 ,r2=6MOV r0,r2r0:=r2MVN r0,r2r0:=not r213桶形移位器ALU桶形移位器Rd结果N预处理未预处理RmRn14桶形移位器的使用lPRE r0=8,r2=5lMOV r0,r2,LSL#2(逻辑左移两位:(
9、逻辑左移两位:r20)x=1;CMP r0,#0MOVEQ r1,#0MOVGT r1,#1l使用条件比较指令使用条件比较指令if(a=4|a=10)x=0;CMP r0,#4CMPNE r0,#10MOVEQ r1,#023条件执行l所有的所有的ARM指令都可以指令都可以条条件件执行行l指令的指令的执行行与与否取否取决决于于CPSR寄存器的寄存器的N,Z,C and V标标志位志位l所有的所有的Thumb指令都可以解指令都可以解压压成全部成全部条条件指令件指令lCondition Field in instructionl0000=EQ-Z set(equal)l0001=NE-Z clea
10、r(not equal)l0010=CS-C set(unsigned higher or same)l0011=CC-C clear(unsigned lower)l0100=MI-N set(negative)l0101=PL-N clear(positive or zero)l0110=VS-V set(overflow)l0111=VC-V clear(no overflow)l1000=HI-C set and Z clear(unsigned higher)l1001=LS-C clear or Z set(unsigned lower or same)l1010=GE-N set
11、 and V set,or N clear and V clear(greater or equal)l1011=LT-N set and V clear,or N clear and V set(less than)l1100=GT-Z clear,and either N set and V set,or N clear and V clear(greater than)l1101=LE-Z set,or N set and V clear,or N clear and V set(less than or equal)l1110=AL-alwaysl1111=NV-never24乘法指令
12、集l在寄存器在寄存器产生生32位位值25乘法l例子例子 (乘法乘法,乘法累加器乘法累加器)l注意注意u最低最低 32-bits 32-bits 置于结果寄存器中置于结果寄存器中,其余被忽略其余被忽略 u不支持第二立即操作数不支持第二立即操作数u结果寄存器与源寄存器必须不同结果寄存器与源寄存器必须不同 uif S bit is set the V is preserved and if S bit is set the V is preserved and the C is rendered meaninglessthe C is rendered meaninglessMUL r4,r3,r2
13、r4:=r3 x r2MLA r4,r3,r2,r1r4:=r3 x r2 +r1 26数据传送指令-1l单指令传送单指令传送 (LDR,STR)(LDR,STR)u单字单字(32bit),(32bit),半字半字(6 bit)(6 bit)以及字节以及字节(8 bit)(8 bit)传送传送u寻址寻址u寄存器偏移寄存器偏移u地址地址 =基址基址 寄存器偏移寄存器偏移u立即数偏移立即数偏移u地址地址=基址基址 立即数常数立即数常数u后变址后变址Post-indexing:modify address after usePost-indexing:modify address after use
14、u前变址前变址Pre-indexing:modify address before usePre-indexing:modify address before useu回写回写u如果可能如果可能,更新基址寄存器更新基址寄存器27单寄存器传送指令LDR把一个字装入一个寄存器Rdmem32addressSTR从一个寄存器保存一个字或者一个字节Rdmem32addressLDRB把一个字节装入一个寄存器Rdmem8addressSTRB从一个寄存器保存一个字节Rdmem8addressLDRH把一个半字节装入一个寄存器Rdmem16addressSTRH从一个寄存器保存一个半字Rdmem16addr
15、essLDRSB把一个有符号字节装入寄存器RdsignExtent(mem8address)STRSH把一个有符号半字装入寄存器RdsignExtent(mem16address)28寻址方式变址模式数据基址寄存器示例回写前变址membase+offset基址寄存器加上偏移LDR r0,r1,#4!前变址membase+offset不变LDR r0,r1,#4后变址membase基址寄存器加上偏移LDR r0,r1,#429例子lPRE r0=0 x00000000,r1=0 x00009000,Mem320 x00009000=0 x01010101 Mem320 x00009004=0 x
16、02020202回写型前变址寻址:回写型前变址寻址:LDR r0,r1,#0 x4!lPOST r0=0 x02020202,r1=0 x00009004前变址寻址:前变址寻址:LDR r0,r1,#0 x4 lPOST r0=0 x02020202,r1=0 x00009000后变址寻址:后变址寻址:LDR r0,r1,#0 x4lPOST r0=0 x01010101,r1=0 x0000900430数据传送指令-5COPY:ADR r1,TABLE1;r1 points to TABLE1ADR r2,TABLE2;r2 points to TABLE2LOOP:LDR r0,r1STR
17、 r0,r2ADD r1,r1,#4ADD r2,r2,#4.TABLE1:.TABLE2:.COPY:ADR r1,TABLE1;r1 points to TABLE1ADR r2,TABLE2;r2 points to TABLE2LOOP:LDR r0,r1,#4STR r0,r2,#4.TABLE1:.TABLE2:.31多寄存器数据传送指令-LDMl多数据传送指令多数据传送指令 (LDM,STM)(LDM,STM)uload(LDM)load(LDM)或或 store(STM)store(STM)当前可访问寄存器的任意子集当前可访问寄存器的任意子集u 使用使用u堆栈堆栈:mainta
18、ining full or empty stacks which can:maintaining full or empty stacks which can grow up or down memorygrow up or down memoryu上下文切换上下文切换:保存或重新存储工作寄存器保存或重新存储工作寄存器u块拷贝块拷贝:在主存储器中移动大数据块在主存储器中移动大数据块u寻址寻址uPre/Post indexingPre/Post indexinguAuto increment or decrementAuto increment or decrementu回写到基址寄存器回写到基
19、址寄存器Write back the base registerWrite back the base register32多寄存器数据传送指令的要点l多寄存器多寄存器Load/Store指令会增加中断的延迟,因为指令会增加中断的延迟,因为ARM不会打断不会打断正在执行的指令去响应中断,而必须等到指令执行完成;正在执行的指令去响应中断,而必须等到指令执行完成;l一般编译器将提供一个选项以控制一般编译器将提供一个选项以控制Load/Store指令可以传送的最指令可以传送的最大寄存器数目,以限制最大中断延迟。大寄存器数目,以限制最大中断延迟。33多寄存器传送指令的寻址模式寻址模式描述起始地址结束地
20、址Rn!IA执行后增加RnRn+4*N-4Rn+4*NIB执行前增加Rn+4Rn+4*NRn+4*NDA执行后减少Rn-4*N+4RnRn-4*NDB执行前减少Rn-4*NRn-4Rn-4*N注:!决定Rn的值是否随着传送而改变34例子要求:保存要求:保存r1r3到内存地址到内存地址0 x90000 x900c,并且更新基,并且更新基址寄存器址寄存器r4PRE:r1=0 x00000001,r2=0 x00000002,r3=0 x00000003,r4=0 x9000执行操作:执行操作:STMIA r4!,r1,r2,r3(执行后增加执行后增加)POST:mem320 x9000=0 x00
21、000001 mem320 x9004=0 x00000002 mem320 x9008=0 x00000003 r4=0 x900c35多寄存器传送寻址模式r5r1r9r0r9STMIA r9!,r0,r1,r5100016100c16101816r1r5r9STMDA r9!,r0,r1,r5r0r9100016100c16101816r5r9STMDB r9!,r0,r1,r5r1r0r9100016100c16101816r5r1r0r9r9STMIB r9!,r0,r1,r5100016100c1610181636例1:将存储器中的连续数据装载到寄存器lPRE mem320 x800
22、18=0 x03,mem320 x80014=0 x02,mem320 x80010=0 x01,r0=0 x00080010,r1=0 x00000000,r2=0 x00000000,r3=0 x00000000执行指令:执行指令:LDMIA r0!,r1-r3lPOST r0=0 x0008001c,r1=0 x00000001,r2=0 x00000002,r3=0 x000000030 x800200 x000000050 x8001c0 x000000040 x800180 x000000030 x800140 x000000020 x800100 x000000010 x8000
23、c0 x00000000地址指针 存储地址 数据r3=0 x00000000r2=0 x00000000r1=0 x00000000r0=0 x8001037例2:完成一个存储器数据块拷贝l注:注:r9存放源数据的起始地址存放源数据的起始地址 r10存放目标起始地址存放目标起始地址 r11存放源结束地址存放源结束地址 loop LDMIA r9!,r0-r7 ;装载装载32字节并更新字节并更新r9指针指针 STMIA r10!,r0-r7 ;存储存储32字节并更新字节并更新r10指针指针 CMP r9,r11 ;是否到达结束地址是否到达结束地址 BNE loop ;不相等跳转不相等跳转目的目的
24、源源高地址低地址拷贝存储地址r9r11r1038堆栈操作lARM使用多寄存器使用多寄存器Load/Store指令来完成堆栈操作;指令来完成堆栈操作;l使用堆栈时,需要确定堆栈在存储空间中是向上生长使用堆栈时,需要确定堆栈在存储空间中是向上生长(递增的(递增的“A”)还是向下生长(递减的)还是向下生长(递减的“D”););l满堆栈(满堆栈(“F”)是指堆栈指针指向堆栈的最后一个已)是指堆栈指针指向堆栈的最后一个已使用的地址或满位置;相反,空堆栈(使用的地址或满位置;相反,空堆栈(“E”)是指)是指SP指向堆栈的第一个没有使用的地址或空位置;指向堆栈的第一个没有使用的地址或空位置;39堆栈操作寻址
25、方式寻址方式说明pop=LDMpush=STMFA递增满LDMFALDMDASTMFASTMIBFD递减满LDMFDLDMIASTMFDSTMDBEA递增空LDMEALDMDBSTMEASTMIAED递减空LDMEDLDMIBSTMEDSTMDA40LDMFD sp!,r4-r7,pcSP100FF1234AOBE80341010123484209753r41r5 14544r60r712lr9048pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034堆栈r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1
26、010123484209753存储器顶存储器顶SPSP100FF1234A0BE8034SPOld SP100FF1234A0BE8034lARM堆栈操作通过块传送指令来完成堆栈操作通过块传送指令来完成:STMFD(Push)块存储块存储-Full Descending stack STMDBLDMFD(Pop)块装载块装载-Full Descending stack LDMIASTMFD sp!,r4-r7,lr41例:把寄存器内容放入堆栈,更新sp0 x800180 x000000010 x800140 x000000020 x80010Empty0 x8000cEmpty0 x80018
27、0 x000000010 x800140 x000000020 x800100 x000000030 x8000c0 x00000002PRE 地址 数据POST 地址 数据SPSPPRE:r1=0 x00000002,r4=0 x00000003,sp=0 x00080014执行指令:执行指令:STMFD sp!,r1,r4POST:r1=0 x00000002,r4=0 x00000003,sp=0 x0008000c42单数据交换指令-SWAPl单数据交换单数据交换 (SWAP)(SWAP)u在寄存器和外部存储器之间交换字节或字在寄存器和外部存储器之间交换字节或字u读存储器和写存储器是是
28、放在一起的读存储器和写存储器是是放在一起的u原子指令原子指令u执行时不能中断执行时不能中断u当当LOCKLOCK 信号输出操作时信号输出操作时,外部存储器管理单元被锁定外部存储器管理单元被锁定,当当u多线程操作时使程序同步多线程操作时使程序同步(OS(OS支持支持)u锁定锁定u信号量信号量43l在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。一个字节或字的交换。l语法:语法:l SWPB Rd,Rm,Rnl可用作信号量可用作信号量l不能由不能由armcc编译产生,必须使用汇编器。编译
29、产生,必须使用汇编器。RmRd321temp存储器存储器RnSWP44SWAP指令的用法lPRE mem320 x9000=0 x12345678,r0=0 x00000000,r1=0 x11112222,r2=0 x00009000执行操作:执行操作:SWP r0,r1,r2lPOST:mem320 x9000=0 x11112222,r0=0 x12345678,r1=0 x11112222,r2=0 x00009000l交换指令多用于实现操作系统中的信号量和互斥操作,该指令有交换指令多用于实现操作系统中的信号量和互斥操作,该指令有修饰符修饰符B,即有字交换和字节交换两种形式;,即有字交
30、换和字节交换两种形式;45SWP指令应用示例SpinSpin MOV r1,=semaphore MOV r1,=semaphore MOV r2,#1 MOV r2,#1 SWP r3,r2,r1 SWP r3,r2,r1 CMP r3,#1 CMP r3,#1 BEQ spin BEQ spin注:信号量指向的单元是注:信号量指向的单元是0 0或或1 1,如果为,如果为1 1,则表示该服务被另一个过,则表示该服务被另一个过程使用,程序继续循环,直至为程使用,程序继续循环,直至为0 046软件中断(SWI)l产生一个异常陷阱,跳转到产生一个异常陷阱,跳转到SWI 硬件向量。硬件向量。lSWI
31、 处理程序可以检测处理程序可以检测SWI号,从而决定采取何种操作。号,从而决定采取何种操作。l通过通过SWI机制,运行在用户模式下的机制,运行在用户模式下的应用程序,可请求应用程序,可请求操作系统操作系统执行一系列执行一系列特权特权操作。操作。l语法:语法:l SWI 47软件中断(SWI)执行的操作指令名称执行操作SWI软件中断Lr_svc=SWI指令后面的指令地址spsr_svc=cpsrpc=vectors+0 x8cpsr模式=SVCcpsr I=1(屏蔽IRQ中断)48SWI中断处理程序l处理软件中断的代码段称为中断处理程序(处理软件中断的代码段称为中断处理程序(SWI Handle
32、r),中断处中断处理程序是通过执行指令的地址获取软件中断号,指令地址是从理程序是通过执行指令的地址获取软件中断号,指令地址是从lr计计算出来的;算出来的;lSWI号的确定方法:号的确定方法:SWI_Number=and NOT(0 xff00000000)283124270 Cond 1 1 1 1SWI number(ignored by processor)23条件域条件域49SWI处理程序应用示例lSWI_handler ;保存寄存器保存寄存器r0r12和和lr STMFD sp!,r0-r12,lr ;read the SWI instruction LDR r10,lr,#-4 ;m
33、ake off top 8 bits BIC r10,r10,#0 xff000000 ;r10-contains the SWI number BL service_routine ;return from SWI handler LDMFD sp!,r0-r12,pc50控制和分支指令l控制指令控制指令u分支和分支连接分支和分支连接u跳到希望的指令中跳到希望的指令中u保存当前的保存当前的PCPC并返回并返回(with (with L L bit)bit)u分支和交换分支和交换u跳到期望的指令中与指令集交换跳到期望的指令中与指令集交换uRm0=1:Subsequent inst.are TH
34、UMB.Rm0=1:Subsequent inst.are THUMB.uRm0=0:Subsequent inst.are ARM.Rm0=0:Subsequent inst.are ARM.condRm0 0 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 03128276 5 4 301L51lBranch:B labellBranch with Link:BL subroutine_labell处理器把偏移量左移两位,进行符号扩展后再与处理器把偏移量左移两位,进行符号扩展后再与PC相加相加 l跳转范围:跳转范围:32 Mbyte?l如何执行长跳转?28312
35、40 Cond 1 0 1 L 偏移量偏移量 条件码区域条件码区域Link bit0=Branch1=Branch with link232527分支指令52控制流指令53分支和链接指令l分支子程序分支子程序 (r14 serves as a link register)(r14 serves as a link register)l嵌套子程序嵌套子程序BL SUBR;branch to SUBR.;return hereSUBR:.;SUBR entry pointMOV pc,r14;returnBL SUB1.SUB1:;save work and link registerSTMFD
36、r13!,r0-r2,r14 BL SUB2.LDMFD r13!,r0-r2,pcSUB2:.MOV pc,r14;copy r14 into r15Full Descending56程序状态寄存器访问指令l程序状态寄存器访问指令程序状态寄存器访问指令(MRS,MSR)(MRS,MSR)lMRS MRS 程序状态寄存器到通用寄存器的数据传送指令程序状态寄存器到通用寄存器的数据传送指令lMSR MSR 通用寄存器到程序状态寄存器的数据传送指令通用寄存器到程序状态寄存器的数据传送指令57PSR 传送指令lMRS和和MSR允许传送允许传送CPSR/SPSR中的内容到中的内容到/从一个通用寄存器中。
37、从一个通用寄存器中。l语法:语法:l MRS Rd,;Rd=l MSR,Rm;=Rm在这里:在这里:l=CPSR or SPSRl_fields=fsxc的任意组合l也允许送一个立即数到也允许送一个立即数到 psr_fieldsl MSR,#Immediatel用户模式下,所有位均可以被读取,但只有条件标志位用户模式下,所有位均可以被读取,但只有条件标志位(_)可被写。可被写。2731N Z C V Q2867I F T mode1623 815 54024fsxc U n d e f i n e dJ58协处理器指令-1l协处理器协处理器l一般原理是通过增加核扩展指令集一般原理是通过增加核扩
38、展指令集lExample:Example:如如 MMU&cache.FPUMMU&cache.FPU等系统控制器等系统控制器l寄存器寄存器l协处理器专用协处理器专用lARM ARM 控制数据流控制数据流l协处理器只包含数据处理和存贮器传送操作协处理器只包含数据处理和存贮器传送操作l协处理器数据操作协处理器数据操作 (CDP)(CDP)l这类指令是用来告诉协处理器执行某些内部操作这类指令是用来告诉协处理器执行某些内部操作l无结果返回无结果返回ARM,ARMARM,ARM并不等待操作完成并不等待操作完成59协处理器指令lARM体系支持体系支持16个协处理器个协处理器l针对每个协处理器的指令占用针对
39、每个协处理器的指令占用 ARM指令集中的固定部分指令集中的固定部分 l如果相应的协处理器不存在,如果相应的协处理器不存在,将发生一个未定义指令异常。将发生一个未定义指令异常。l这有三种协处理器指令这有三种协处理器指令l协处理器数据处理指令协处理器数据处理指令l CDP:初始化协处理器数据处理操作:初始化协处理器数据处理操作l协处理器寄存器传送指令协处理器寄存器传送指令l MRC:从从 ARM 寄存器移到协处理器寄存器寄存器移到协处理器寄存器l MCR:从协处理器寄存器移到:从协处理器寄存器移到ARM 寄存器寄存器l协协处理器存储器传送指令处理器存储器传送指令l LDC:从存储器装载到协处理器寄
40、存器:从存储器装载到协处理器寄存器l STC:从协处理器寄存器存储到存储器:从协处理器寄存器存储到存储器60常量的装载lARM指令不用于将一个指令不用于将一个32位的常量装入寄存器,因为位的常量装入寄存器,因为ARM本身是本身是32位的,所以指令中不可能再定义一个普通的位的,所以指令中不可能再定义一个普通的32位常量;位常量;lARM增加了增加了2条伪指令,把条伪指令,把32位常量送入寄存器:位常量送入寄存器:l例:例:LDR Rd,=constant ;LDR常量装载伪指令常量装载伪指令 ADR Rd,Label ;ADR地址装载伪指令地址装载伪指令61l为允许装载大常数,汇编器提供了一条伪
41、指令为允许装载大常数,汇编器提供了一条伪指令:lLDR rd,=constl它可能汇编成下列指令:它可能汇编成下列指令:lMOV or MVN。或或lLDR 指令,从数据池(指令,从数据池(Literal pools)读取常数。)读取常数。lFor examplelLDR r0,=0 xFF=MOV r0,#0 xFFlLDR r0,=0 x55555555=LDR r0,PC,#Imm12DCD 0 x55555555l推荐使用这种方法把常数装入寄存器推荐使用这种方法把常数装入寄存器。装载32 bit常数62015310ADDS r2,r2,#1ADD r2,#132-bit ARM 指令1
42、6-bit Thumb 指令对于由编译器产生的大部分指令:对于由编译器产生的大部分指令:n没有条件执行n源、目的寄存器必须相同n仅能使用低寄存器n常数大小有限制n不能使用在线移位器关于Thumb指令集lThumb 是是16-bit 指令集指令集l代码密度优化代码密度优化(总代码大小约为(总代码大小约为ARM指令的指令的65%)l使用窄总线存储器时可以大大提高性能。使用窄总线存储器时可以大大提高性能。l是是 ARM 指令集的一个子集。指令集的一个子集。l核存在一个执行状态核存在一个执行状态 Thumb状态状态lARM和和Thumb之间切换使用之间切换使用BX 指令指令63写 Thumb汇编程序l
43、Thumb不是一个不是一个“好好”指令集!指令集!l最好用编译器来产生最好用编译器来产生l约束并不一致约束并不一致l手动编码使用手动编码使用ARM指令集比较好指令集比较好 l更多细节,参看:更多细节,参看:lARM“Architecture Reference Manual”64ADS与与ARM汇编程序设计汇编程序设计65生成二进制文件的过程66编译器的基本功能l规定汇编语言的语法规则规定汇编语言的语法规则lADS Vs.GNUl预编译预编译(Pre-assembler)标准标准汇编语言汇编语言l编译编译二进制文件二进制文件67预编译(Pre-assembler)l处理伪指令处理伪指令(Pse
44、udo-Instruction)l伪指令:做为汇编语言的参数,或被预编译器识别,翻译成标准伪指令:做为汇编语言的参数,或被预编译器识别,翻译成标准汇编语言。汇编语言。l伪指令的功能:伪指令的功能:l提高程序的可读性和易维护性提高程序的可读性和易维护性l易于编程易于编程68链接器(Linker)l将多个目标文件链接成一个可执行的文件将多个目标文件链接成一个可执行的文件l编译器只负责把程序翻译成机器码,但处理与存储器地址相关的编译器只负责把程序翻译成机器码,但处理与存储器地址相关的内容,这部分工作由链接器来完成;内容,这部分工作由链接器来完成;l一个程序编译完成后会分成代码段(一个程序编译完成后会
45、分成代码段(Read-Only,RO)、数据段、数据段(Read-Write,RW)、零初始化段(、零初始化段(Zero-Initialized,ZI),需要把,需要把不同的程序的不同区段链接成一个完整连续的区。不同的程序的不同区段链接成一个完整连续的区。69符号定义伪指令数据定义伪指令汇编控制伪指令信息报告伪指令宏指令以及其他伪指令。伪指令70符号定义伪指令l用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等。用于定义局部变量的LCLA、LCLL、LCLS;用于定义全局变量的GBLA、GBLL、GBLS;用于对变量赋值的SETA、SETL、SETS;为通用寄存器列表定义名称的R
46、LIST。71符号定义伪指令 1.LCLA、LCLL、LCLSl格式:LCLA/LCLL/LCLS局部变量名l说明:LCLA、LCLL、LCLS伪指令用于定义一个汇编程序中的局部变量,并初始化,其中:LCLA定义一个局部的数字变量,初始化为0;LCLL定义一个局部的逻辑变量,初始化为F;LCLS定义一个局部的字符串变量,初始化为空串;这三条伪指令用于声明局部变量,在其局部作用范围内变量名必须唯一。72符号定义伪指令 2.GBLA、GBLL、GBLSl格式:GBLA/GBLL/GBLS 变量名l说明:GBLA、GBLL、GBLS伪操作定义一个汇编程序中的全局变量,并初始化,其中:GBLA定义一个
47、全局数字变量,并初始化为0;GBLL定义一个全局逻辑变量,并初始化为“F”;GBLS定义一个全局字符串变量,并初始化为空串;这三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。73符号定义伪指令 3.SETA、SETL、SETSl格式:变量名SETA/SETL/SETS表达式l说明:SETA:给一个数字变量赋值;SETL:给一个逻辑变量赋值;SETS:给一个字符串变量赋值;格式中的变量名必须为已经定义过的全局或局部变量,表达式为将要赋给变量的值。74 符号定义伪指令4.RLISTl格式:名称 RLIST寄存器列表l说明:RLIST可用于对一个通用寄存器列表定义名称,该名称可在AR
48、M指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器为根据寄存器的编号由低到高访问次序,与列表中的寄存器排列次序无关。75 数据定义伪指令l用于为数据分配存储单元,同时也可完成已分配存储单元的初始化。DCBDCW/DCWUDCD/DCDU DCQ/DCQU DCFS/DCFSU DCFD/DCFDU SPACE FIELD MAP76数据定义伪指令1.DCB:标号 DCB 表达式 说明:DCB用于分配一块字节单元并用伪指令中指定的表达式进行初始化。其中,表达式可以为使用双引号的字符串或0255的数字,DCB可用“=”代替。2.DCW/DCWU:标号 DCW/DCWU 表达式 说明
49、:DCW分配一段半字存储单元并用表达式值初始化,它定义的存储空间是半字对齐的。77数据定义伪指令3.DCD/DCDU:标号 DCD/DCDU 表达式 说明:DCD伪指令用于分配一块字存储单元并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。DCD也可用“&”代替。4.DCQ/DCQU:标号 DCQ/DCQU 表达式 说明:DCQ用于分配一块以8个字节为单位的存储区域并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。DCQU功能跟DCQ类似,只是分配的存储单元不严格字对齐。78数据定义伪指令5.DCFD/DCFDU:标号DCFD/DCFDU 表达式 说明:DCFD用于为双精度
50、的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的,每个双精度的浮点数占据两个字单元。DCFDU功能跟DCFD类似,只是分配的存储单元不严格字对齐。6.DCFS/DCFSU:标号DCFS/DCFSU 表达式 说明:DCFS用于为单精度的浮点数分配一片连续的字存储单元并用表达式初始化,它定义的存储空间是字对齐的,每个单精度浮点数使用一个字单元.DCFSU功能跟DCFS类似,只是分配的存储单元不严格字对齐。79数据定义伪指令7.SPACE:标号 SPACE表达式 说明:SPACE用于分配一片连续的存储区域并初始化为0,表达式为要分配的字节数,SPACE也可用