- 1、本文档共52页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
汇编语言都具有一些相同的基本特征。
① 一条指令一行
② 使用标号(label)给内存单元提供名称,从第1列开始书写
③ 指令必须从第2列或能区分标号的地方开始书写
④ 注释跟在指定的注释字符后面(ARM使用的是“;”),一直书写到行尾。
ARM汇编语言基本的的语句格式如下:
?
{symbol} {instruction |directive | pseudo-instruction} {;comment}
符号 指令、伪操作或伪指令 [; 注释] ;① 符号由大小写字母、数字及下画线组成,符号不能用数字开头。
② 符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。
③ 符号在其作用范围内必须唯一。
④ 自定义的符号名不能与系统的保留字相同。
⑤ 符号名不应与指令或伪指令同名。
;伪操作(Directive)是ARM汇编语言程序里的一些特殊的指令助记符
作用主要是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运行期间由处理器执行。
不同的编译程序所使用的伪操作有所不同。
;两种常见的ARM编译开发环境;ARM汇编语言伪操作;伪指令是ARM处理器支持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机器执行,只是在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。
;ARM汇编语言伪指令;在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
ADR伪指令中的地址是基于PC或寄存器的,当ADR伪指令中的地址是基于PC时,该地址与ADR伪指令必须在同一个代码段中。
地址表达式expr的取值范围如下:
当地址值是字节对齐时,其取指范围为?255B~255B;
当地址值是字对齐时,其取指范围为?1020B~1020B。;ARM伪指令——小范围的地址读取; ...
0x20 ADD r1,pc,#0x3c
...
...
0x64 MOV r0,r14
...;ARM伪指令——小范围的地址读取;ARM伪指令——小范围的地址读取;ADRL比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。
地址表达式expr的取值范围如下:
当地址值是字节对齐时,其取指范围为?64KB~64KB;
当地址值是字对齐时,其取指范围为?256KB~256KB。
示例:?
LOOP MOV r0,#10 ; LOOP为行标,指示某一行代码
ADRL r4,LOOP ; 将LOOP地址放入r4(相对地址)
因为PC值为当前指令地址值加8字节,替换成本ADR伪指令将被编译器编译为
SUB r4,PC,#0xc
NOP (MOV r0,r0)
;ARM伪指令——中等范围的地址读取;ARM伪指令——中等范围的地址读取;ARM伪指令——中等范围的地址读取;在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。
示例:
LDR r1,=0xff ; 将0xff读取到r1中
; 编译后得到MOV r1,0xff
示例:
LDR r1, =ADDR ; 将外部地址ADDR读取到R1中?
汇编后将得到:
LDR r1,[PC,OFFSET_TO_LPOOL]
…
LPOOL DCD ADDR
;符号定义伪操作主要用于ARM汇编程序中定义变量,对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种:
① 用于定义全局变量的GBLA、GBLL以及GBLS。
② 用于定义局部变量的LCLA、LCLL以及LCLS。
③ 用于对变量赋值的SETA、SETL以及SETS。
④ 为一个协处理器定义名称用CP。
⑤ 为一个通用寄存器列表定义别名用RLIST。
;;数据定义伪操作一般用于特定的数据分配存储单元,同时可完成已匹配存储单元的初始化。常见的数据定义伪操作有如下几种:
① DCB/W/D 用于分配一片连续字节存储单元并用指定的数据初始化,其中B表示byte,W表示半字(word),D表示字长(double),在ARM处理器里即4个字节。
② MAP用于定义一个结构化的内存表首地址,与FIELD配合使用。
③ FIELD用于定义
文档评论(0)