- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ARM汇编指令对比记忆(整理).
参考资料:
1. Richard Blum,Professional Assembly Language
2. GNU ARM 汇编快速入门,/u/31996/showart.php?id=326146
3. ARM GNU 汇编伪指令简介,/jb8164/archive/2008/01/22/41661.aspx
4. GNU汇编使用经验,/u1/37614/showart_390095.html
5. GNU的编译器和开发工具,/blog-htm-do-showone-uid-34335-itemid-81387-type-blog.html
6. 用GNU工具开发基于ARM的嵌入式系统,/liren0@126/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 linkage
add:
ADD r0, r0, r1 @ add input arguments
MOV pc, lr @ return from subroutine
@ end of program
1. LDRLDR R0, =0X3FF5000 ;伪指令,把0X3FF5000这个地址送给R0?LDR R0, 0XFF?????? ; 把立即数0xff送给R0LDR R0, =FF?????? ; 相当于0X?BIC R0, R0, #%1011 ;.#表示立即数,%表示二进制
LDR R1, =0x3ff5000??? ;伪指令 R1=0X3FF5000LDR R1, 0x3ff5000???? ;存储器访问指令 R1= [0x3ff5000]2. adr与ldr比较adr r0, InitSystem? ;ldr r1, =InitSystem ;伪指令adr r0,InitSystem 编译时汇编成:sub r0,PC,#offset to InitSystem
LDR r1,=InitSystem ,这种方式读取的地址值在连接时已经被固定了,这种代码不是位置无关的。遇到LDR伪指令时,汇编编译器将该地址值保存到一个缓冲区(literal pool)中,然后将该LDR 伪指令处理成一条基于PC到该数据缓冲区单元的LDR 指令,从而将该地址值读取到寄存器总,这时,要求该数据缓冲区到PC的距离小于4KB。如果该目标地址值为一个外部地址值或者不在本数据段内,则汇编译器在目标文件中插入一个地址重定位伪操作,当连接器进行连接时生成该地址值。LDR r1,=InitSystem 汇编成:LDR R1,[PC,#offset to Litpool1]------------------------------------------------------adr用来加载地址,例如adr r0,var1?ldr用来加载地址处的内容,例如ldr r0,var1?上面的这种语法只能从.text段中加载但ldr r0,=var1可从任意段中加载地址
ldr有伪指令和非伪指令,伪指令后面的立即数前加=?ADR在编译时会被替换成一条add或者sub指令,如果替换不了则报错。相对PC寻址?ADRL会被替换成两条指令,替换不了报错误。相对PC或者积存器寻址?这两条指令依据立即数的对齐方式不同,允许的立即数范围也不同。?LDR则是产生文字池的方式加载常量,基于PC的相对寻址,专用加载32bit立即数.?通过反汇编可以很容易看出LDR和ADR区别:?假设入口点地址为0x8000?AREA LDRlabel, CODE, READONLY?ENTRY ; Mark first instruction to execute?start?BL func1 ; Branch to first subroutine?stop?MOV r0, #0x18 ; angel_SWIreason_ReportException?LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit?LDR r1,=0xff?SWI
文档评论(0)