




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
参考资料:1. Richard Blum,Professional Assembly Language2. GNU ARM 汇编快速入门,/u/31996/showart.php?id=3261463. ARM GNU 汇编伪指令简介,/jb8164/archive/2008/01/22/41661.aspx4. GNU汇编使用经验,/u1/37614/showart_390095.html5. GNU的编译器和开发工具,/blog-htm-do-showone-uid-34335-itemid-81387-type-blog.html6. 用GNU工具开发基于ARM的嵌入式系统,/liren0126/blog/static/32897598200821211144696/7. objcopy命令介绍,/junhua198310/archive/2007/06/27/1669545.aspx从网上找到一些关于ARM伪指令的资料,现整理如下:一. Linux汇编行结构任何汇编行都是如下结构:: comment: 注释Linux ARM 汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要在一行的开始。【例1】定义一个add的函数,返回两个参数的和。.section .text, “x”.global add give the symbol add external linkageadd:ADD r0, r0, r1 add input argumentsMOV pc, lr return from subroutine end of program1. LDRLDR R0, =0X3FF5000 ;伪指令,把0X3FF5000这个地址送给R0LDR R0, 0XFF ; 把立即数0xff送给R0LDR R0, =&FF ; &相当于0XBIC R0, R0, #%1011 ;.#表示立即数,%表示二进制LDR R1, =0x3ff5000 ;伪指令 R1=0X3FF5000LDR R1, 0x3ff5000 ;存储器访问指令 R1= 0x3ff50002. adr与ldr比较adr r0, InitSystem ;ldr r1, =InitSystem ;伪指令adr r0,InitSystem 编译时汇编成:sub r0,PC,#offset to InitSystemLDR r1,=InitSystem ,这种方式读取的地址值在连接时已经被固定了,这种代码不是位置无关的。遇到LDR伪指令时,汇编编译器将该地址值保存到一个缓冲区(literal pool)中,然后将该LDR 伪指令处理成一条基于PC到该数据缓冲区单元的LDR 指令,从而将该地址值读取到寄存器总,这时,要求该数据缓冲区到PC的距离小于4KB。如果该目标地址值为一个外部地址值或者不在本数据段内,则汇编译器在目标文件中插入一个地址重定位伪操作,当连接器进行连接时生成该地址值。LDR r1,=InitSystem 汇编成:LDR R1,PC,#offset to Litpool1-adr用来加载地址,例如adr r0,var1ldr用来加载地址处的内容,例如ldr r0,var1上面的这种语法只能从.text段中加载但ldr r0,=var1可从任意段中加载地址ldr有伪指令和非伪指令,伪指令后面的立即数前加=ADR在编译时会被替换成一条add或者sub指令,如果替换不了则报错。相对PC寻址ADRL会被替换成两条指令,替换不了报错误。相对PC或者积存器寻址这两条指令依据立即数的对齐方式不同,允许的立即数范围也不同。LDR则是产生文字池的方式加载常量,基于PC的相对寻址,专用加载32bit立即数.通过反汇编可以很容易看出LDR和ADR区别:假设入口点地址为0x8000AREA LDRlabel, CODE, READONLYENTRY ; Mark first instruction to executestartBL func1 ; Branch to first subroutinestopMOV r0, #0x18 ; angel_SWIreason_ReportExceptionLDR r1, =0x20026 ; ADP_Stopped_ApplicationExitLDR r1,=0xffSWI 0x123456 ; ARM semihosting SWIfunc1LDR r0, =start ; = LDR R0,PC, #offset to Litpool 1ADR r2,startLDR r1, =Darea +12 ; = LDR R1,PC, #offset to Litpool 1ADR r3,Darea+12MOV pc,lr ; ReturnLTORG ; Literal Pool 1Darea SPACE 8000 ; Clears a 8000 byte area of memory,; starting at the current location,; to zero.END反汇编后:start 0xeb000003 bl func1stop 0xe3a00018 mov r0,#0x1800008008 0xe59f1018 ldr r1,0x00008028 ; = #0x000200260000800c 0xe3a010ff mov r1,#0xff00008010 0xef123456 swi 0x123456func1 0xe59f0010 ldr r0,0x0000802c ; = #0x0000800000008018 0xe24f2020 sub r2,pc,#0x20 ; #0x80000000801c 0xe59f100c ldr r1,0x00008030 ; = #0x0000804000008020 0xe28f3018 add r3,pc,#0x18 ; #0x804000008024 0xe1a0f00e mov pc,r1400008028 0x00020026 dcd 0x00020026&.0000802c 0x00008000 dcd 0x00008000.00008030 0x00008040 dcd 0x00008040.Darea 0x00000000 dcd 0x00000000.00008038 0x00000000 dcd 0x00000000.0000803c 0x00000000 dcd 0x00000000.00008040 0x00000000 dcd 0x00000000.00008044 0x00000000 dcd 0x00000000.3. MOVMOV加载8位立即数8位立即数即第2操作数,必须可由一个8位常数循环移位偶数位得到,如0xf0000000,0xf00000001都是合法的4. 数据回写例如:ldr r0,r1!stmdb sp!,r0,r4!用于前索引方式中表示数据回写,例如:ldr r0,r1,#4!后索引方式不用!, 数据始终回写,例如:ldr r0,r1,#4对堆栈方式中用!, 表示堆栈自动增加或者减少访问内存的LDR/STR指令索引方式ldr r0,r1,#4前索引, 先加ldr r0,r1,#4后索引, 后加5. DCD和SPACEDCD分配一个地址并初始化为指定的表达式如 DCD 0x8000就是分配一个32位的地址,其内容是0x8000如果用上标号label,那么这个label相当于一个变量,如label DCD 0X8000这样引用label就是使用了0x8000这个数值。SPACE分配一段指定长度的内存空间并初始化为0如label SPACE 0x8000就是分配一段长度为0x8000的空间,并初始化为0Data1 DCD 1,2,3Data2 SPACE 12反汇编后的结果:Data1 0x00000001 dcd 0x00000001 .00008040 0x00000002 dcd 0x00000002 .00008044 0x00000003 dcd 0x00000003 .Data2 0x00000000 dcd 0x00000000 .0000804c 0x00000000 dcd 0x00000000 .00008050 0x00000000 dcd 0x00000000 .6. LTORG与LDRLTORG是与LDR联合使用的literal pool,可以在函数尾部声明, 这样相对PC偏移最少, 如果不用LTORG, 则编译器自动在(整个)程序末尾声名,但这样偏移有可能太大而编译不通过.ARM立即数,LDR和MOV的区别Mov是把立即数赋给一个寄存器,但对立即数的范围有要求。只能是由8bit连续有效位通过偶数次移位能得到的数。如果立即数超出这个范围,就没办法用一条MOV指令给寄存器赋值。LDR除了普通的读数之外,也有给寄存器赋立即数的功能。你只要写LDRR0,=0xabcdef它没有立即数范围的限制。因为这是一条伪指令。如果立即数在MOV的要求内,那就用一条汇编来实现。如果不在Mov的范围内,就用其它方式实现,如变成两条指令,或从PC偏移地址读一个32位数给寄存器。MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器从本质上是寄存器到寄存器的传递,为什么会有立即数,其实也是有限制的立即数,不是所有立即数都可以传递的这个立即数要符合一个8位数循环右移偶数位的取值原因是,MOV本身就是一条32bit指令,除了指令码本身,它不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值x2),8bit用来表示要移位的一个基数。还有一点是关于ldr的,其实ldr可以装载一个32bit立即数的说法并不确切,因为实际上并不是这一条语句装载了一个32bit立即数,比如ldrr1,=0x12345678其实真正的汇编代码是将某个地址的值传递给r1,就是说需要一个地址存放0x12345678这个立即数,实际上可以看作是一条伪指令而且如果这个立即数可以用mov指令的形式来表达,会被编译器实际用mov来代替比如:ldrr1,=0x10会变成movr1,#0x10ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。想把数据从内存中某处读取到寄存器中,只能使用ldr。比如:ldrr0,0x12345678就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:ldrr0,=0x12345678这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。LDR 的两种用法1)LDR pc, =MyHandleIRQ 表示将MyHandleIRQ符号放入pc寄存器中2)LDR PC,MyHandleIRQ 表示将读取存储器中MyHandleIRQ符号所表示的地址中的值,及需要多读一次存储器。LDRR1,=COUNT这条伪指令,是怎样完成将COUNT的地址赋给R1,有兴趣的可以看它编译后的结果。这条指令实际上会编译成一条LDR指令和一条DCD伪指令。 ldr伪指令和ldr指令不是一个同东西。LDR 和STR用于字和无符号字节指令格式:LDR/STRcondT Rd,LDR/STRcondBT Rd, LDRcondT Rd, 加载指定地址的字数据到Rd中;STRcondTRd,存储Rd中的字数据到指定的地址单元中;LDRcondBTRd, 指令加载指定地址的字节数据到Rd的的最低字节中(Rd的高24位清零);STRcondBTRd, 指令存储Rd中的最低字节数据到指定的地址单元中。 T为可选后缀,若有T,那么即使处理器是在特权模式下,存储系统也将访问看成处理器是在用户模式下,T 在用户模式下无效,不能与前索引偏移一起使用T。地址部分可用的形式有4种: 零偏移(zero offset) Rn ,Rn的值作为传送数据的地址。如: LDR R0,R1; 前索引偏移(pre-indexed offset) Rn,Flexoffset! 在数据传送之前,将偏移量Flexoffset加到Rn 中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn 中,且Rn 不允许是R15,如: LDRB R0,R1,#8LDR R0,R1,#8! 程序相对偏移(program relative) label(label 必须是在当前指令的土4KB 范围内) 。 程序相对偏移是前索引形式的另一种版本。从PC 计算偏移量,并将PC 作为Rn 生成前索引指令,不能使用后缀“!”,如: LDR R0,place ;place地址装入R0 后索引偏移(post-indexed offset) Rn,Flexoffset。在数据传送后,将偏移量Flexoffset 加到Rn 中,结果写回到Rn,Rn 不允许是R15,如: LDR R0,R1,R2,LSL2 ;将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1R24写入R1。偏移量Flexoffset可以是下两种形式之:1) 取值范围是-4095 到+4095 的整数的表达式,经常是数字常量,如:STR R5,R7,#-8 2) 一个寄存器再加上移位(移位由立即数指定),如:-Rm,shift 其中: - :可选负号。若带符号“一”,则从Rn 中减去偏移量。否则,将偏移量加到Rn 中。Rm :内含偏移量的寄存器。Rm 不允许是R15。 Shift:Rm 的可选移位方法。可以是下列形式的任何一种: ASR n :算术右移n 位(1=n=32) LSL n :逻辑左移n 位(1=n=31) LSR n :逻辑右移n 位(1=n=32) ROR n :循环右移n 位(1=n=31) RRX :循环右移1 位,带扩展。 逻辑与操作指令指令格式:ANDcondS Rd,Rn,operand2 AND指令将操作数operand2 与Rn 的值按位逻辑与,结果存放到目的寄存器Rd 中。若设置S,则根据运算结果影响、位,在计算第二操作数时,更新位,不影响位(指令ORR、EOR、BIC 对标志位的影响同AND 指令)。指令示例:ANDS R1,R1,R2 ;R1=R1&R2,并根据运算的结果更新标志位AND R0,R0,#0x0F ;R0=R0&0x0F,取出R0最低位数据。逻辑或操作指令指令格式:condS Rd,Rn,operand2 指令将操作数operand2 与Rn 的值按位逻辑或,结果存放到目的寄存器Rd 中。指令示例: ORRS R1,R1,R2 ;R1=R1|R2,并根据运算的结果更新标志位ORR R0,R0,#0x0F ;R0=R0|0x0F,将最低位置,其余位不变。 位清除指令指令格式:condS Rd,Rn,operand2 指令将Rn 的值与操作数operand2 的反码按位逻辑与,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将最低位清零,其余位不变。比较指令 指令格式:CMPcond Rn,operand2 指令用Rn的值减去操作数operand2 ,并将结果的状态(Rn 与operand2比较是大、小、相等)反映在中,以便后面的指令根据条件标志决定程序的走向。指令与指令完成的操作一样,只是指令只减,不存结果。 指令示例: cmp R0,R1 ;比较R0,R1 beq stop ;R0=R1跳到stopblt less ;R0R1跳到Less . . . Less:. . . Stop: .减法运算指令指令格式:condS Rd,Rn,operand2 指令用Rn 的值减去操作数operand2 ,并将结果存放到目的寄存器Rd 中。 指令示例: SUBS R1,R1,R2 ;R1=R1-R2,并并根据运算的结果更新标志位SUBGT R3,3,#1 ;大于则 R3=R3- SUB R0,R2,R3,LSL#; R0=R2-(R32)ARM分支指令助记符说明操作Bcond lable 分支指令 lable BLcond lable 带链接的分支指令 ,lable BXcond Rm 带状态切换的分支指令 Rm,切换处理器状态指令的条件码条件码助记符后缀标志含义0000EQZ置位(Z=1)相等0001NEZ清零(Z=0)不相等0010CSC置位无符号数大于等于0011CCC清零无符号数小于0100MIN置位负数0101PLN清零整数或00110VSV置位溢出0111VCV清零未溢出1000HIC置位且Z清零无符号数大于1001LSZ置位且C清零无符号数小于等于1010GEN等于V(N=V=1或N=V=0)带符号数大于或等于1011LTN不等于V带符号数小于1100GTZ清零且N等于V带符号数大于1101LEZ置位或N不等于V带符号数小于或等于1110AL忽略无条件执行;GPIO寄存器宏定义GPFCON EQU 0x56000050 GPF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 风电塔筒水性面漆项目可行性研究报告
- 防火隔离带项目可行性研究报告
- 电容储能技术项目可行性研究报告
- 2026年高考语文总复习文言文专题-教师版-古代文化常识(复习讲义)
- 投资与资产管理公司合同付款管理办法
- 新材料产业市场前景预测
- 美食文化节市场推广方案
- 防护知识培训内容课件
- 企业施工合同8篇
- 环卫公司劳动合同3篇
- 2025年度全国保密教育线上培训考试题库及答案(完整版)
- 预防交通事故知识培训课件
- 题型专攻:平行线分线段成比例【八大题型】(原卷版)
- 个人车辆租车合同4篇
- 宠物洗澡美容免责协议书
- 2025-2026学年广美版(2024)小学美术三年级上册教学计划及进度表
- 二手乐器平台竞争格局-洞察及研究
- 教科版(2024)九年级上册物理教学计划含进度表
- 送气工配送管理制度
- 人教版物理九年级上册全册PPT课件
- 名词性从句公开课
评论
0/150
提交评论