资源描述:
《ARM汇编学习笔记》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、ARM汇编学习笔记[转] 1、ARM汇编的格式: 在ARM汇编里,有些字符是用来标记行号的,这些字符要求顶格写;有些伪码是需要成对出现的,例如ENTRY和END,就需要对齐出现,也就是说他们要么都顶格,要么都空相等的空,否则编译器将报错。常量定义需要顶格书写,不然,编译器同样会报错。 2、字符串变量的值是一系列的字符,并且使用双引号作为分界符,如果要在字符串中使用双引号,则必须连续使用两个双引号。 3、在使用LDR时,当格式是LDRr0,=0x022248,则第二个参数表示地址,即0x022248,同样的,当src变量代表一个数组时,需要将r0寄存器指向src则
2、需要这样赋值:LDRr0,=src 当格式是LDRr0,[r2],则第二个参数表示寄存器,我的理解是[]符号表示取内容,r2本身表示一个寄存器地址,取内容候将其存取r0这个寄存器中。 4、在语句:(大于等于都会跳转) CMPr0,#num BHSstop 书上意思是:如果r0寄存器中的值比num大的话,程序就跳转到stop标记的行。但是,实际测试的时候,我发现如果r0和num相等也能跳转到stop标记的行,也就是说只要r0小于num才不会跳转。 下面就两个具体的例子谈谈ARM汇编(这是我昨天好不容易看懂的,呵呵)。 第
3、一个是使用跳转表解决分支转移问题的例程,源代码如下(保存的时候请将文件后缀名改为s): AREAJumpTest,CODE,READONLY CODE32numEQU4ENTRYstart MOVr0,#4 MOVr1,#3 MOVr2,#2 MOVr3,#0 CMPr0,#num BHSstop ADRr4,JumpTable CMPr0,#2 MOVEQr3,#0 LDREQpc,[r4,r3,LSL#2] CMPr0,#3 MOVEQr3,#1 L
4、DREQpc,[r4,r3,LSL#2] CMPr0,#4 MOVEQr3,#2 LDREQpc,[r4,r3,LSL#2] CMPr0,#1 MOVEQr3,#3 LDREQpc,[r4,r3,LSL#2]DEFAULT MOVEQr0,#0SWITCHENDstop MOVr0,#0x18 LDRr1,=0x20026 SWI0x123456JumpTable DCDCASE1 DCDCASE2 DCDCASE3 DCDCASE4 DCDDEFAULTC
5、ASE1 ADDr0,r1,r2 BSWITCHENDCASE2 SUBr0,r1,r2 BSWITCHENDCASE3 ORRr0,r1,r2 BSWITCHENDCASE4 ANDr0,r1,r2 BSWITCHENDEND 程序其实很简单,可见我有多愚笨!还是简要介绍一下这段代码吧。首先用AREA伪代码加上CODE,表明下面引出的将是一个代码段(于此相对的还有数据段DATA),ENTRY和END成对出现,说明他们之间的代码是程序的主体。start段给寄存器初始化。ADRr4,JumpTable一句是将相
6、当于数组的JumpTable的地址付给r4这个寄存器。 stop一段是用来是程序退出的,第一个语句“MOVr0,#0x18”将r0赋值为0x18,这个立即数对应于宏angel_SWIreason_ReportException。表示r1中存放的执行状态。语句“LDRr1,=0x20026”将r1的值设置成ADP_Stopped_ApplicationExit,该宏表示程序正常退出。然后使用SWI,语句“SWI0x123456”结束程序,将CPU的控制权交回调试器手中。 在JumpTable表中,DCD类型的数组包含四个字,所以,当实现CASE跳转的时候,需要将给出的索
7、引乘上4,才是真正前进的地址数。 再看一个用汇编实现冒泡排序的例程: AREASort,CODE,READONLYENTRYstart MOVr4,#0 LDRr6,=src ADDr6,r6,#lenouter LDRr1,=srcinner LDRr2,[r1] LDRr3,[r1,#4] CMPr2,r3 STRGTr3,[r1] STRGTr2,[r1,#4] ADDr1,r1,#4 CMPr1,r6 BLTinn