• FreeRTOS中汇编指令


    汇编程序前要加PRESERVE8

    require8和preserve8c和汇编有8位对齐的要求,这两个伪指令能够满意此要求

    LDR和MOV

    LDR Rn, label1

    LDR指令负责将label1所代表的存储器中数据搬移到内部寄存器Rn中。指令使用方式有:

    LDR R0,[R1] ;

    R1中代表存储器地址,在存储器中将R1地址处的数据加载到寄存器R0中。

    LDR R0,=0x00000040 ;

    将立即数装入R0中,如果立即数小,该指令等效 MOV R0,#64,如果立即数很大比如占据32bit,那么该指令将变成伪指令,见下条。

    LDR R0,=0xF0000000 ;

    立即数很大,无法将立即数和指令合并成32bit,指令会被编译器拆分为LDR R0, [PC, #offset]; .word 0xF00000000两条指令,即先将立即数利用.word指令存储在该LDR指令附近,编译器计算立即数与当前正在执行指令PC(program counter)指针的偏差offset,注意ARM是流水线指令,采用取指令,译指令和执行指令。

    LDR R0,label;

    将label标号所代表的寄存器地址中数据装在到R0。

    STR

    STR{条件}  源寄存器,<存储器地址>
    STR指令用亍从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常
    用,丏寻址方式灵活多样,使用方式可参考指令LDR。

    指令示例:
    STR R0,[R1],#8             ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
    STR R0,[R1,#8]             ;将R0中的字数据写入以R1+8为地址的存储器中。”

    MSR

    MRS R0,CPSR     ;        读取CPSR
    BIC R0,R0,#0x1F ;        修改,去除当前处理器模式
    ORR R0,R0,#0x13 ;        修改,设置特权模式
    MSR CPSR_c, R0  ;        写回,仅仅修改CPSR中的控制位域

    ldmia与stmdb

    ldmia r0!, {r4-r11, r14}  的意思是

    LDMIA 中的 I 是 increase 的缩写,A 是 after 的缩写,LD加载(load)的意思
    R0后面的感叹号“!表示会自动调节 R0里面的指针
    所以整句话意思是任务栈R0的存储地址由低到高,将R0存储地址里面的内容手动加载到 CPU 寄存器 R0,R4-R12里

    还有一种是STMDB R1!, {R0,R4-R12} 这就和上面反过来了,ST是存储(store)的意思,D是decrease的意思,B是before的意思,整句话就是R1的存储地址由高到低递减,将R0,R4-R12里的内容存储到R1任务栈里面。

    stmdb:db(decrease before)表示先减后存。

    指令 stmdb sp!, { fp, ip, lr, pc}  %% "!”表示sp等于最终被修改的sp的值。

    假设 sp=4096,此条指令的执行过程如下:

    1.先减:sp=sp-4=4092;

    2.后存:4092-4095处存放pc的值;

    3.先减:sp=sp-4=4088;

    4.后存:4088-4091处存放lr寄存器的值;

    以此类推,..........。

    ldmia:ia(increase after)表示先读后增。

    指令ldmia sp, {fp,sp, pc}

    假设 sp=4080,此条指令的执行过程如下:

    1.先读:fp位于4080-4083处存放原来保存的fp;

    2.后增:sp=sp+4=4084;

    3.先读:sp位于4084-4087处存放原来保存的ip;

    4.后增:sp=sp+4;

    cps

    cpsie i        开启IQR中断,cpsid是关闭
    cpsie f        开启FQR中断(快速中断),cpsid是关闭
    dsb             
    isb

    指令名

    功能描述

    DMB

    数据存储器隔离。DMB 指令保证: 仅当所有在它前面的存储器访问操作

    都执行完毕后,才提交(commit)在它后面的存储器访问操作。

    DSB

    数据同步隔离。比 DMB 严格: 仅当所有在它前面的存储器访问操作

    都执行完毕后,才执行在它后面的指令(亦即任何指令都要等待存储器访 问操作——译者注)

    ISB

    指令同步隔离。最严格:它会清洗流水线以保证所有它前面的指令都执

    行完毕之后,才执行它后面的指令。

    svc

    /* 调用 SVC 去启动第一个任务 */
    svc 0

    nop

    空操作

    ORR

    ORR指令的格式为: ORR{条件}{S}  目的寄存器,操作数1,操作数2

    ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。

    操作数1应是一 个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

    操作数2为32位的掩码,如果在掩码中置了某一位1,则将这一位置1。未设置的掩码位保持不变。

    B BL BX BLX

    (1) B 跳转指令

    (2) BL 带返回的跳转指令

    (3) BLX 带返回和状态切换的跳转指令

    (4) BX 带状态切换的跳转指令

    X 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。因此可以将处理器的工作状态有ARM 状态切换到Thumb 状态

  • 相关阅读:
    15 轮转数组
    python爬虫(数据获取——双R)
    JAVA学习笔记
    短信验证码接口风险分析
    Spring Data Commons远程命令执行漏洞复现(CVE-2018-1273)
    RestTemplate:简化HTTP请求的强大工具
    噪声系数分析仪---TFN ZF9000A
    Python常用基础语法知识点大全合集,看完这一篇文章就够了
    Java SE 10 Application Class-Data Sharing 示例
    VMware 在 win10 上挂起后无法正常恢复的问题解决
  • 原文地址:https://blog.csdn.net/weever7/article/details/126505013