zoukankan      html  css  js  c++  java
  • ARM汇编

    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,#numBHS stop书上意思是:如果r0寄存器中的值比num大的话,程序就跳转到stop标记的行。但是,实际测试的时候,我发现如果r0和num相等也能跳转到stop标记的行,也就是说只要r0小于num才不会跳转。下面就两个具体的例子谈谈ARM汇编(这是我昨天好不容易看懂的,呵呵)。第一个是使用跳转表解决分支转移问题的例程,源代码如下(保存的时候请将文件后缀名改为s):AREA JumpTest,CODE,READONLY
    CODE32
    numEQU4ENTRY

    start
    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
    LDREQpc, [r4,r3,LSL #2]

    CMPr0, #4
    MOVEQr3, #2
    LDREQpc, [r4,r3,LSL #2]

    CMPr0, #1
    MOVEQr3, #3
    LDREQpc, [r4,r3,LSL #2]

    DEFAULT
    MOVEQr0, #0

    SWITCHEND
    stop
    MOVr0, #0x18
    LDRr1, =0x20026
    SWI0x123456

    JumpTable
    DCDCASE1
    DCDCASE2
    DCDCASE3
    DCDCASE4
    DCDDEFAULT

    CASE1
    ADDr0, r1, r2
    BSWITCHEND

    CASE2
    SUBr0, r1, r2
    BSWITCHEND

    CASE3
    ORRr0, r1, r2
    BSWITCHEND

    CASE4
    ANDr0, r1, r2
    BSWITCHEND
    END
    程序其实很简单,可见我有多愚笨!还是简要介绍一下这段代码吧。首先用AREA伪代码加上CODE,表明下面引出的将是一个代码段(于此相对的还有数据段DATA),ENTRY 和END成对出现,说明他们之间的代码是程序的主体。start段给寄存器初始化。ADRr4, JumpTable一句是将相当于数组的JumpTable的地址付给r4这个寄存器。stop一段是用来是程序退出的,第一个语句“MOV r0,#0x18”将r0赋值为0x18,这个立即数对应于宏angel_SWIreason_ReportException。表示r1中存放的执行状态。语句“LDR r1,=0x20026”将r1的值设置成ADP_Stopped_ApplicationExit,该宏表示程序正常退出。然后使用SWI,语句“SWI 0x123456”结束程序,将CPU的控制权交回调试器手中。在JumpTable表中,DCD类型的数组包含四个字,所以,当实现CASE跳转的时候,需要将给出的索引乘上4,才是真正前进的地址数。再看一个用汇编实现冒泡排序的例程:AREA Sort,CODE,READONLY
    ENTRY

    start
    MOV r4,#0
    LDR r6,=src
    ADD r6,r6,#len

    outer
    LDR r1,=src

    inner
    LDR r2,[r1]
    LDR r3,[r1,#4]
    CMP r2,r3
    STRGT r3,[r1]
    STRGT r2,[r1,#4]
    ADD r1,r1,#4
    CMP r1,r6
    BLT inner

    ADD r4,r4,#4
    CMP r4,#len
    SUBLE r6,r6,#4
    BLE outer

    stop
    MOV r0,#0x18
    LDR r1,=0x20026
    SWI 0x123456

    AREA Array,DATA,READWRITE
    src DCD 2,4,10,8,14,1,20
    len EQU 7*4
    END
    用汇编实现循环需要跳转指令,但是因为ARM系统只有一个CPSR寄存器,所以要实现双重循环还是有些难度。上面这个代码还是有相当大的借鉴意义。程序不难读懂,和C语言的冒泡排序基本思路是完全一样的。



  • 相关阅读:
    lnmp+memcache+tomcat
    redis的主从搭建
    curl只取状态码
    Tomcat的优化
    pip9 安装 centos6.8
    文件的下载
    保存图片到图库更新图库
    上传图片总结
    Android 大图片预览ViewPager
    Android 软件盘 Editext 问题
  • 原文地址:https://www.cnblogs.com/feisky/p/1586456.html
Copyright © 2011-2022 走看看