• ARM六种寻址方式的汇编实现


    AREA Example,CODE,READONLY
    ENTRY
    CODE32

    ;S 后缀:更新标志位CPSR
    ;!后缀:基址寄存器中的地址发生变化
    ;LDR 从存储器中加载数据到寄存器
    ;STR 从寄存器中加载数据到存储器

    ;立即寻址
    MOV R0 ,#2
    SUBS R0,R0,#2

    ;寄存器寻址
    MOV R2,#2
    MOV R1,R2

    ADDS R0,R1,R2;

    ;寄存器间接
    LDR R3,=0X40000000;LDR伪指令,把地址加载到寄存器里面去
    STR R0,[R3];0x40000000代表着一个存储器,把R0寄存器的内容,传送到0X40000000地址的存储器中
    ;以上步骤其实是设定0x40000000存放4

    LDR R4,[R3];寄存器间接其实是这一步 R3--->0x40000000----->4


    ;基址变址寻址
    LDR R4,=0X40000004
    STR R0,[R4]
    LDR R4,[R3,#0x04];把首地址加上偏移量得到数据的地址再寻址 R3------->0x40000000+4=0x40000004----->4

    ;堆栈寻址
    MOV R1,#1
    MOV R2,#2
    MOV R3,#3
    MOV R4,#4

    LDR SP,=0x40000000;堆栈首地址
    ;要注意0x40000000以上的地址才有效,用满递减的话,0x40000000开头,压进去一个,就变成0x3FFFFFFC了,数据会丢失


    ;一个个压栈
    ;满递增 压入一个 sp会加4
    STMFA SP!,{R1}
    STMFA SP!,{R2}
    STMFA SP!,{R3}
    STMFA SP!,{R4}
    ;或者STMFA SP!,{R1-R4}

    LDMFA SP!,{R7-R10};出栈,将数据放置到R7-R10中


    ;多寄存器寻址
    LDR R0,=0X40000000
    STR R1,[R0]
    STR R2,[R0,#4]
    STR R3,[R0,#8]
    STR R4,[R0,#12]

    LDMIA R0,{R5,R6,R11,R12}
    ;其实跟堆栈差不多
    ;就是把[R0]---->R1,R0+4]---->R2,[R0+8]---->R3,[R0+12]---->R4
    ;每隔一个参数就加4,但R0的基地址不变







    END

  • 相关阅读:
    webbrowser在vb中叫
    linux小记之安装bin或deb程序
    9011,9012,9013,9014,8050,8550三极管的区别
    中兴v880刷机全过程。原创亲测
    Slackware的启动(init)过程
    sysvinit
    rc.S 分析【转自CSDN 】
    linux 解压rar zip
    slackware启动脚本详解
    工作
  • 原文地址:https://www.cnblogs.com/wzben/p/5419452.html
Copyright © 2020-2023  润新知