ARM汇编学习笔记.doc

  1. 1、本文档共84页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
这两天参加了一个编写操作系统的项目,因为要做很多底层的东西,而且这个操作系统是嵌入式的,所以开始学习ARM汇编,发现ARM汇编和一般PC平台上的汇编有很多不同,但主要还是关键字和伪码上的,其编程思想还是相同的。现将一些学习感悟部分列出来,希望能给有问题的人一点帮助。 ??? 1、ARM汇编的格式: ??? 在ARM汇编里,有些字符是用来标记行号的,这些字符要求顶格写;有些伪码是需要成对出现的,例如ENTRY和END,就需要对齐出现,也就是说他们要么都顶格,要么都空相等的空,否则编译器将报错。常量定义需要顶格书写,不然,编译器同样会报错。 ??? 2、字符串变量的值是一系列的字符,并且使用双引号作为分界符,如果要在字符串中使用双引号,则必须连续使用两个双引号。 ??? 3、在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同样的,当src变量代表一个数组时,需要将r0寄存器指向src则需要这样赋值:LDR r0,=src???? 当格式是LDR r0,[r2],则第二个参数表示寄存器,我的理解是[]符号表示取内容,r2本身表示一个寄存器地址,取内容候将其存取r0这个寄存器中。 ??? 4、在语句: ?????? CMP r0,#num ?????? BHS stop ?????? 书上意思是:如果r0寄存器中的值比num大的话,程序就跳转到stop标记的行。但是,实际测试的时候,我发现如果r0和num相等也能跳转到stop标记的行,也就是说只要r0小于num才不会跳转。 ??? ???? 下面就两个具体的例子谈谈ARM汇编(这是我昨天好不容易看懂的,呵呵)。 ???? 第一个是使用跳转表解决分支转移问题的例程,源代码如下(保存的时候请将文件后缀名改为s):?? ????? AREA JumpTest,CODE,READONLY ????? CODE32 ?num? EQU? 4 ?ENTRY ? start ????? MOV? r0, #4 ????? MOV? r1, #3 ????? MOV? r2, #2 ????? MOV? r3, #0 ? ????? CMP? r0,? #num ????? BHS? stop ? ????? ADR? r4, JumpTable ? ????? CMP? r0, #2 ????? MOVEQ? r3, #0 ????? LDREQ? pc, [r4,r3,LSL #2] ? ????? CMP? r0, #3 ????? MOVEQ? r3, #1 ????? LDREQ? pc, [r4,r3,LSL #2] ? ????? CMP? r0, #4 ????? MOVEQ? r3, #2 ????? LDREQ? pc, [r4,r3,LSL #2] ? ????? CMP? r0, #1 ????? MOVEQ? r3, #3 ????? LDREQ? pc, [r4,r3,LSL #2] ? DEFAULT ????? MOVEQ? r0, #0 ? SWITCHEND stop ????? MOV? r0, #0x18 ????? LDR? r1, =0x20026 ????? SWI? 0x123456 ? JumpTable ????? DCD? CASE1 ????? DCD? CASE2 ????? DCD? CASE3 ????? DCD? CASE4 ????? DCD? DEFAULT ? CASE1 ????? ADD? r0, r1, r2 ????? B? SWITCHEND ? CASE2 ????? SUB? r0, r1, r2 ????? B? SWITCHEND ? CASE3 ????? ORR? r0, r1, r2 ????? B? SWITCHEND ? CASE4 ????? AND? r0, r1, r2 ????? B? SWITCHEND ?END ??? 程序其实很简单,可见我有多愚笨!还是简要介绍一下这段代码吧。首先用AREA伪代码加上CODE,表明下面引出的将是一个代码段(于此相对的还有数据段DATA),ENTRY 和END成对出现,说明他们之间的代码是程序的主体。start段给寄存器初始化。ADR? r4, JumpTable一句是将相当于数组的JumpTable的地址付给r4这个寄存器。 ??? stop一段是用来是程序退出的,第一个语句“MOV r0,#0x18”将r0赋值为0x18,这个立即数对应于宏angel_SWIreason_ReportException。表示r1中存放的执行状态。语句“LDR r1,=0x20026”将r1的值设置成ADP_Stop

文档评论(0)

yurixiang1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档